diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..81e3deb365 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +* @krille-chan +assets/l10n/*.arb @weblate \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..402c3c7cf3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: krille +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: KrilleChritzelius +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..485bfd8c5c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,51 @@ +name: 🐛 Bug report +description: Create a report to help us improve +labels: bug +body: + - type: textarea + id: bug-description + attributes: + label: "Bug Description" + description: "A clear and concise description of what the bug is. Please add screenshots if you have as they usually help us a lot." + placeholder: "Describe the bug here..." + validations: + required: true + - type: textarea + id: reproduce-steps + attributes: + label: "Steps to Reproduce" + description: "Steps to reproduce the behavior:" + placeholder: "1. Go to '...'\n2. Click on '...'\n3. Scroll down to '...'\n4. See error" + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: "Expected Behavior" + description: "A clear and concise description of what you expected to happen." + placeholder: "Describe what you expected to happen here..." + validations: + required: true + - type: input + id: app-version + attributes: + label: "App Version" + description: "Please provide the version of the app you are using." + placeholder: "e.g. 1.12.0" + validations: + required: true + - type: input + id: platform-info + attributes: + label: "Additional Platform Information" + description: "Please provide the following information:" + placeholder: "Device: [e.g. iPhone6, PC, Pixel 3]\nOS: [e.g. iOS, Android, Windows, Linux, macOS]\nBrowser (if applicable): [e.g. Chrome, Safari]" + validations: + required: true + - type: textarea + id: additional-context + attributes: + label: "Additional Context" + description: "Add any other context about the problem here." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..780f692f7a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: 👬 FluffyChat Community + url: https://matrix.to/#/#fluffychat:matrix.org + about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..4007c88370 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,34 @@ +name: 💡 Feature Request +description: Suggest an idea for this project +labels: enhancement +body: + - type: textarea + id: feature-description + attributes: + label: "Feature Description" + description: "Provide a clear and concise description of the feature." + placeholder: "Describe the feature here..." + validations: + required: true + - type: textarea + id: rationale + attributes: + label: "Rationale" + description: "Explain why this feature should be added." + placeholder: "Describe the rationale for the feature here..." + validations: + required: true + - type: textarea + id: mockup + attributes: + label: "Mockup" + description: "If applicable, add any visual mock-ups of the feature." + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: "Additional Context" + description: "Add any other context or screenshots about the feature request here." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/test_report.md b/.github/ISSUE_TEMPLATE/test_report.md new file mode 100644 index 0000000000..9a7ed70281 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/test_report.md @@ -0,0 +1,41 @@ +--- +name: 📝 Test +about: A detailed protocol for testing all features +title: 'Test Report' +labels: test +--- + +1. App receives push notifications over Firebase Cloud Messaging when it is in background/terminated: + - [ ] Android + - [ ] iOS +2. App receives push notifications over Unified Push when it is in background/terminated: + - [ ] Android +3. Notifications for rooms, which are not in foreground, are working: + - [ ] Web + - [ ] Linux +4. QR Code scanner can still scan links to start a new chat: + - [ ] Android + - [ ] iOS +5. Recording and playing voice messages works: + - [ ] Android + - [ ] iOS + - [ ] Web (play only) +6. Sending and downloading files/images works: + - [ ] Android + - [ ] iOS + - [ ] Web + - [ ] Linux +7. Sharing texts/files/images from other apps to FluffyChat works: + - [ ] Android + - [ ] iOS +8. Login with single sign on works: + - [ ] Android + - [ ] iOS + - [ ] Web + - [ ] Linux +9. Test if the app lock works as intended and appears on opening/resuming the app: + - [ ] Android + - [ ] iOS +10. Drag&Drop to send a file into a chat still works: + - [ ] Web + - [ ] Linux diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..2b993ea050 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +version: 2 +updates: + - package-ecosystem: "pub" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "*" + commit-message: + prefix: "build: " + include: "scope" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "*" + commit-message: + prefix: "build: " + include: "scope" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..c925364273 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,21 @@ +*Thank you so much for your contribution to FluffyChat ❤️❤️❤️* + +Please make sure that your Pull Request meet the following **acceptance criteria**: + +- [ ] Code formatting and import sorting has been done with `dart format lib/ test/` and `dart run import_sorter:main --no-comments` +- [ ] The commit message uses the format of [Conventional Commits](https://www.conventionalcommits.org) +- [ ] The commit message describes what has been changed, why it has been changed and how it has been changed +- [ ] Every new feature or change of the design/GUI is linked to an approved design proposal in an issue +- [ ] Every new feature in the app or the build system has a strategy how this will be tested and maintained from now on for every release, e.g. a volunteer who takes over maintainership + + +### Pull Request has been tested on: + +- [ ] Android +- [ ] iOS +- [ ] Browser (Chromium based) +- [ ] Browser (Firefox based) +- [ ] Browser (WebKit based) +- [ ] Desktop Linux +- [ ] Desktop Windows +- [ ] Desktop macOS \ No newline at end of file diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml new file mode 100644 index 0000000000..ce96b903ca --- /dev/null +++ b/.github/workflows/integrate.yaml @@ -0,0 +1,93 @@ +name: Pull Request Workflow + +on: + pull_request: + merge_group: + +jobs: + code_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - run: flutter pub get + - run: flutter gen-l10n + - name: Check formatting + run: dart format lib/ test/ --set-exit-if-changed + - name: Check import formatting + run: dart run import_sorter:main --no-comments --exit-if-changed + - name: Check license compliance + run: dart run license_checker check-licenses -c licenses.yaml --problematic + - run: flutter analyze + - name: Apply google services patch + run: git apply ./scripts/enable-android-google-services.patch + - run: flutter analyze + - run: flutter test + + build_debug_apk: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: "zulu" + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - run: flutter pub get + - run: flutter build apk --debug + + build_debug_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - run: flutter build web + + build_debug_linux: + strategy: + matrix: + arch: [ x64, arm64 ] + runs-on: ${{ matrix.arch == 'arm64' && 'self-hosted' || 'ubuntu-latest'}} + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + - name: Install Flutter + run: | + git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git + ./flutter/bin/flutter doctor + - run: ./flutter/bin/flutter pub get + - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} + + build_debug_ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Setup Xcode version + uses: maxim-lobanov/setup-xcode@v1.6.0 + with: + xcode-version: latest + - run: brew install sqlcipher + - run: flutter pub get + - run: flutter build ios --no-codesign diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml new file mode 100644 index 0000000000..1a817f0060 --- /dev/null +++ b/.github/workflows/main_deploy.yaml @@ -0,0 +1,82 @@ +name: Main Deploy Workflow + +on: + push: + branches: + - main + workflow_dispatch: + +concurrency: + group: main_deploy + cancel-in-progress: true + +jobs: + deploy_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + - name: Remove Emoji Font + run: | + rm -rf fonts/NotoEmoji + yq -i 'del( .flutter.fonts[] | select(.family == "NotoEmoji") )' pubspec.yaml + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - name: Build Release Web + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/nightly/" + - run: mv build/web/ public + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + destination_dir: nightly + + deploy_playstore_internal: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: 'zulu' + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + - name: Install Fastlane + run: gem install fastlane -NV + - name: Apply Google Services Patch + run: git apply ./scripts/enable-android-google-services.patch + - name: Remove Emoji Font + run: | + rm -rf fonts/NotoEmoji + yq -i 'del( .flutter.fonts[] | select(.family == "NotoEmoji") )' pubspec.yaml + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - name: Build Android Release + run: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 + - name: Deploy Android Release + run: | + mkdir -p build/android + cp build/app/outputs/bundle/release/app-release.aab build/android/ + cd android + bundle install + bundle update fastlane + bundle exec fastlane deploy_internal_test + cd .. diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000000..aed76cd8ea --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,233 @@ +name: Release Workflow + +on: + release: + types: + - created + +concurrency: + group: release_workflow + cancel-in-progress: true + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install nodejs -y + - name: Remove Emoji Font + run: | + rm -rf fonts/NotoEmoji + yq -i 'del( .flutter.fonts[] | select(.family == "NotoEmoji") )' pubspec.yaml + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - name: Build Release Web + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/web/" + - name: Create archive + run: tar -czf fluffychat-web.tar.gz build/web/ + - name: Upload Web Build + uses: actions/upload-artifact@v4 + with: + name: Web Build + path: fluffychat-web.tar.gz + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: fluffychat-web.tar.gz + asset_name: fluffychat-web.tar.gz + asset_content_type: application/gzip + - name: Build Website + run: | + cd docs && npx tailwindcss -o ./tailwind.css --minify && cd .. + mv docs public + mv repo public || true + mv build/web/ public/web + cp public/web -r public/nightly + - name: Deploy to GitHub Pages + if: startsWith(github.ref, 'refs/tags/v') + uses: peaceiris/actions-gh-pages@v4 + with: + personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + cname: fluffychat.im + + build_apk: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: 'zulu' + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Apply Google Services Patch + run: git apply ./scripts/enable-android-google-services.patch + - name: Remove Emoji Font + run: | + rm -rf fonts/NotoEmoji + yq -i 'del( .flutter.fonts[] | select(.family == "NotoEmoji") )' pubspec.yaml + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - run: flutter build apk --release + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: build/app/outputs/apk/release/app-release.apk + asset_name: fluffychat.apk + asset_content_type: application/vnd.android.package-archive + + build_linux: + strategy: + matrix: + arch: [ x64, arm64 ] + runs-on: ${{ matrix.arch == 'arm64' && 'self-hosted' || 'ubuntu-latest'}} + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + - name: Install Flutter + run: | + git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git + ./flutter/bin/flutter doctor + - run: ./flutter/bin/flutter pub get + - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} + - name: Create archive + run: tar -czf fluffychat-linux-${{ matrix.arch }}.tar.gz -C build/linux/${{ matrix.arch }}/release/bundle/ . + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: fluffychat-linux-${{ matrix.arch }}.tar.gz + asset_name: fluffychat-linux-${{ matrix.arch }}.tar.gz + asset_content_type: application/gzip + + deploy_playstore: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: 'zulu' + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + - name: Install Fastlane + run: gem install fastlane -NV + - name: Apply Google Services Patch + run: git apply ./scripts/enable-android-google-services.patch + - name: Remove Emoji Font + run: | + rm -rf fonts/NotoEmoji + yq -i 'del( .flutter.fonts[] | select(.family == "NotoEmoji") )' pubspec.yaml + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - name: Build Android Release + run: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 + - name: Get Tag Name + id: tag_name + run: echo "::set-output name=tag::$(echo ${GITHUB_REF#refs/tags/})" + - name: Deploy Android Release + run: | + mkdir -p build/android + cp build/app/outputs/bundle/release/app-release.aab build/android/ + cd android + bundle install + bundle update fastlane + bundle exec fastlane deploy_internal_test + if [[ $GITHUB_REF_NAME == rc* ]]; then + bundle exec fastlane deploy_candidate + else + bundle exec fastlane deploy_release + fi + cd .. + + promote_snapcraft: + runs-on: ubuntu-latest + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }} + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Install Snapcraft + uses: samuelmeuli/action-snapcraft@v3 + - name: Get Tag Name + id: tag_name + run: echo "::set-output name=tag::$(echo ${GITHUB_REF#refs/tags/})" + - name: Promote Snap + env: # Workaround for https://github.com/snapcore/snapcraft/issues/4439 + SNAPCRAFT_HAS_TTY: "true" + run: | + if [[ $GITHUB_REF_NAME == rc* ]]; then + yes | snapcraft promote fluffychat --from-channel edge --to-channel candidate + else + yes | snapcraft promote fluffychat --from-channel edge --to-channel stable + fi + + deploy_docker: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/versions.env b/.github/workflows/versions.env new file mode 100644 index 0000000000..c0c442ad62 --- /dev/null +++ b/.github/workflows/versions.env @@ -0,0 +1,2 @@ +FLUTTER_VERSION=3.27.1 +JAVA_VERSION=17 diff --git a/.gitignore b/.gitignore index 2f82071eb5..0ce56e79e3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,10 @@ .buildlog/ .history .svn/ -lib/generated_plugin_registrant.dart prime # libolm package -/assets/js/package/* +/assets/js/package # IntelliJ related *.iml @@ -38,10 +37,7 @@ prime /build/ # Web related -lib/generated_plugin_registrant.dart -docs/build/ -docs/.jekyll-cache/ -docs/_site/ +docs/tailwind.css # Exceptions to above rules. !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages @@ -56,9 +52,11 @@ android/Gemfile.lock lib/l10n_old ios/Flutter/.last_build_id ios/Podfile.lock +ios/Runner.ipa /windows/out /winuwp/out /linux/out /macos/out .vs +olm diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 46abae8e82..0000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,363 +0,0 @@ -variables: - FLUTTER_VERSION: 3.0.2 - -image: cirrusci/flutter:${FLUTTER_VERSION} - -.shared_windows_runners: - tags: - - shared-windows - - windows - - windows-1809 - -stages: - - coverage - - release - - deploy - -code_analyze: - stage: coverage - script: [./scripts/code_analyze.sh] - artifacts: - reports: - codequality: code-quality-report.json - -code_analyze_beta: - extends: code_analyze - image: - name: cirrusci/flutter:beta - allow_failure: true - -test: - stage: coverage - script: [flutter test] - -integration_test: - image: registry.gitlab.com/famedly/company/frontend/flutter-dockerimages/integration/stable:${FLUTTER_VERSION} - stage: coverage - services: - - name: docker:dind - alias: docker - variables: - # activate container-to-container networking - FF_NETWORK_PER_BUILD: "true" - # Tell docker CLI how to talk to Docker daemon. - DOCKER_HOST: tcp://docker:2375/ - # Use the overlayfs driver for improved performance. - DOCKER_DRIVER: overlay2 - # Disable TLS since we're running inside local network. - DOCKER_TLS_CERTDIR: "" - before_script: - - chmod 777 -R /dev/kvm - - adb start-server - - emulator -avd test -no-audio -no-boot-anim -no-window -accel on -gpu swiftshader_indirect & - - apk update && apk add docker drill grep - - chown -R 991:991 integration_test/synapse - - docker run -d --name synapse --user 991:991 --network=host --volume="$(pwd)/integration_test/synapse/data":/data:rw -p 8008:8008 matrixdotorg/synapse:latest - - sleep 20 - # create three test user - - docker exec -i synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --user alice --password AliceInWonderland --admin - - docker exec -i synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --user bob --password JoWirSchaffenDas --admin - - docker exec -i synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --user trudy --password HaveIBeenPwned --admin - script: - # properly set the homeserver IP for the test - - sed -i "s/10.0.2.2/$(drill docker | grep -m 1 -P "\d+\.\d+\.\d+.\d+" | awk -F ' ' '{print $NF}')/g" integration_test/users.dart - - curl docker:8008/_matrix/static/ 2> /dev/null | grep "It works! Synapse is running" - - git apply ./scripts/enable-android-google-services.patch - - flutter pub get - - flutter test integration_test - tags: - - famedly - - docker - timeout: 20m - -build_web: - stage: coverage - before_script: - [sudo apt update && sudo apt install curl -y, ./scripts/prepare-web.sh] - script: [./scripts/build-web.sh] - artifacts: - paths: - - build/web/ - -build_web_beta: - extends: build_web - image: - name: cirrusci/flutter:beta - allow_failure: true - -build_windows: - extends: - - .shared_windows_runners - stage: coverage - before_script: [./scripts/prepare-windows.ps1] - script: [./scripts/build-windows.ps1] - artifacts: - paths: - - build/windows/runner/Release - allow_failure: true - -build_android_debug: - stage: coverage - script: [./scripts/build-android-debug.sh] - artifacts: - when: on_success - paths: - - build/app/outputs/apk/debug/app-debug.apk - except: - - main - - tags - -build_android_apk: - stage: coverage - before_script: [./scripts/prepare-android-release.sh] - script: [./scripts/build-android-apk.sh] - artifacts: - when: on_success - paths: - - build/android/app-release.apk - only: - - main - - tags - -build_android_appbundle: - stage: coverage - before_script: [./scripts/prepare-android-release.sh] - script: [./scripts/release-playstore-beta.sh] - artifacts: - when: on_success - paths: - - build/android/app-release.aab - resource_group: playstore_release - only: - - main - -upload-fdroid: - stage: release - before_script: - - "which ssh-agent || (sudo apt-get update -y && sudo apt-get install openssh-client -y )" - - "which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )" - - "which pcregrep || (sudo apt-get update -y && sudo apt-get install pcregrep -y )" - - eval $(ssh-agent -s) - - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - - mkdir -p ~/.ssh - - chmod 700 ~/.ssh - - ssh-keyscan -t rsa ssh.fdroid.nordgedanken.dev >> ~/.ssh/known_hosts - script: - - cd build/android/ - - export UPDATE_VERSION=$(pcregrep -o1 'version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*' ../../pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}.apk" - - rsync -rav -e ssh ./ fluffy@ssh.fdroid.nordgedanken.dev:/opt/fdroid/fluffychat/repo - - ssh fluffy@ssh.fdroid.nordgedanken.dev -t '/bin/bash -i -l -c "cd /opt/fdroid/fluffychat && source ../fdroidserver-env/bin/activate && fdroid update --verbose && deactivate"' - needs: ["build_android_apk"] - resource_group: playstore_release - allow_failure: true - only: - - tags - -upload-fdroid-nightly: - stage: release - before_script: - - "which ssh-agent || (sudo apt-get update -y && sudo apt-get install openssh-client -y )" - - "which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )" - - "which pcregrep || (sudo apt-get update -y && sudo apt-get install pcregrep -y )" - - eval $(ssh-agent -s) - - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - - mkdir -p ~/.ssh - - chmod 700 ~/.ssh - - ssh-keyscan -t rsa ssh.fdroid.nordgedanken.dev >> ~/.ssh/known_hosts - script: - - cd build/android/ - - export UPDATE_VERSION=$(pcregrep -o1 'version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*' ../../pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}_$(date +%s).apk" - - rsync -rav -e ssh ./ fluffy@ssh.fdroid.nordgedanken.dev:/opt/fdroid/fluffychat-nightly/repo - - ssh fluffy@ssh.fdroid.nordgedanken.dev -t '/bin/bash -i -l -c "cd /opt/fdroid/fluffychat-nightly && source ../fdroidserver-env/bin/activate && fdroid update --verbose && deactivate"' - needs: ["build_android_apk"] - resource_group: playstore_release - allow_failure: true - only: - - main - -pages: - needs: ["build_web"] - stage: deploy - image: node - script: - - cd docs - - npx tailwindcss -o ./tailwind.css --minify - - cd .. - - mv docs public - - mv build/web/ public/web/ - artifacts: - paths: - - public - only: - - main - -build_linux_x86: - stage: coverage - before_script: - [ - sudo apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install keyboard-configuration -y && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 -y, - ] - script: [./scripts/build-linux.sh] - artifacts: - when: on_success - paths: - - build/linux/x64/release/bundle/ - -build_linux_arm64: - stage: coverage - before_script: [flutter upgrade] - script: [./scripts/build-linux.sh] - tags: [docker_arm64] - only: - - main - - tags - allow_failure: true - artifacts: - when: on_success - paths: - - build/linux/arm64/release/bundle/ - -build_linux_appimage_x86: - stage: deploy - image: appimagecrafters/appimage-builder - needs: [build_linux_x86] - only: - - main - - tags - script: - - cp -r build/linux/x64/release/bundle appimage/FluffyChat.AppDir - - cd appimage - - cp FluffyChat.desktop FluffyChat.AppDir/ - - cp AppRun FluffyChat.AppDir/ - - cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg - - appimagetool -u "zsync|https://gitlab.com/famedly/fluffychat/-/releases/permalink/latest/downloads/FluffyChat-x86_64.AppImage.zsync" FluffyChat.AppDir - allow_failure: true - artifacts: - when: on_success - paths: - - appimage/FluffyChat-x86_64.AppImage - - appimage/FluffyChat-x86_64.AppImage.zsync - -build_linux_appimage_arm64: - stage: deploy - image: appimagecrafters/appimage-builder - needs: [build_linux_arm64] - tags: [docker_arm64] - only: - - main - - tags - script: - - cp -r build/linux/arm64/release/bundle appimage/FluffyChat.AppDir - - cd appimage - - cp FluffyChat.desktop FluffyChat.AppDir/ - - cp AppRun FluffyChat.AppDir/ - - cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg - - appimagetool -u "zsync|https://gitlab.com/famedly/fluffychat/-/releases/permalink/latest/downloads/FluffyChat-arm64.AppImage.zsync" FluffyChat.AppDir - allow_failure: true - artifacts: - when: on_success - paths: - - appimage/FluffyChat-arm64.AppImage - - appimage/FluffyChat-arm64.AppImage.zsync - -update-dependencies: - stage: coverage - needs: [] - tags: - - docker - only: - - schedules - variables: - HOST: ${CI_PROJECT_URL} - UPDATE_BRANCH: ci-bot/dependency-updates - PRIVATE_TOKEN: ${GITLAB_API_TOKEN} - before_script: - - eval $(ssh-agent -s) - - echo "$SSH_PRIVATE_BOT_KEY" | tr -d '\r' | ssh-add - > /dev/null - - mkdir -p ~/.ssh - - chmod 700 ~/.ssh - - ssh-keyscan -t rsa gitlab.com >> ~/.ssh/known_hosts - - chmod 644 ~/.ssh/known_hosts - - git config --global user.email "bot@fluffy.chat" - - git config --global user.name "Dependency Update Bot" - - sudo apt-get update && sudo apt-get install -y curl - script: - - ./scripts/update-dependencies.sh - - git remote set-url --push origin git@gitlab.com:$CI_PROJECT_PATH - - 'git diff --exit-code || (git checkout -B ${UPDATE_BRANCH} && git add . && git commit -m "chore: Update dependencies" && git push -f origin ${UPDATE_BRANCH} && ./scripts/open-mr.sh)' - -.release: - stage: release - image: curlimages/curl:latest - rules: - - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' - - if: '$CI_COMMIT_TAG =~ /^rc\d+\.\d+\.\d+-\d+$/' - before_script: - - export RELEASE_TYPE=$(echo $CI_COMMIT_TAG | grep -oE "[a-z]+") - - export RELEASE_VERSION=$(echo $CI_COMMIT_TAG | grep -oE "\d+\.\d+\.\d+") - - export PACKAGE_REGISTRY_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/fluffychat/${RELEASE_VERSION}" - -upload-android: - extends: .release - script: - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file build/android/app-release.apk ${PACKAGE_REGISTRY_URL}/fluffychat.apk - -upload-web: - extends: .release - script: - - tar czf package.tar.gz -C build/web/ . - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz - -upload-linux-x86: - extends: .release - script: - - tar czf package.tar.gz -C build/linux/x64/release/bundle/ . - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-x86.tar.gz - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-x86_64.AppImage ${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-x86_64.AppImage.zsync ${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage.zsync - -upload-linux-arm64: - extends: .release - script: - - tar czf package.tar.gz -C build/linux/arm64/release/bundle/ . - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-arm64.AppImage ${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-arm64.AppImage.zsync ${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage.zsync - -upload-windows: - extends: .release - image: alpine:latest - script: - - apk add --no-cache curl zip - - cd build/windows/runner/Release; zip -r ../../../../package.zip . ; cd - - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.zip ${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip - -upload-playstore: - stage: release - before_script: [./scripts/prepare-android-release.sh] - script: [./scripts/release-playstore.sh] - resource_group: playstore_release - only: - - tags - -release: - extends: .release - image: registry.gitlab.com/gitlab-org/release-cli:latest - - script: - - | - release-cli create --name "Release ${CI_COMMIT_TAG}" --tag-name $CI_COMMIT_TAG \ - --assets-link "{\"name\":\"fluffychat.apk\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat.apk\"}" \ - --assets-link "{\"name\":\"fluffychat-linux-x86.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-linux-x86.tar.gz\"}" \ - --assets-link "{\"name\":\"fluffychat-linux-arm64.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz\"}" \ - --assets-link "{\"name\":\"fluffychat-windows.zip\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip\"}" \ - --assets-link "{\"name\":\"fluffychat-web.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz\"}" - --assets-link "{\"name\":\"FluffyChat-x86_64.AppImage\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage\",\"filepath\":\"/FluffyChat-x86_64.AppImage\"}" - --assets-link "{\"name\":\"FluffyChat-x86_64.AppImage.zsync\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage.zsync\",\"filepath\":\"/FluffyChat-x86_64.AppImage.zsync\"}" - --assets-link "{\"name\":\"FluffyChat-arm64.AppImage\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage\",\"filepath\":\"/FluffyChat-arm64.AppImage\"}" - --assets-link "{\"name\":\"FluffyChat-arm64.AppImage.zsync\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage.zsync\",\"filepath\":\"/FluffyChat-arm64.AppImage.zsync\"}" diff --git a/.metadata b/.metadata index ce13b42014..236851946e 100644 --- a/.metadata +++ b/.metadata @@ -1,11 +1,11 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled. +# This file should be version controlled and should not be manually edited. version: - revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - channel: stable + revision: "abb292a07e20d696c4568099f918f6c5f330e6b0" + channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: android - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: ios - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 + create_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 + base_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 - platform: linux - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: macos - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: web - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: windows - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 + create_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 + base_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 # User provided section diff --git a/CHANGELOG.md b/CHANGELOG.md index b88a3bd0c8..4e2b41307d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,1214 @@ +## v1.23.0 +- design: Highlight emoji only messages (Krille) +- design: New login design (Krille) +- docs: fix snapstore badge on website (Krille) +- feat: Add about server page (Krille) +- feat: Add default chat wallpaper (Krille) +- feat: Add markdown context actions for text input (krille-chan) +- feat: Better wallpapers with blur and opacity sliders and improved styles page (krille-chan) +- feat: Display warning banner on unverified devices (krille-chan) +- feat: New audio message design with displayed body (krille-chan) +- feat: Nicer room creation UI (krille-chan) +- feat: Open account manage url when using MAS (krille-chan) +- feat: Sending multiple files at once (krille-chan) +- feat: Swipe to archive rooms (Krille) +- fix: Bypass image compression in flutter_file_picker (q234rty) +- fix: dont use thumbnails for emoticons (Marek Vospěl) +- fix: Public rooms always publicly visible even when turned off on creation (krille-chan) +- fix: Wait for room invite before open in pushhelper (krille-chan) +- refactor: Better future loading dialog without flickering (krille-chan) +- refactor: Display two lines on new messages (krille-chan) +- refactor: Improve delete device UX flow (krille-chan) +- refactor: Load bytes from sending files later to not let app crash (krille-chan) +- refactor: Migrate to newer keyboard shortcuts package (Krille) +- refactor: Move to upstream geolocator (Krille) +- refactor: Performance boost for avatar widget (Krille) +- refactor: Remove duplicated navigator workaround (krille-chan) +- refactor: Remove keyboard shortcuts (Krille) +- refactor: Remove unnecessary builder widget (krille-chan) +- refactor: Reuse flutter local notifications object (krille-chan) +- refactor: Use adaptive dialog action (Krille) +- refactor: Use file selector on linux (krille-chan) +- refactor: Use non nullable localizations builder and lazy load on web (krille-chan) +- Revert "chore: Follow up new chat design" (Krille) +- Revert "feat: Add default chat wallpaper" (Krille) +- Revert "refactor: Performance boost for avatar widget" (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (German) (Peter Wallerius) +- Translated using Weblate (Hungarian) (Zentropivity) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Irish) (Christian) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (Bruno Roh) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Latvian) (GGLVXD) +- Translated using Weblate (Russian) (Pavel Kozhukhov) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Spanish) (Kimby) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.22.0 + +FluffyChat v1.22.0 brings a new design for spaces, replaces the bottom navigation bar with filter chips and makes it finally possible to play ogg audio messages on iOS. A lot of other fixes and improvements have also been added to this release. + +FluffyChat also now uses the new authenticated media endpoints if the server supports Matrix v1.11 or +mentions the msc with the key `org.matrix.msc3916.stable` in the `unstable_features`. + +- design: Add snackbar with link to changelog on new version (Krille) +- docs: Update privacy policy (krille-chan) +- feat: Support for matrix auth media endpoints +- feat: Convert opus to aac on iOS before playing (Krille) +- feat: New spaces and chat list design (krille-chan) +- feat: Record voice message with opus/ogg if supported (Krille) +- feat: Send voice messages from web (Krille) +- feat: Add about server page (Krille) +- feat: Add default chat wallpaper (Krille) +- feat: Add markdown context actions for text input (krille-chan) +- feat: Better wallpapers with blur and opacity sliders and improved styles page (krille-chan) +- feat: Display warning banner on unverified devices (krille-chan) +- feat: New audio message design with displayed body (krille-chan) +- feat: Nicer room creation UI (krille-chan) +- feat: Open account manage url when using MAS (krille-chan) +- feat: Sending multiple files at once (krille-chan) +- feat: Swipe to archive rooms (Krille) +- fix: Display only available join rules (Krille) +- fix: Path correct userId to ignore list (krille-chan) +- fix: Scroll to event missing the position (Krille) +- Fix web base url and privacy url configuration processing (dlyrsk) +- refactor: Clean up some widths (krille-chan) +- refactor: Design polishment and better user viewer (Krille) +- refactor: Migrate android gradle plugin (Krille) +- refactor: Only initialize FlutterLocalNotificationsPlugin once (krille-chan) +- refactor: Recording dialog (Krille) +- Refactor: Reduce .of(context) calls theme (Thomas Klein Langenhorst) +- refactor: Use cached network image for mxc image uris (Krille) +- Translated using Weblate (Arabic) (kdh8219) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (kdh8219) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (kdh8219) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (kdh8219) +- Translated using Weblate (Chinese (Traditional)) (Lukas) +- Translated using Weblate (Chinese (Traditional)) (Ricky From Hong Kong) +- Translated using Weblate (Chinese (Traditional)) (不知火 Shiranui) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Dutch) (Guacamolie) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Dutch) (Thomas Klein Langenhorst) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Estonian) (kdh8219) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Sovkipyk) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Pixelcode) +- Translated using Weblate (German) (tct123) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (-) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Turkish) (kdh8219) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.21.2 +Updates the Matrix Dart SDK to fix some minor bugs. + +- Added translation using Weblate (Lojban) (Zig-Rust-Odin) +- build: Update matrix dart sdk (Krille) +- chore: Update last event after decryption (Krille) +- fix: Correctly localize time of date (Krille) +- refactor: Omit local types (Krille) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Polish) (Eryk Michalak) +- Translated using Weblate (Portuguese (Brazil)) (lucasmz-dev) +- Translated using Weblate (Russian) (Nicholas Winterhalter) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.21.1 +- build: Update Matrix Dart SDK (Krille) +- build: Update to Flutter 3.22.2 (krille-chan) +- feat: add option to configure reply swipe direction (MrSpoony) +- fix: Add missing unlock button to lockscreen textfield (Krille) +- fix: Auto unlock lock screen (krille-chan) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Rauno Ots) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Vietnamese) (Karo) + +## v1.21.0 +FluffyChat v1.21.0 introduces the new search feature which also includes a gallery and files list for each chat. Several performance improvements have been added under the hood, leading to a much nicer user experience. + +- feat: Enable download images on iOS, not only share images (krille-chan) +- feat: Search feature (krille-chan) +- build: Update record package (krille-chan) +- build: Use correct pubspec.yaml format for hosted dependency (krille-chan) +- build: Use matrix sdk main branch (krille-chan) +- chore: Change default timeout to 30 min (krille-chan) +- chore: Go back to pub.dev matrix sdk (Krille) +- chore: Hotfix create missing objectbox (Krille) +- chore: Increase default network request timeout (Krille) +- chore: Make bottomnavbar labels always visible (krille-chan) +- chore: Nicer message animation (krille-chan) +- chore: Only load last event sender if necessary (Krille) +- chore: Set a maxsize for textfields (Krille) +- chore: upgrade flutter to 3.22.0 (lauren n. liberda) +- chore: upgrade flutter to 3.22.1 (lauren n. liberda) +- ci: run `flutter gen-l10n` on code_tests (lauren n. liberda) +- design: Improve design of Voice Messages and add 1.25 as speed (Krille) +- fastlane: i18n ru (Yurt Page) +- fastlane: improve full_description.txt (Yurt Page) +- fix: Broken localization with empty strings in it (krille-chan) +- fix: FakeMatrixApi check (krille-chan) +- fix: mxc reactions not rendered correctly (krille-chan) +- fix: Stickers from gboard have black background (Krille) +- fix: voip code breaking from 0.28 (td) +- refactor: Delete database file on failed app start (krille-chan) +- refactor: Display better command hints (Krille) +- refactor: Improve performance of chat list (krille-chan) +- refactor: Precache theme and directchatmatrixid to improve performance in chat list item (krille-chan) +- refactor: Update to Matrix Dart SDK 0.29.9 (Krille) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Jozef Mlich) +- Translated using Weblate (Georgian) (Nicholas Winterhalter) +- Translated using Weblate (German) (Gian Klug) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Norwegian Bokmål) (sunniva) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.20.0 +Design improvements and new advanced UI to manage rooms. + +- build: Fix google services patch (Krille) +- build: Update matrix dart sdk (krille-chan) +- build: Update to Flutter 3.19.6 (krille-chan) +- chore: Let error reporter fill out bug report (krille-chan) +- chore: More nicer event source display (krille-chan) +- chore: Update user has knocked localization with emoji (krille-chan) +- design: Adjust chat settings design (krille-chan) +- design: Adjust settings design (krille-chan) +- design: Fix color of invite button (krille-chan) +- design: Follow up chat settings design (krille-chan) +- design: Follow up settings design (krille-chan) +- design: Improve user permission settings (krille-chan) +- design: New chat access settings (krille-chan) +- design: Redesign permissions settings with dropdownbuttons (krille-chan) +- design: Remake UX of selecting messages and chats (krille-chan) +- refactor: Download on android and iOS with file_picker (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Dutch) (Anonymous) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Hungarian) (Máté Menyhárt) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Portuguese (Brazil)) (lucasmz) +- Translated using Weblate (Portuguese (Brazil)) (Rudah Ximenes Alvarenga) + +## v1.19.2 +Bugfix release to mostly fix the new database encryption on Linux and update the translations. + +- build: (deps): bump peaceiris/actions-gh-pages from 3 to 4 (dependabot[bot]) +- build: Update all dependencies and remove vibrator package (krille-chan) +- build: Update emoji picker package (krille-chan) +- build: Update flutter_map package (krille-chan) +- docs: Fix typo in android app description (Krille) +- fix: Allow unencrypted database if gnome keyring not present or platform does not support it (krille-chan) +- fix: Background color of images with transparency (Krille) +- fix: Localizations from weblate confused by unknownEvent locale (Krille) +- fix: More logs when database fails to init and trycatch sendInitNotification (Krille) +- Added translation using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (D0735) +- Translated using Weblate (Chinese (Traditional)) (Kyanos Chiu) +- Translated using Weblate (Croatian) (v1s7) +- Translated using Weblate (English) (v1s7) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Interlingua) (kdh8219) +- Translated using Weblate (Italian) (Krystian) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Persian) (EndermanXD) +- Translated using Weblate (Polish) (Adam Strączek) +- Translated using Weblate (Polish) (Krystian) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (v1s7) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.19.1 +Minor bugfix release for login with SSO on web. + +- feat: Show/hide third column in chat view (krille-chan) +- design: Adjust some colors in inputbar (krille-chan) +- fix: Login with SSO on web (krille-chan) +- fix: Make chat permission settings null and type safe (krille-chan) +- chore: do not use static openssl (ShootingStarDragons) +- refactor: Move room headers into appbar bottom field (krille-chan) +- refactor: new flutter only typing animation (krille-chan) + +## v1.19.0 +FluffyChat v1.19.0 features an improved design for message bubbles and a lot of fixes under the hood. + +- build: Update matrix dart sdk (Krille) +- build: Update to flutter 3.19.5 (krille-chan) +- chore: Add missing command hints (krille-chan) +- chore: Add pagekey to custom page builder (Krille) +- chore: Adjust design of typing indicator (Krille) +- chore: Adjust ticker of notifications for Android (Krille) +- chore: Calc blurhash in other thread (Krille) +- chore: Mark muted unread rooms with bold text (krille-chan) +- chore: More minimal matrix pill (Krille) +- chore: Try out CupertinoPage instead of custom transition in router (krille-chan) +- ci: add a license compliance check (lauren n. liberda) +- design: Connect bubbles from same sender (krille-chan) +- design: Display images in correct ratio in timeline (krille-chan) +- design: Make appbar in material you design for mobile mode (krille-chan) +- design: New sticker picker next to emoji picker (krille-chan) +- design: Nicer QR Code design (krille-chan) +- design: Nicer reactions design with size animations (Krille) +- feat: Add insert content via gboard (krille-chan) +- feat: Reply with one button in desktop (krille-chan) +- fix: Do not sync in background mode (krille-chan) +- fix: FluffyChat should assume m.change_password capabilitiy is supported if not present per spec (krille-chan) +- fix: never use root navigator for bottom sheets (The one with the braid) +- fix: Remove pantalaimon message with normal error message (krille-chan) +- fix: Search in spaces view (krille-chan) +- fix: Set read marker on web (Krille) +- fix: Point to correct path for auth.html so completing sso login flow no longer 404s (Gavin Mogan) +- refactor: Better logic for removing outdated notifications (Krille) +- refactor: Enhance logic when to mark room as read (krille-chan) +- refactor: Remove old aliases workaround (Krille) +- refactor: Sticker widget code (Krille) +- refactor: Use dart blurhash (Krille) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Interlingua) (Software In Interlingua) + +## v1.18.0 +- feat: Add speed button for audioplayer (krille-chan) +- feat: enhanced send video functionality by adding toggle send original (Mubeen Rizvi) +- feat: add dialog to hide presence list with long-press (Marcus Hoffmann) +- feat: Add notification shortcuts to android (krille-chan) +- feat: make showing user presence info optional (Marcus Hoffmann) +- feat: Open chat on shortcut click on android (krille-chan) +- fix: BuildContext crash when joining room (krille-chan) +- fix: Export session (krille-chan) +- fix: Notifications open sometimes automatically on android (krille-chan) +- fix: Open room after join (krille-chan) +- fix: Open room by notification happened multiple times (krille-chan) +- fix: Open room links with event id (krille-chan) +- fix: properly initialize hideUnimportantStateEvents setting (Marcus Hoffmann) +- fix: Remove status msg not changeable from old cache (krille-chan) +- fix: use correct icons for chat pin/unpin (Marcus Hoffmann) +- fix: use correct icons for mark read/unread action (Marcus Hoffmann) +- build: Update Linux build files (krille-chan) +- build: Update to Flutter 3.19.1 (Krille) +- chore: Add more information to Person object in android notifications (krille-chan) +- chore: Thumbnail follow up for notifications (Krille) +- refactor: Better download UX with file picker for android and iOS (krille-chan) +- refactor: Use hashcode instead of string to id workaround for notifications (Krille) +- Added translation using Weblate (Belarusian) (kopatych) +- Added translation using Weblate (Interlingua) (Software In Interlingua) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Benjamin Wagner) +- Translated using Weblate (Greek) (Benjamin Wagner) +- Translated using Weblate (Russian) (Benjamin Wagner) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Сергій) + +## v1.17.3 +- feat: New account data based wallpaper feature (Krille) +- build: Update dependencies (Krille) +- build: Update flutter to 3.16.9 (Krille) +- build: Update matrix dart sdk to 0.25.7 (Krille) +- build: Update minor versions (Krille) +- chore: Adjust status msg design (krille-chan) +- chore: Improved error handling for recovery key (Krille) +- chore: Make stickers smaller (Krille) +- chore: Wait for device keys before ask bootstrap (Krille) +- fix: Missing null check in public room bottom sheet (Krille) +- fix: onDragDone crashes when no files found (Krille) +- fix: Render tg-forward html tags (Krille) +- fix: Use HapticFeedback.selectionClick() for long press on message (Krille) +- fix: whitespaces sometimes encoded in html message (Krille) +- fix: Share invite links of public rooms (Krille) + +## v1.17.2 +Another minor bugfix release which also implements private read receipts. + +- feat: Implement private read receipts (krille-chan) +- feat: Join room by alias by tpying alias in searchbar (krille-chan) +- fix: Add cancel button to key request dialog (Krille) +- fix: Encode component for links correctly (Krille) +- fix: Forward arbitrary message content (krille-chan) +- fix: Open publicroombottomsheet by alias (krille-chan) +- docs: Add noto animated emojis link (krille-chan) +- docs: New website (krille-chan) +- build: Do not load emojis at initial start on web (krille-chan) +- build: Update flutter to 3.16.8 (krille-chan) +- build: Update sdk to 0.25.6 (Krille) +- chore: Add more explaining text for key verification (krille-chan) +- chore: Resort settings and add more description text (krille-chan) +- refactor: Dialog BuildContext (krille-chan) +- refactor: Use popupmenudivider instead of workaround (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Swedish) (Flat) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Сергій) + +## v1.17.1 +Minor bugfix release. + +- build: Update matrix sdk 0.25.5 (Krille) +- build: Update to flutter 3.16.7 (Krille) +- chore: Remove vibration on iOS for long press (Krille) +- design: Better paddings in tablet mode (krille-chan) +- docs: Fix typo in readme (Krille) +- Fix dependency. missing yq when invoking setup-web. also ensure updated config.json copied in (Isaac Johnson) +- fix: text nodes with multiple links crash the timeline (Krille) +- fix: URL too long when reporting bug (Krille) +- fix: Wait for user device keys before start verification (Krille) + +## v1.17.0 +FluffyChat v1.17.0 refreshes the overall user experience, changes some design and fixes a lot of bugs. It also replaces the stories feature with matrix presences, introduces a new kind of database to store the messages locally and improves the performance and app stability. + +- change: Remove wallpaper feature (krille-chan) +- design: Adjust login page design (krille-chan) +- design: Adjust new chat page design (Krille) +- design: Adjust reply design (krille-chan) +- design: New design for login page (krille-chan) +- feat: Add registration buttons for servers with public registration url (krille-chan) +- feat: Animate in new events in timeline (krille-chan) +- feat: Block users who sent invites (krille-chan) +- feat: Display migration notification (Krille) +- feat: Hovermenu for messages for mouse (krille-chan) +- feat: New change password page with server capabilities check (krille-chan) +- feat: Search for public spaces (krille-chan) +- feat: Try out FluffyBox 2 database (Krille) +- fix: Add 3pid email for password reset (krille-chan) +- fix: Audiomessage break app (Krille) +- fix: Cannot change send on enter on desktop (krille-chan) +- fix: Darktheme contrast fixes with primary color (krille-chan) +- fix: Join public rooms (krille-chan) +- fix: Make user admin (krille-chan) +- fix: New json url for homeserver list (krille-chan) +- fix: Open notification for invite crashes app (krille-chan) +- fix: Remove web background (Krille) +- fix: Some links not clickable in messages (Krille) +- fix: Update manual endpoints (Krille) +- fix: Web SSO (Krille) +- refactor: More stable scroll to event (krille-chan) +- refactor: Reinvite other part instead of reopen dm (Krille) +- refactor: Remove todo list feature (krille-chan) +- refactor: Remove unnecessary setState in ChatPage for better performance (krille-chan) +- refactor: Remove unused code (krille-chan) +- refactor: Remove unused localization strings and add ci check (krille-chan) +- refactor: Replace stories feature with presence status msg (Krille) +- refactor: Spaces UX improvements (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Hindi) (immodded) +- Translated using Weblate (Italian) (Claudio Maradonna) +- Translated using Weblate (Italian) (Timothy Redaelli) +- Translated using Weblate (Portuguese (Brazil)) (Hermógenes Oliveira) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.16.1 +Test candidate for the new database. + +## v1.16.0 +- build: Set olm to 1.3.2 to fix android build (krille-chan) +- build: Update dependencies (krille-chan) +- build: Update flutter_olm (Krille) +- build: Update matrix dart sdk to 0.23.0 (Krille) +- build: Update Matrix Dart SDK to 0.24.0 (Krille) +- build: Update openssl crypto (Krille) +- build: Update to flutter 3.16.2 (krille-chan) +- build: Workaround for broken flutter secure storage on linux (krille-chan) +- chore: Add error report for incorrect recovery key (Krille) +- chore: Always show notification popup on android (krille-chan) +- chore: Do not ship unused emoji font for android and iOS (krille-chan) +- chore: Fetch cached presence (Krille) +- chore: Update pubspec.lock (Krille) +- chore: upgrade flutter to 3.16.0 (lauren n. liberda) +- docs: Fix links to GitHub (Jérémie Roquet) +- feat: Display presences in the app (krille-chan) +- feat: Enable experimental suport for dehydrated devices (Krille) +- feat: Improved UX design for new chat page (krille-chan) +- feat: New UX design for create group chat (krille-chan) +- fix: Block users (krille-chan) +- fix: Blurhash crashes on height 0 (krille-chan) +- fix: Do not hide push if app romm in foreground but is in background (krille-chan) +- fix: Do not scroll up on enter chat (Krille) +- fix: emoji import from ZIP file (The one with the braid) +- fix: Encryption dialog crashes in column mode (krille-chan) +- fix: Error widget spamming with dialogs (Krille) +- fix: fcm patch (lauren n. liberda) +- fix: Glitch in event info dialog (krille-chan) +- fix: message bubble position on desktop devices (The one with the braid) +- fix: navigating back from full screen video (Aryan Arora) +- fix: Only load first pinned event (krille-chan) +- fix: Userbottomsheet crash on some edge cases (krille-chan) +- fix: whatever happens with android native libraries since flutter 3.16 (lauren n. liberda) +- refactor: Check if app is in foreground on pushhelper (krille-chan) +- refactor: Event list (krille-chan) +- refactor: Migrate for Flutter 3.16.0 (Krille) +- refactor: Remove copy dialog before opening links (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Bengali) (Allan Nordhøy) +- Translated using Weblate (Bengali) (Anonymous) +- Translated using Weblate (Bengali) (Graeme Power) +- Translated using Weblate (Bengali) (Joaquim Homrighausen) +- Translated using Weblate (Bengali) (Raatty) +- Translated using Weblate (Bengali) (Sorunome) +- Translated using Weblate (Catalan) (Adolfo Jayme Barrientos) +- Translated using Weblate (Catalan) (Anonymous) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Catalan) (Joaquim Homrighausen) +- Translated using Weblate (Catalan) (Raatty) +- Translated using Weblate (Chinese (Simplified)) (Anonymous) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Traditional)) (Anonymous) +- Translated using Weblate (Chinese (Traditional)) (Joaquim Homrighausen) +- Translated using Weblate (Chinese (Traditional)) (Raatty) +- Translated using Weblate (Chinese (Traditional)) (SuperSonic) +- Translated using Weblate (Croatian) (Anonymous) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Tomkoid) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Esperanto) (Joaquim Homrighausen) +- Translated using Weblate (Esperanto) (Raatty) +- Translated using Weblate (Esperanto) (Tirifto) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Anonymous) +- Translated using Weblate (French) (Mæve Rey) +- Translated using Weblate (Galician) (Anonymous) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Bella) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Greek) (Anonymous) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Hebrew) (Joaquim Homrighausen) +- Translated using Weblate (Hebrew) (Raatty) +- Translated using Weblate (Hebrew) (Sorunome) +- Translated using Weblate (Hebrew) (y batvinik) +- Translated using Weblate (Hindi) (Anonymous) +- Translated using Weblate (Hungarian) (Anonymous) +- Translated using Weblate (Hungarian) (Joaquim Homrighausen) +- Translated using Weblate (Hungarian) (notramo) +- Translated using Weblate (Hungarian) (Raatty) +- Translated using Weblate (Indonesian) (Anonymous) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Irish) (Graeme Power) +- Translated using Weblate (Irish) (Joaquim Homrighausen) +- Translated using Weblate (Irish) (Raatty) +- Translated using Weblate (Italian) (Anonymous) +- Translated using Weblate (Italian) (J. Lavoie) +- Translated using Weblate (Italian) (Joaquim Homrighausen) +- Translated using Weblate (Italian) (Raatty) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Japanese) (cPidx) +- Translated using Weblate (Korean) (Anonymous) +- Translated using Weblate (Korean) (Kim Tae Kyeong) +- Translated using Weblate (Korean) (Raatty) +- Translated using Weblate (Latvian) (Anonymous) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Lithuanian) (Mind) +- Translated using Weblate (Norwegian Bokmål) (Allan Nordhøy) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Joaquim Homrighausen) +- Translated using Weblate (Norwegian Bokmål) (Raatty) +- Translated using Weblate (Occidental) (Anonymous) +- Translated using Weblate (Occidental) (OIS) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Polish) (Anonymous) +- Translated using Weblate (Portuguese (Brazil)) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Joaquim Homrighausen) +- Translated using Weblate (Portuguese (Portugal)) (Raatty) +- Translated using Weblate (Portuguese (Portugal)) (Tmpod) +- Translated using Weblate (Portuguese) (Allan Nordhøy) +- Translated using Weblate (Portuguese) (Anonymous) +- Translated using Weblate (Portuguese) (Christian) +- Translated using Weblate (Portuguese) (Graeme Power) +- Translated using Weblate (Portuguese) (Joaquim Homrighausen) +- Translated using Weblate (Portuguese) (Raatty) +- Translated using Weblate (Portuguese) (Sorunome) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (Anonymous) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Serbian) (Joaquim Homrighausen) +- Translated using Weblate (Serbian) (Raatty) +- Translated using Weblate (Serbian) (Слободан Симић(Slobodan Simić)) +- Translated using Weblate (Slovak) (Allan Nordhøy) +- Translated using Weblate (Slovak) (Anonymous) +- Translated using Weblate (Slovak) (Graeme Power) +- Translated using Weblate (Slovak) (Joaquim Homrighausen) +- Translated using Weblate (Slovak) (Raatty) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Slovenian) (Joaquim Homrighausen) +- Translated using Weblate (Slovenian) (Raatty) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Spanish) (Joaquim Homrighausen) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Mæve Rey) +- Translated using Weblate (Spanish) (programmerpony) +- Translated using Weblate (Spanish) (Raatty) +- Translated using Weblate (Swedish) (Anonymous) +- Translated using Weblate (Swedish) (Dennis) +- Translated using Weblate (Swedish) (Fredrik Lindqvist) +- Translated using Weblate (Swedish) (paintwithblue) +- Translated using Weblate (Tamil) (Anonymous) +- Translated using Weblate (Tamil) (Graeme Power) +- Translated using Weblate (Tamil) (Joaquim Homrighausen) +- Translated using Weblate (Tamil) (Raatty) +- Translated using Weblate (Tamil) (Sorunome) +- Translated using Weblate (Thai) (Anonymous) +- Translated using Weblate (Tibetan) (Anonymous) +- Translated using Weblate (Turkish) (Anonymous) +- Translated using Weblate (Turkish) (Yourredyknowwhoitisss) +- Translated using Weblate (Vietnamese) (Allan Nordhøy) +- Translated using Weblate (Vietnamese) (Anonymous) +- Translated using Weblate (Vietnamese) (Christian) +- Translated using Weblate (Vietnamese) (Graeme Power) +- Translated using Weblate (Vietnamese) (Joaquim Homrighausen) +- Translated using Weblate (Vietnamese) (Raatty) +- Translated using Weblate (Vietnamese) (Sorunome) + +## v1.15.1 +- feat: Make all text in chat selectable on desktop (krille-chan) +- chore: Add border to images in timeline (krille-chan) +- chore: added android audio sharing intent (Aryan Arora) +- fix: Dockerfile: install jq in the builder image (David Douard) +- fix: Cannot pin messages of other users (Krille) +- fix: Emojipicker flickering because noRecent (krille-chan) +- fix: LoadProfileBottomSheet accessing disposed outerContext (Aryan Arora) +- fix: More stable scroll up to event (krille-chan) +- fix: Properly capitalize Linux window title (kramo) +- fix: Remove failed to sent events (krille-chan) +- fix: Routing glitch when using SSO on desktop (krille-chan) +- fix: SSO with no identity providers (krille-chan) +- refactor: Do not init client in background mode on Android (krille-chan) +- refactor: Store and fix missing persistence of some values (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Czech) (Vojtěch Fošnár) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (German) (Haui) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.15.0 +- feat: Add experimental todo list for rooms (krille-chan) +- feat: better scroll to last read message handling (krille-chan) +- build: Add appid suffix to android debug builds (krille-chan) +- build: Download canvaskit on build for flutter web (krille-chan) +- build: Update to Flutter 3.13.9 (krille-chan) +- chore: Add descriptions in the areYouSure dialogs for better UX (krille-chan) +- chore: Adjust bitrate for smaller voice messages (krille-chan) +- chore: Change way how to seek in audioplayer (Krille) +- chore: Limit image file and video picker until we have a background service (krille-chan) +- chore: Minor design fixes (Krille) +- design: Make incoming messages color more light (krille-chan) +- design: Make key verification an adaptive dialog (krille-chan) +- design: Make own chat bubble primary color for better contrast (krille-chan) +- fix: Create chat dialog crashes sometimes and power level textfield does not validate input (krille-chan) +- fix: Remove uncompatible dependencies connectivity_plus and wakelock (Krille) +- fix: Use correct localization for redactedBy (krille-chan) +- fix: noFCM warning dialog (krille-chan) +- fix: render tg-forward as blockquote style (krille-chan) +- fix: Archive does not update its state +- refactor: Change audio codec to opus where supported to have better compatibility with Element (Krille) +- refactor: Make file dialog adaptive and adjust design (krille-chan) +- refactor: Preload notification sound on web (Krille) +- refactor: Remove unused config (krille-chan) +- refactor: Remove unused config params (krille-chan) +- refactor: Update FutureLoadingDialog (krille-chan) +- refactor: use locally hosted canvaskit instead of calling google (root) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Polish) (Tomasz W) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Slovak) (Jozef Gaal) +- Translated using Weblate (Thai) (Amy/Atius) + +## v1.14.5 +- Hotfix iOS crashes on start +- Hotfix cannot reset applock + +## v1.14.4 +Minor bugfix release. Please note that because of a Flutter update FluffyChat is no longer +compatible with iOS 11. + +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Yotta Mxt) +- build: Add custom iOS notification sound (Krille) +- build: Set minimum iOS version to 12 +- design: Hide Navigationbar labels (krille-chan) +- design: New notification sound (krille-chan) +- fix: Flutter warnings because of applock animation (krille-chan) +- fix: UIA requests with navigator (krille-chan) +- fix: open story from push notification (Krille-chan) +- refactor: Only preload client for GUI start (krille-chan) + +## v1.14.3 +- hotfix app lock still displayed even when account is logged out +- Update to Flutter 3.13.6 + +## v1.14.2 +- hotfix for broken applock screen + +## v1.14.1 +- fix: Routing bug when adding second account via password login + +## v1.14.0 +Release with a lot of bugfixes and refactorings under the hood. FluffyChat now uses go_router instead of vrouter, works with the newest Flutter SDK and supports "reason" field for redactions. For Android there is a new "background-fetch mode" for Push Notifications which should make notifications in background faster and more reliable and reduce battery-usage. + +- feat: Background fetch mode on Android (krille-chan) +- feat: Improved mouse support for selecting events (krille-chan) +- feat: Write and display reason for redacting a message (krille-chan) +- build: Add curl to build packages (krille-chan) +- build: Re-add handywindow linux code lines (Krille) +- build: Update Matrix dart sdk to 0.22.3 (Krille) +- build: Update targetSdkVersion to 33 (Android 13) (Krille) +- build: Update to Flutter 3.13.1 (Krille) +- change: Remove widgets feature (Krille) +- chore: Add tailwind.css to gitignore (Krille) +- chore: Display username in userbottomsheet (krille-chan) +- chore: Make appbar buttons correct size (krille-chan) +- chore: Update file picker (krille-chan) +- ci: Build snap on snapcraft again and only promote from ci (krille-chan) +- ci: Test if app builds for iOS (krille-chan) +- design: Add scale animation hover effects on navrail and story buttons (Krille) +- design: Big redesign of three column mode to advanced two column mode (krille-chan) +- design: Chat list design adjustments (Krille) +- design: Display last story as tiny message bubble in chat list (krille-chan) +- design: Improve invite chat UX (krille-chan) +- design: Move chatbackup in adaptive bottom sheet (krille-chan) +- design: New three column layout for wide screens (krille-chan) +- design: Nicer user bottom sheet (krille-chan) +- design: Redesign style page (Krille) +- docs: Update readme (Krille) +- feat/ChatListItem: small changes (gilice) +- fix: Bootstrap on first try fails sometimes (krille-chan) +- fix: Cancel search on back button tap on android (Krille) +- fix: Do not allow empty search server (krille-chan) +- fix: First story appears to be unencrypted sometimes (krille-chan) +- fix: Remove mpv and zenity to fix linux snap builds (krille-chan) +- fix: Unable to send files from snap version (krille-chan) +- refactor: Change group description to chat description (krille-chan) +- refactor: Make router static (Krille) +- refactor: Migrate from pathsegment routing (Krille) +- refactor: Migrate routes to go router (krille-chan) +- refactor: Remove bubble size slider (Krille) +- refactor: Replace vrouter with gorouter (Krille) +- refactor: Space routes to normal room routes (Krille) +- refactor: Update badge (krille-chan) +- refactor: Update html build files (krille-chan) +- Added translation using Weblate (Toki Pona) (Sollee) +- Deleted translation using Weblate (Toki Pona) (Christian) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Flibble) +- Translated using Weblate (Czech) (Matyáš Caras) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Christian) +- Translated using Weblate (Russian) (DarkCoder15) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Skrripy) + +## v1.13.0 +- feat: option to not send typing notifications (Bnyro) +- feat: small performance tweaks for Message (gilice) +- feat: New onboarding screen with SSO as first class feature +- feat: Import/Export emoji packs from/to zip file +- fix: Set iOS badge (Krille) +- refactor: Switch the dev hosting platform from GitLab to GitHub +- design: New more compact chat bubble design and other design tweaks +- design: Login now shows SSO more prominent and deprecates in-app registration in favor of SSO registration +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.12.0 +- Added translation using Weblate (Toki Pona) (Mæve Rey) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Polish) (lauren n. liberda) +- Translated using Weblate (Romanian) (Riley) +- Translated using Weblate (Russian) (DarkCoder15) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- build: Remove dependency overwrite for ffi (Krille) +- build: Update dependencies (Krille) +- builds: Change minsdkversion of Android from 16 to 19 (Krille) +- builds: Do not allow failure for linux x86 (Krille) +- builds: Do not use verbose mode on building linux (Krille) +- builds: Linux with flutter 3.10 (Krille) +- builds: Remove workaround for building linux arm64 (Krille) +- builds: Update file_picker to 5.3.0 (Krille) +- builds: Update flutter table html (Krille) +- builds: Update flutter_html (Krille) +- builds: migrate to dart 3.0/flutter 3.10 (lauren n. liberda) +- chore: Add missing blockquote style (Krille) +- chore: Allow failure in build linux for now (Krille) +- chore: Ask for storage persistence (Krille) +- chore: Clean unused translations (Malin Errenst) +- chore: Enhance room pills (Krille) +- chore: Minor code clean up (Krille) +- chore: Update flutter webrtc (Krille) +- chore: Upgrade to Flutter 3.10.1 (Malin Errenst) +- chore: change release curl calls to use --fail-with-body (Tim Flink) +- chore: update macOS icons and add build script (TheOneWithTheBraid) +- design: Replace anime images with neutral cupertino icons (Krille) +- feat: Add toggle to mute notifications from chat groups (fbievan) +- feat: Allow ruby tags in html (Krille) +- feat: Display progress value for initial sync (Krille) +- feat: Implement new error reporting tool when critical features break like playing audio or video messages or opening a chat (Krille) +- feat: clean up macOS build metadata (TheOneWithTheBraid) +- feat: set display information correctly (TheOneWithTheBraid) +- feat: update macOS build files (TheOneWithTheBraid) +- feat: update macOS build information for macOS Ventura (TheOneWithTheBraid) +- fix "Unhandled Exception: VRouter.of(context) was called with a context which does not contain a VRouter." (Lauren N. Liberda) +- fix: Broken arb file (Krille) +- fix: Do not unnecessary request all members in public rooms (Krille) +- fix: Remove wrong rendered linebreak in html (Krille) +- fix: Scroll down button (Krille) +- fix: Scroll up and scroll down buttons in chat list (Krille) +- fix: Scrolldown button (Krille) +- fix: Too long file name cause a render overflow (Skying) +- fix: Try to reload timeline on IOException (Krille) +- fix: User pills (Krille) +- fix: broken CI artifact uploads (TheOneWithTheBraid) +- fix: custom emote placeholder (TheOneWithTheBraid) +- fix: path of libolm (TheOneWithTheBraid) +- fix: Quick account switching (JHansen) +- fix: read reciepts (JHansen) +- perf: Use valuenotifier to not rebuild chatlist (Krille) +- refactor: Reimplement flutter matrix html locally (Krille) +- refactor: Update Roboto and Noto Emoji (The one with the Braid) +- refactor: Use AnimatedSize for FAB (Krille) +- refactor: Use DateTime for weekday localization (Malin Errenst) + +## v1.11.2 +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Polish) (Eryk Michalak) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- feat: Permission dialog before open link in browser (Krille) +- fix: Chats do not load (Krille) + +## v1.11.1 - 2023-04-20 +- fix: Download files on web and iOS with correct mimetype + +## v1.11.0 - 2023-04-14 +- feat: Add visual read marker (Krille) +- feat: Jump to last read event (Krille) +- feat: Use fragmented timeline to jump to event (Krille) +- feat: change to flutterwebauth2 (ShootingStarDragons) +- fix: Join public room (Krille) +- fix: Set fcm priority to max on android (Krille) +- refactor: CI scripts and old workarounds for build scripts (Krille) +- refactor: Client in ChatPage (Krille) +- refactor: Not nullable room in ChatPage (Krille) +- refactor: Switch to file_picker package and get rid of some dependency overrides (Krille) +- refactor: Use correct Matrix instance (Krille) +- style: Make emptypage logo bigger (Krille) +- style: Minor adjustments for modal bottom sheets (Krille) +- style: Move chats to top (Krille) +- style: Use SliverList for chatlist (Krille) +- refactor: Container -> SizedBox.shrink() (noob_tea) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Parsa) +- Translated using Weblate (Persian) (Siavash) +- Translated using Weblate (Polish) (Luna) +- Translated using Weblate (Swedish) (Kristoffer Grundström) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.10.0 - 2023-02-25 +- Added translation using Weblate (Thai) (Wphaoka) +- Added translation using Weblate (Tibetan) (Nathan Freitas) +- Default hardcoded message when l10n is not available (fabienli) +- Fix: The stable repo fingerprint (TODO the qr-code should be updated) (machiav3lli) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Suguru Hirahara) +- Translated using Weblate (Persian) (Farooq Karimi Zadeh) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Disable stable for web until script is fixed (Krille) +- chore: Display warning when logout without backup (Krille) +- chore: Downgrade flutter CI version (Krille) +- chore: Follow up audioplayer on linux (Krille) +- chore: Follow up chat encryption desgin (Krille) +- chore: Follow up fix audioplayer on android (Christian Pauly) +- chore: Follow up formatting (Christian Pauly) +- chore: Follow up formatting (Krille) +- chore: Follow up remove hero animation (Krille) +- chore: Follow up secrity settings design (Krille) +- chore: Follow up settings page (Krille) +- chore: Follow up settings page design (Christian Pauly) +- chore: Follow up style adjustments (Krille) +- chore: Lookup l10n in pushhelper if null (Krille) +- chore: Update matrix package to 0.17.0 (Krille) +- chore: Update to Flutter 3.7.1 (Krille) +- docs/qr-stable.svg: update the QR code (Aminda Suomalainen) +- feat: Enable audioplayer for web and linux (Christian Pauly) +- fix: Display error when user tries to send too large file (Christian Pauly) +- refactor: Do only instantiate AudioPlayer() object when in use (Christian Pauly) +- refactor: Remove syncstatus verbose logs (Christian Pauly) +- refactor: Store cached files in tmp directory so OS will clear file cache from time to time (Krille) +- style: Adjust key verification dialog (Christian Pauly) +- style: Bootstrap design adjustments (Christian Pauly) +- style: Encryption page adjustments (Christian Pauly) +- style: Enhance user device settings design (Krille) +- style: Enhanced chat details design (Krille) +- style: Give chat list list tiles rounded corners (Krille) +- style: Link underline color (Christian Pauly) +- style: Make adaptive bottom sheets scrollable by default (Krille) +- style: Make invite page more pretty (Krille) +- style: New settings design (Krille) +- style: Nicer chips in encryption settings and icons showing device status (Krille) +- style: Use emojis on web as well (Christian Pauly) +- style: Use robotomono to display device keys (Christian Pauly) +- utils/url_launcher: force opening http(s) links in external browser (Marcus Hoffmann) + +## v1.9.0 - 2023-01-29 +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Czech) (grreby) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Vri 🌈) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Korean) (Youngbin Han) +- Translated using Weblate (Polish) (Wiktor) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Change invite link textfield label (Krille) +- chore: Remove unused dependency (Krille) +- chore: Remove unused translations (Krille) +- chore: Update Matrix SDK and refactor (Krille) +- chore: Update dependencies (Krille) +- chore: Update flutter_map (Krille) +- chore: add integration tests (TheOneWithTheBraid) +- chore: add integration tests for spaces (TheOneWithTheBraid) +- design: More clear chat background and rounded popup menu (Krille) +- design: Nicer navigationrail (Krille) +- design: Upgrade to Flutter 3.7 +- feat: Bring back disabling the header bar on Linux desktop (q234rty) +- feat: Nicer design for abandonded DM rooms (Christian Pauly) +- fix: Archive (Krille) +- fix: Shared preferences package for flutter 3.7 (Christian Pauly) +- fix: permission of web builds (TheOneWithTheBraid) +- fix: Notification Settings (Krille) +- refactor: Migrate to Flutter 3.7.0 (Christian Pauly) +- refactor: Same animations everywhere in app (Krille) +- refactor: Stories header with futurebuilder (Krille) +- refactor: disable some redundant tests (TheOneWithTheBraid) +- style: Animate in out search results (Krille) +- style: New modal bottom sheets (Krille) +- style: Redesign public room bottomsheets (Krille) + +## v1.8.0 2022-12-30 +- Added translation using Weblate (Yue (yue_HK)) (Raatty) +- Translated using Weblate (Chinese (Simplified)) (Mike Evans) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- design: New encryption page (Krille Fear) +- feat: Add audio message support to linux (Krille Fear) +- feat: Use Android system accent color (Krille Fear) +- feat: include olm to Windows builds (TheOneWithTheBraid) +- feat: Store drafts (Krille) +- fix: Android push notification follow-up (TheOneWithTheBraid) +- fix: Content banner (Krille Fear) +- fix: Correct redacted by username (Krille Fear) +- fix: Do not setup push on every app resume (Krille Fear) +- fix: Encryption button is orange in public rooms (Krille Fear) +- fix: File event design (Krille Fear) +- fix: Hide google services warning after marked (Krille Fear) +- fix: Improve story page appearance (Reinhart Previano Koentjoro) +- fix: Libhandy windows (Krille Fear) +- fix: Monochromatic icon rendering for Android 13+ (Reinhart Previano Koentjoro) +- fix: homeserver error text not visible in app bar (TheOneWithTheBraid) +- fix: minor issues in room list (TheOneWithTheBraid) + +## v1.7.2 2022-12-19 +Update dependencies and translations. + +## v1.7.1 2022-11-23 +Minor bugfix release to retrigger build for FlatPak and Android. Fixes some style bugs and updates some translations + +## v1.7.0 2022-11-17 +FluffyChat 1.7.0 features a new way to work with spaces via a bottom navigation bar. A lot of work has also been done under the hood to make the app faster and more stable. The main color has slightly changed and the design got some finetuning. + +- chore: Add keys to roomlist and stories header (Christian Pauly) +- chore: Add unread badge to navigation rail and adjust design (Christian Pauly) +- chore: Adjust colors (Christian Pauly) +- chore: Better design chat list items (Christian Pauly) +- chore: Better load first client (Christian Pauly) +- design: Hide unimportant state events instead of folding (Christian Pauly) +- design: Improve login design (Krille Fear) +- design: Nicer display notification short texts (Christian Pauly) +- feat: background and terminated calls [android] (td) +- feat: New navigation design (Christian Pauly) +- fix: Hide password at login page (Krille Fear) +- fix: Import session on iOS (Christian Pauly) +- fix: incorrect setState inside setState in ChatListController (td) +- fix: Password not obscure for a second when submitting login textfield (Christian Pauly) +- fix: Popup menu without elevation (Christian Pauly) +- fix: Push error message (Christian Pauly) +- fix: Remove emoji picker workaround (Christian Pauly) +- fix: Set theme after start app (Christian Pauly) +- fix: Settings profile picture (Christian Pauly) +- fix: Share files (Christian Pauly) +- fix: UIA request handler (Christian Pauly) +- fix: Update emoji picker for web and desktop (Christian Pauly) +- improved (most) icons/image scaling, including avatar scaling (Mg138) +- Mention Element instead of Riot (Has been renamed about a year ago) (jooooscha) +- refactor: Chat list body code (Christian Pauly) +- refactor: Minor chatlist refactoring (Christian Pauly) +- refactor: No longer need selected of chat list tile (Christian Pauly) +- refactor: Remove unused dependencies (Krille Fear) +- Added translation using Weblate (Hindi) (Hemish) +- Added translation using Weblate (Occidental) (OIS) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Raatty) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Raatty) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Finnish) (Raatty) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Lithuanian) (Anonimas) +- Translated using Weblate (Occidental) (OIS) +- Translated using Weblate (Persian) (Anastázius Darián) +- Translated using Weblate (Persian) (Anastázius Kaejatídarján) +- Translated using Weblate (Persian) (Seyedmahdi Moosavyan) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Turkish) (Raatty) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Raatty) + +## v1.6.4 - 2022-09-08 +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Slovak) (Marek Ľach) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Adjust bubble color in dark mode (Christian Pauly) +- chore: Update matrix sdk (Christian Pauly) +- chore: Update to flutter 3.3.0 (Christian Pauly) +- feat: Automatic key requests and better key error dialog (Christian Pauly) +- fix: Styling and notification settings (Christian Pauly) +- fix: add missing command localizations (Christian Pauly) + +## v1.6.3 - 2022-08-25 +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Russian) (Sergey Shavin) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Migrate back to flutter hive collections (Christian Pauly) +- chore: Update provider package and remove dep override (Christian Pauly) +- fix: Do not display push events for unknown event types (Christian Pauly) +- refactor: App widget (Christian Pauly) + +## v1.6.0 - 2022-07-31 +FluffyChat 1.6.0 features a lot of bug fixes and improvements. The code base has been +simplified and the drawer on the chat list page got a come-back. Some new features like +the space hierarchy and session dump have been implemented. + +- feat: Added monochrome entry for themed icon support in Android 13 (James Reilly) +- feat: Display timeline of messages in android notification (Christian Pauly) +- feat: Emoji related fixes (TheOneWithTheBraid) +- feat: Implement deleting pushers in app (Christian Pauly) +- feat: New material 3 design (Christian Pauly) +- feat: Redesign bootsstrap and offer secure storage support (Christian Pauly) +- feat: Send multiple images at once (Christian Pauly) +- feat: implement session dump (TheOneWithTheBraid) +- feat: implement space hierarchy (TheOneWithTheBraid) +- feat: introduce extended integration tests (TheOneWithTheBraid) +- feat: libhandy integration (TheOneWithTheBraid) +- fix: Clearing push triggered when only one room got seen (Christian Pauly) +- fix: Dont display loading dialog when adding reaction (Christian Pauly) +- fix: Follow up for spaces hierarchy (TheOneWithTheBraid) +- fix: Missing null checks in chat details view (Christian Pauly) +- fix: Non FCM Android builds crash on start (Christian Pauly) +- fix: Permission chooser dialog on iOS (Christian Pauly) +- fix: Set avatar on only single action available (Christian Pauly) +- fix: Sharing on iOS and iPad (Christian Pauly) +- fix: Unread bubble is invisible in dark mode (Christian Pauly) +- fix: appimage builds (TheOneWithTheBraid) +- fix: only use custom http client on android (Jayesh Nirve) +- fix: pass isrg cert to http client (Jayesh Nirve) +- refactor: Chat view (Christian Pauly) +- refactor: Encryption button (Christian Pauly) +- refactor: Remove duplicated imports (Christian Pauly) +- refactor: Remove legacy store (Christian Pauly) +- refactor: Remove presence status feature (Christian Pauly) +- refactor: Simplify MxcImage and replace CachedNetworkImage (Christian Pauly) +- refactor: Switch to Hive Collections DB (Christian Pauly) +- refactor: move start chat FAB to implementation file (TheOneWithTheBraid) +- Translated using Weblate (Catalan) (Alfonso Montero López) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Amir Hossein Maher) +- Translated using Weblate (Polish) (Przemysław Romanik) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Add border to avatars (Christian Pauly) +- chore: Add fancy hero animations (Christian Pauly) +- chore: Adjust appbar design (Christian Pauly) +- chore: Adjust design (Christian Pauly) +- chore: Adjust search bar design (Christian Pauly) +- chore: Always display header elevation in chat (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Disable integration tests without runners (Krille Fear) +- chore: Enhance invitiation UX (Christian Pauly) +- chore: Make push helper more fail safe (Christian Pauly) +- chore: Make push helper more stable (Christian Pauly) +- chore: Minor design improvements (Christian Pauly) +- chore: Pinned events design (Christian Pauly) +- chore: Remove permission handler dependency and increase compileSdkVersion (Christian Pauly) +- chore: Switch to flutter 3.0.5 (Krille Fear) +- chore: Update SDK (Christian Pauly) +- chore: remove snapping sheet (TheOneWithTheBraid) + ## v1.5.0 - 2022-06-03 - Translated using Weblate (Ukrainian) (Ihor Hordiichuk) - feat: Better sign up UX and allow signup without password (Christian Pauly) diff --git a/Dockerfile b/Dockerfile index 269f8774b3..831ba871d3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,18 @@ -FROM cirrusci/flutter as builder -RUN sudo apt update && sudo apt install curl -y +FROM ghcr.io/cirruslabs/flutter as builder +RUN sudo apt update && sudo apt install curl wget jq -y + +WORKDIR /tmp +RUN wget https://github.com/mikefarah/yq/releases/download/v4.40.5/yq_linux_amd64.tar.gz +RUN tar -xzvf ./yq_linux_amd64.tar.gz +RUN mv yq_linux_amd64 /usr/bin/yq + COPY . /app WORKDIR /app RUN ./scripts/prepare-web.sh -RUN ./scripts/build-web.sh +COPY config.* /app/ +RUN flutter pub get +RUN flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps FROM docker.io/nginx:alpine RUN rm -rf /usr/share/nginx/html -COPY --from=builder /app/build/web /usr/share/nginx/html \ No newline at end of file +COPY --from=builder /app/build/web /usr/share/nginx/html diff --git a/PRIVACY.md b/PRIVACY.md index 6092557751..8c1ca45e58 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -2,39 +2,32 @@ FluffyChat is available on Android, iOS and as a web version. Desktop versions for Windows, Linux and macOS may follow. -* [Matrix](#1) -* [Sentry](#2) -* [Database](#3) -* [Encryption](#4) -* [App Permissions](#5) -* [Push Notifications](#6) -* [Stories](#7) - -## Matrix +* [Matrix](#matrix) +* [Database](#database) +* [Encryption](#encryption) +* [App Permissions](#app-permissions) +* [Push Notifications](#push-notifications) + +## Matrix FluffyChat uses the Matrix protocol. This means that FluffyChat is just a client that can be connected to any compatible matrix server. The respective data protection agreement of the server selected by the user then applies. For convenience, one or more servers are set as default that the FluffyChat developers consider trustworthy. The developers of FluffyChat do not guarantee their trustworthiness. Before the first communication, users are informed which server they are connecting to. -FluffyChat only communicates with the selected server, with sentry.io if enabled and with [OpenStreetMap](https://openstreetmap.org) to display maps. +FluffyChat only communicates with the selected server and with [OpenStreetMap](https://openstreetmap.org) to display maps. More information is available at: [https://matrix.org](https://matrix.org) -## Sentry -FluffyChat uses Sentry for crash reports if the user allows it. - -More information is available at: [https://sentry.io](https://sentry.io) - -## Database -FluffyChat caches some data received from the server in a local database on the device of the user. +## Database +FluffyChat caches some data received from the server in a local sqflite database on the device of the user. On web indexedDB is used. FluffyChat always tries to encrypt the database by using SQLCipher and stores the encryption key in the [Secure Storage](https://pub.dev/packages/flutter_secure_storage) of the device. -More information is available at: [https://pub.dev/packages/hive](https://pub.dev/packages/hive) +More information is available at: [https://pub.dev/packages/sqflite](https://pub.dev/packages/sqflite) and [https://pub.dev/packages/sqlcipher_flutter_libs](https://pub.dev/packages/sqlcipher_flutter_libs) -## Encryption +## Encryption All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it. -FluffyChat is able to use End-To-End-Encryption as a tech preview. +FluffyChat also uses End-To-End-Encryption by using [libolm](https://gitlab.matrix.org/matrix-org/olm) and enables it by default for private chats. -## App Permissions +## App Permissions The permissions are the same on Android and iOS but may differ in the name. This are the Android Permissions: @@ -57,7 +50,7 @@ The user is able to send files from the device's file system. #### Location FluffyChat makes it possible to share the current location via the chat. When the user shares their location, FluffyChat uses the device location service and sends the geo-data via Matrix. -## Push Notifications +## Push Notifications FluffyChat uses the Firebase Cloud Messaging service for push notifications on Android and iOS. This takes place in the following steps: 1. The matrix server sends the push notification to the FluffyChat Push Gateway 2. The FluffyChat Push Gateway forwards the message in a different format to Firebase Cloud Messaging @@ -99,23 +92,3 @@ A typical push notification could look like this: ``` FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data. - -## Stories - -FluffyChat supports stories which is a feature similar to WhatsApp status or Instagram stories. However it is just a different GUI for the same room-related communication. More information about the feature can be found here: - -https://github.com/krillefear/matrix-doc/blob/main/proposals/3588-stories-as-rooms.md - -Stories are basically: - -- End to end encrypted rooms -- Read-only rooms with only one admin who can post stuff (while there is no technical limitation to have multiple admins) - -By default: - -- The user has to invite all contacts manually to a story room -- The user can only invite contacts (matrix users the user shares a DM room with) to the story room -- The story room is created when the first story is posted -- User can mute and leave story rooms - -The user is informed in the app that in theory all contacts can see each other in the story room. The user must give consent here. However the user is at any time able to create a group chat and invite all of their contacts to this chat in any matrix client which has the same result. diff --git a/README.md b/README.md index 2f8a43753e..8dec175738 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,60 @@ -![](https://i.imgur.com/wi7RlVt.png) - -

- Join the community - Follow me on Mastodon - Translate FluffyChat - Translate the website - Website - Famedly Matrix SDK - Server hosting and professional support -

- - -FluffyChat is an open source, nonprofit and cute matrix messenger app. The app is easy to use but secure and decentralized. - -## Features - -- Send all kinds of messages, images and files -- Voice messages -- Location sharing -- Push notifications -- Unlimited private and public group chats -- Public channels with thousands of participants -- Feature rich group moderation including all matrix features -- Discover and join public groups -- Dark mode -- Custom themes -- Hides complexity of Matrix IDs behind simple QR codes -- Custom emotes and stickers -- Spaces -- Compatible with Element, Nheko, NeoChat and all other Matrix apps -- End to end encryption -- Emoji verification & cross signing -- And much more... +![Screenshot](https://github.com/krille-chan/fluffychat/blob/main/assets/banner_transparent.png?raw=true) + +[FluffyChat](https://fluffychat.im) is an open source, nonprofit and cute [[matrix](https://matrix.org)] client written in [Flutter](https://flutter.dev). The goal of the app is to create an easy to use instant messenger which is open source and accessible for everyone. + +### Links: + +- 🌐 [[Weblate] Translate FluffyChat into your language](https://hosted.weblate.org/projects/fluffychat/) +- 🌍 [[m] Join the community](https://matrix.to/#/#fluffychat:matrix.org) +- 📰 [[Mastodon] Get updates on social media](https://mastodon.art/@krille) +- 🖥️ [[Famedly] Server hosting and professional support](https://famedly.com/kontakt) +- 💝 [[Liberapay] Support FluffyChat development](https://de.liberapay.com/KrilleChritzelius) + +Buy Me a Coffee at ko-fi.com + +### Screenshots: + +![Screenshot](https://github.com/krille-chan/fluffychat/blob/main/docs/screenshots/product.jpeg?raw=true) + +# Features + +- 📩 Send all kinds of messages, images and files +- 🎙️ Voice messages +- 📍 Location sharing +- 🔔 Push notifications +- 💬 Unlimited private and public group chats +- 📣 Public channels with thousands of participants +- 🛠️ Feature rich group moderation including all matrix features +- 🔍 Discover and join public groups +- 🌙 Dark mode +- 🎨 Material You design +- 📟 Hides complexity of Matrix IDs behind simple QR codes +- 😄 Custom emotes and stickers +- 🌌 Spaces +- 🔄 Compatible with Element, Nheko, NeoChat and all other Matrix apps +- 🔐 End to end encryption +- 🔒 Encrypted chat backup +- 😀 Emoji verification & cross signing + +... and much more. + # Installation -Please visit our website for installation instructions: +Please visit the website for installation instructions: -https://fluffychat.im +- https://fluffychat.im # How to build -Please visit our Wiki for build instructions: +Please visit the [Wiki](https://github.com/krille-chan/fluffychat/wiki) for build instructions: -https://gitlab.com/famedly/fluffychat/-/wikis/How-To-Build +- https://github.com/krille-chan/fluffychat/wiki/How-To-Build # Special thanks -* Fabiyamada is a graphics designer from Brasil and has made the fluffychat logo and the banner. Big thanks for her great designs. +* Fabiyamada is a graphics designer and has made the fluffychat logo and the banner. Big thanks for her great designs. * Advocatux has made the Spanish translation with great love and care. He always stands by my side and supports my work with great commitment. @@ -54,4 +66,4 @@ https://gitlab.com/famedly/fluffychat/-/wikis/How-To-Build * WoodenBeaver sound theme for the notification sound. -* The Matrix Foundation for making and maintaining the [emoji translations](https://github.com/matrix-org/matrix-doc/blob/main/data-definitions/sas-emoji.json) used for emoji verification, licensed Apache 2.0 +* The Matrix Foundation for making and maintaining the [emoji translations](https://github.com/matrix-org/matrix-spec/blob/main/data-definitions/sas-emoji.json) used for emoji verification, licensed Apache 2.0 diff --git a/TRANSLATORS_GUIDE.md b/TRANSLATORS_GUIDE.md deleted file mode 100644 index d5bc4f8fe6..0000000000 --- a/TRANSLATORS_GUIDE.md +++ /dev/null @@ -1,35 +0,0 @@ -# Translators Guide - -There are 3 main types of strings to be translated. - -## Simple -``` -Add new friend -``` -They are just plain text and are to be translated in full. - -## Placeholder -``` -{username} changed their avatar -``` -Contains one or more words surrounded by curly brackets "`{}`". Anything outside of the curly brackets is to be translated as normal, but the words in the curly brackets are **NOT** to be translated. In the above example "`{username}`" will be replaced by the users actual username by FluffyChat. - -## Plural - -- {count,plural, =1{**1 more event**} other{{count} **more events**}} - -This is the most complicated string type, the parts in bold are the only parts that need translating in this string. You can identify plural strings by seeing the pattern `{word,plural,` at the start. `=1` and `other` are "selectors" so you can have multiple different translations for different quantities. `other` is the only required selector and will be chosen if the count does not match any other selectors. - -Selector | Matches ----|--- -=0 | a count of exactly 0 -=1 | a count of exactly 1 -=2 | a count of exactly 2 -other | any number unless it matches a more specific rule - -There is also "few" and "many", but they seem to have language specific meaning. - -Also the selectors do not need to match the English version such as your language may not even use different words for when there is more than one of something so: - - {count,plural, other{{count} \}} - -could be a perfectly resonable way to translate. diff --git a/analysis_options.yaml b/analysis_options.yaml index 6de1bcc6b2..d74b363557 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -8,11 +8,13 @@ linter: - prefer_final_locals - prefer_final_in_for_each - sort_pub_dependencies + - require_trailing_commas + - omit_local_variable_types analyzer: errors: todo: ignore - import_of_legacy_library_into_null_safe: ignore + use_build_context_synchronously: ignore exclude: - lib/generated_plugin_registrant.dart - lib/l10n/*.dart diff --git a/android/.gitignore b/android/.gitignore index bc2100d8f7..6f568019d3 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -5,3 +5,9 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle index fba903e3a4..f92f73f38a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,10 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" + //id "com.google.gms.google-services" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +13,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -21,10 +23,6 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { @@ -32,7 +30,7 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion 32 + compileSdkVersion 34 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -44,8 +42,8 @@ android { defaultConfig { applicationId "chat.fluffy.fluffychat" - minSdkVersion 16 - targetSdkVersion 30 + minSdkVersion 21 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -65,11 +63,19 @@ android { buildTypes { debug { signingConfig signingConfigs.debug + versionNameSuffix "-debug" } release { signingConfig signingConfigs.release } } + // https://stackoverflow.com/a/77494454/8222484 + packagingOptions { + pickFirst 'lib/x86/libc++_shared.so' + pickFirst 'lib/x86_64/libc++_shared.so' + pickFirst 'lib/armeabi-v7a/libc++_shared.so' + pickFirst 'lib/arm64-v8a/libc++_shared.so' + } } flutter { @@ -77,9 +83,10 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 implementation 'androidx.multidex:multidex:2.0.1' } -//apply plugin: 'com.google.gms.google-services' +configurations.all { + exclude group: 'com.google.android.gms' +} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000000..d0e0fbc9b9 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1 @@ +-keep class net.sqlcipher.** { *; } \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index fc480dc268..0000000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ff394d9db6..da6536ce67 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -14,19 +14,20 @@ - - - - + + + + + - + tools:overrideLibrary="io.wazo.callkeep, net.touchcapture.qr.flutterqr, com.cloudwebrtc.webrtc, org.webrtc, com.it_nomads.fluttersecurestorage, com.pichillilorenzo.flutter_inappwebview, com.example.video_compress, com.otaliastudios.transcoder, com.otaliastudios.opengl, com.kineapps.flutter_file_dialog, com.llfbandit.record, com.pravera.flutter_foreground_task"/> + + + + @@ -58,42 +65,46 @@ android:scheme="https" android:host="matrix.to"/> + + + + + + + + - - - - - - + - + - + - + @@ -109,6 +120,20 @@ + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_monochrome.xml b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000000..f0b10e7d69 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index ef49c99170..1084c24082 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index fc480dc268..0000000000 --- a/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/build.gradle b/android/build.gradle index 85aa864702..baaf5430de 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,32 +1,41 @@ -buildscript { - ext.kotlin_version = '1.6.10' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - //classpath 'com.google.gms:google-services:4.3.8' - } -} - allprojects { repositories { google() - jcenter() + mavenCentral() } } rootProject.buildDir = '../build' + +// Workaround for building with Flutter 3.24 +// See: https://github.com/flutter/flutter/issues/153281#issuecomment-2292201697 subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" + afterEvaluate { project -> + if (project.extensions.findByName("android") != null) { + Integer pluginCompileSdk = project.android.compileSdk + if (pluginCompileSdk != null && pluginCompileSdk < 31) { + project.logger.error( + "Warning: Overriding compileSdk version in Flutter plugin: " + + project.name + + " from " + + pluginCompileSdk + + " to 31 (to work around https://issuetracker.google.com/issues/199180389)." + + "\nIf there is not a new version of " + project.name + ", consider filing an issue against " + + project.name + + " to increase their compileSdk to the latest (otherwise try updating to the latest version)." + ) + project.android { + compileSdk 31 + } + } + } + } } subprojects { - project.evaluationDependsOn(':app') + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(":app") } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile index a0d4846754..804cd4b2b6 100644 --- a/android/fastlane/Fastfile +++ b/android/fastlane/Fastfile @@ -10,6 +10,9 @@ # https://docs.fastlane.tools/plugins/available-plugins # +# Workaround for https://github.com/fastlane/fastlane/issues/21507#issuecomment-1723116829 +ENV['SUPPLY_UPLOAD_MAX_RETRIES']='5' + # Uncomment the line if you want fastlane to automatically update itself update_fastlane @@ -41,14 +44,28 @@ platform :android do json_key: "./keys.json" ) last_version = versions[0].to_i - upload_to_play_store(track: 'internal', aab: '../build/app/outputs/bundle/release/app-release.aab', version_code: "#{last_version+1}") + upload_to_play_store( + track: 'internal', + aab: '../build/app/outputs/bundle/release/app-release.aab', + version_code: "#{last_version+1}", + ) end lane :deploy_candidate do - upload_to_play_store(track: 'internal', track_promote_to: "beta", deactivate_on_promote: false, skip_upload_changelogs: true) + upload_to_play_store( + track: 'internal', + track_promote_to: "beta", + deactivate_on_promote: false, + skip_upload_changelogs: true, + ) end lane :deploy_release do - upload_to_play_store(track: 'beta', track_promote_to: "production", deactivate_on_promote: false, skip_upload_changelogs: true) + upload_to_play_store( + track: 'internal', + track_promote_to: "production", + deactivate_on_promote: false, + skip_upload_changelogs: true, + ) end end diff --git a/android/fastlane/README.md b/android/fastlane/README.md index aa5e6dbbcc..300ccee8c1 100644 --- a/android/fastlane/README.md +++ b/android/fastlane/README.md @@ -1,39 +1,56 @@ fastlane documentation -================ +---- + # Installation Make sure you have the latest version of the Xcode command line tools installed: -``` +```sh xcode-select --install ``` -Install _fastlane_ using -``` -[sudo] gem install fastlane -NV -``` -or alternatively using `brew install fastlane` +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) # Available Actions + ## Android + ### android set_build_code_internal -``` -fastlane android set_build_code_internal + +```sh +[bundle exec] fastlane android set_build_code_internal ``` + + ### android deploy_internal_test + +```sh +[bundle exec] fastlane android deploy_internal_test ``` -fastlane android deploy_internal_test + + + +### android deploy_candidate + +```sh +[bundle exec] fastlane android deploy_candidate ``` + + ### android deploy_release + +```sh +[bundle exec] fastlane android deploy_release ``` -fastlane android deploy_release -``` + ---- This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. -More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). -The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/android/fastlane/metadata/android/en-US/changelogs/2324 (1.6.0).txt b/android/fastlane/metadata/android/en-US/changelogs/2324 (1.6.0).txt new file mode 100644 index 0000000000..b2318505fe --- /dev/null +++ b/android/fastlane/metadata/android/en-US/changelogs/2324 (1.6.0).txt @@ -0,0 +1,68 @@ +FluffyChat 1.6.0 features a lot of bug fixes and improvements. The code base has been +simplified and the drawer on the chat list page got a come-back. Some new features like +the space hierarchy and session dump have been implemented. + +- feat: Added monochrome entry for themed icon support in Android 13 (James Reilly) +- feat: Display timeline of messages in android notification (Christian Pauly) +- feat: Emoji related fixes (TheOneWithTheBraid) +- feat: Implement deleting pushers in app (Christian Pauly) +- feat: New material 3 design (Christian Pauly) +- feat: Redesign bootsstrap and offer secure storage support (Christian Pauly) +- feat: Send multiple images at once (Christian Pauly) +- feat: implement session dump (TheOneWithTheBraid) +- feat: implement space hierarchy (TheOneWithTheBraid) +- feat: introduce extended integration tests (TheOneWithTheBraid) +- feat: libhandy integration (TheOneWithTheBraid) +- fix: Clearing push triggered when only one room got seen (Christian Pauly) +- fix: Dont display loading dialog when adding reaction (Christian Pauly) +- fix: Follow up for spaces hierarchy (TheOneWithTheBraid) +- fix: Missing null checks in chat details view (Christian Pauly) +- fix: Non FCM Android builds crash on start (Christian Pauly) +- fix: Permission chooser dialog on iOS (Christian Pauly) +- fix: Set avatar on only single action available (Christian Pauly) +- fix: Sharing on iOS and iPad (Christian Pauly) +- fix: Unread bubble is invisible in dark mode (Christian Pauly) +- fix: appimage builds (TheOneWithTheBraid) +- fix: only use custom http client on android (Jayesh Nirve) +- fix: pass isrg cert to http client (Jayesh Nirve) +- refactor: Chat view (Christian Pauly) +- refactor: Encryption button (Christian Pauly) +- refactor: Remove duplicated imports (Christian Pauly) +- refactor: Remove legacy store (Christian Pauly) +- refactor: Remove presence status feature (Christian Pauly) +- refactor: Simplify MxcImage and replace CachedNetworkImage (Christian Pauly) +- refactor: Switch to Hive Collections DB (Christian Pauly) +- refactor: move start chat FAB to implementation file (TheOneWithTheBraid) +- Translated using Weblate (Catalan) (Alfonso Montero López) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Amir Hossein Maher) +- Translated using Weblate (Polish) (Przemysław Romanik) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Add border to avatars (Christian Pauly) +- chore: Add fancy hero animations (Christian Pauly) +- chore: Adjust appbar design (Christian Pauly) +- chore: Adjust design (Christian Pauly) +- chore: Adjust search bar design (Christian Pauly) +- chore: Always display header elevation in chat (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Disable integration tests without runners (Krille Fear) +- chore: Enhance invitiation UX (Christian Pauly) +- chore: Make push helper more fail safe (Christian Pauly) +- chore: Make push helper more stable (Christian Pauly) +- chore: Minor design improvements (Christian Pauly) +- chore: Pinned events design (Christian Pauly) +- chore: Remove permission handler dependency and increase compileSdkVersion (Christian Pauly) +- chore: Switch to flutter 3.0.5 (Krille Fear) +- chore: Update SDK (Christian Pauly) +- chore: remove snapping sheet (TheOneWithTheBraid) \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt b/android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt deleted file mode 100644 index 10f77f4f91..0000000000 --- a/android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt +++ /dev/null @@ -1 +0,0 @@ -Check out https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/CHANGELOG.md for the changelog. \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/full_description.txt b/android/fastlane/metadata/android/en-US/full_description.txt index 2118515f44..64d6b1cefb 100644 --- a/android/fastlane/metadata/android/en-US/full_description.txt +++ b/android/fastlane/metadata/android/en-US/full_description.txt @@ -1,4 +1,4 @@ -FluffyChat is an open, nonprofit and cute matrix messenger app for Ubuntu Touch, Android and iOS. +FluffyChat is an open, nonprofit and cute Matrix messenger app for Ubuntu Touch, Android and iOS. Open Opensource and open development where everyone can join. @@ -9,7 +9,7 @@ FluffyChat is donation funded. Cute ♥ Cute design and many theme settings including a dark mode. -One-to-one and groupchats +One-to-one and group chats Unlimited groups and direct chats. Easy @@ -22,11 +22,11 @@ Decentralized There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host your own. Compatible -Compatible with Riot, Fractal, Nekho and all matrix messengers. +Compatible with Element, Fractal, Nheko and all Matrix messengers. FluffyChat comes with a dream Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends. -A world where there are no companies spying on you when you send selfies to friends and lovers. -And a world where apps are made for fluffyness and not for profit. ♥ \ No newline at end of file +A world where there are no companies spying on you when you send selfies to friends and your loved. +And a world where apps are made for fluffyness and not for profit. ♥ diff --git a/android/fastlane/report.xml b/android/fastlane/report.xml index 2123376e30..96f7a8a63b 100644 --- a/android/fastlane/report.xml +++ b/android/fastlane/report.xml @@ -5,17 +5,17 @@ - + - + - + diff --git a/android/gradle.properties b/android/gradle.properties index 19c6710d52..94adc3a3f9 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,3 @@ org.gradle.jvmargs=-Xmx1536M -android.enableR8=true android.useAndroidX=true android.enableJetifier=true -android.enableR8.fullMode=true \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 71a1ffc9eb..cc5527d781 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 5a2f14fb18..b2fd960a7b 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,15 +1,26 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.1.2" apply false + id "org.jetbrains.kotlin.android" version "1.8.0" apply false + // id "com.google.gms.google-services" version "4.3.8" apply false } + +include ":app" \ No newline at end of file diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle deleted file mode 100644 index e7b4def49c..0000000000 --- a/android/settings_aar.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/assets/backup.png b/assets/backup.png deleted file mode 100644 index b17a7614ac..0000000000 Binary files a/assets/backup.png and /dev/null differ diff --git a/assets/banner_dark.png b/assets/banner_dark.png deleted file mode 100644 index 3a2fb2a7c0..0000000000 Binary files a/assets/banner_dark.png and /dev/null differ diff --git a/assets/banner_transparent.png b/assets/banner_transparent.png new file mode 100644 index 0000000000..7e576c6f49 Binary files /dev/null and b/assets/banner_transparent.png differ diff --git a/assets/chat.svg b/assets/chat.svg deleted file mode 100644 index b80f20d6bd..0000000000 --- a/assets/chat.svg +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/colors.png b/assets/colors.png deleted file mode 100644 index 27c996adb6..0000000000 Binary files a/assets/colors.png and /dev/null differ diff --git a/assets/favicon.ico b/assets/favicon.ico deleted file mode 100644 index 52c44a4345..0000000000 Binary files a/assets/favicon.ico and /dev/null differ diff --git a/assets/info-logo.png b/assets/info-logo.png index 1232a3c173..ceb42f09b5 100644 Binary files a/assets/info-logo.png and b/assets/info-logo.png differ diff --git a/assets/js/package/.gitkeep b/assets/js/package/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/js/package/olm.js b/assets/js/package/olm.js deleted file mode 100644 index a0a08e3d3b..0000000000 --- a/assets/js/package/olm.js +++ /dev/null @@ -1 +0,0 @@ -// Dummy file :-) diff --git a/assets/l10n/intl_ar.arb b/assets/l10n/intl_ar.arb index 7472f94618..b1848ba5fe 100644 --- a/assets/l10n/intl_ar.arb +++ b/assets/l10n/intl_ar.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} قبل الدعوة", + "acceptedTheInvitation": "👍 {username} قبل الدعوة", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,23 +23,13 @@ "type": "text", "placeholders": {} }, - "accountInformation": "معلومات الحساب", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} فعَّل تشفير طرف لطرف", + "activatedEndToEndEncryption": "🔐 تم تنشيط {username} التشفير من طرف إلى طرف", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "addGroupDescription": "أضف وصف للمجموعة", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "المدير", "@admin": { "type": "text", @@ -50,11 +40,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "عندك حساب؟", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} أجاب على المكالمة", "@answeredTheCall": { "type": "text", @@ -72,11 +57,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "غرفة مؤرشفة", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "هل يُسمح للزوار الدخول", "@areGuestsAllowedToJoin": { "type": "text", @@ -87,21 +67,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "لتتمكن من التأكد من الشخص الآخر، يرجى إدخال عبارة المرور أو مفتاح الاسترداد.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "يرجى إدخال عبارة المرور أو مفتاح الاسترداد للتحقق من جلستك.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "أتقبل طلب تحقق {username}؟", "@askVerificationRequest": { "type": "text", @@ -109,16 +79,6 @@ "username": {} } }, - "authentication": "الاستيثاق", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "غُيّرت الصورة الشخصية", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "banFromChat": "حظر من المحادثة", "@banFromChat": { "type": "text", @@ -142,11 +102,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "المفاتيح المخزنة على الذاكرة المؤقتة", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "ألغِ", "@cancel": { "type": "text", @@ -256,16 +211,6 @@ "username": {} } }, - "changelog": "سجل التغييرات", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "حُفظت التغييرات", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "غيّر الخادم", "@changeTheHomeserver": { "type": "text", @@ -281,16 +226,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "غيِّر الخادم", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "غيِّر الخلفية", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "فسُد التشفير", "@channelCorruptedDecryptError": { "type": "text", @@ -311,22 +246,17 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "اختر اسم المستخدم", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "close": "اغلق", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "تأكد من أن هذه الإيموجي تطابق الموجودة على الأجهزة الأخرى:", + "compareEmojiMatch": "يرجى مقارنة الرموز التعبيرية", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "تأكد من أن هذه الأرقام تطابق الموجودة على الأجهزة الأخرى:", + "compareNumbersMatch": "الرجاء مقارنة الأرقام", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -341,21 +271,11 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "فشلت محاولة الاتصال", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "دعيَ المراسل للمجموعة", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "contentViewer": "عارض المحتوى", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "نُسخ للحافظة", "@copiedToClipboard": { "type": "text", @@ -373,16 +293,6 @@ "error": {} } }, - "couldNotSetAvatar": "تعذر تعيين الصورة الشخصية", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "تعذر تعيين الاسم العلني", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} منتسبا", "@countParticipants": { "type": "text", @@ -395,33 +305,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "أنشئ حسابًا الآن", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "أنشأ {username} المحادثة", + "createdTheChat": "💬 أنشأ {username} المحادثة", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "أنشئ مجموعة جديدة", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "التأكد المتبادل متوقف", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "التأكد المتبادل مفعل", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "نشطٌ حاليا", "@currentlyActive": { "type": "text", @@ -477,11 +367,6 @@ "type": "text", "placeholders": {} }, - "deny": "رفض", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "جهاز", "@device": { "type": "text", @@ -492,21 +377,11 @@ "type": "text", "placeholders": {} }, - "discardPicture": "أهمل الصورة", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "غُيِّر الاسم العلني", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "تبرع", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "نزِّل الملف", "@downloadFile": { "type": "text", @@ -517,11 +392,6 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "غيِّر خادم جيتسي", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "emoteExists": "الانفعالة موجودة مسبقا!", "@emoteExists": { "type": "text", @@ -562,21 +432,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "خوارزمية التشفير", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "التشفير معطل", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "إعدادات تشفير الطرف لطرف", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "أنهى {senderName} المكالمة", "@endedTheCall": { "type": "text", @@ -584,16 +444,6 @@ "senderName": {} } }, - "enterAGroupName": "أدخل اسم المجموعة", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "أدخل اسم المستخدم", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "أدخل الخادم", "@enterYourHomeserver": { "type": "text", @@ -604,11 +454,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "حجم الملف", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "فلافي-شات", "@fluffychat": { "type": "text", @@ -619,11 +464,6 @@ "type": "text", "placeholders": {} }, - "friday": "الجمعة", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "من بعد الانضمام", "@fromJoining": { "type": "text", @@ -639,16 +479,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "وصف المجموعة", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "غُيِّر وصف المجموعة", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "المجموعة عامة", "@groupIsPublic": { "type": "text", @@ -684,11 +514,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "الخادم ليس متوافقًا", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "id": "المعرّف", "@id": { "type": "text", @@ -704,16 +529,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "يمكنك تجاهل المستخدمين المزعجين، لن يتمكنوا من مراسلتك أو دعوتك لغرفة ما داموا في قائمة التجاهل.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "تجاهل اسم المستخدم", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "incorrectPassphraseOrKey": "عبارة مرور أو مفتاح استرداد خطأ", "@incorrectPassphraseOrKey": { "type": "text", @@ -736,7 +551,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} دعى {targetName}", + "invitedUser": "📩 {username} دعا {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -749,7 +564,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "دعاك {username} لاستخدام فلافي-شات. \n1. ثبت فلافي-شات: https://fluffychat.im \n2. لج أو سجل\n3. افتح رابط الدعوة: {link}", + "inviteText": "دعاك {username} إلى FluffyChat.\n1. قم بزيارة موقع fluffychat.im وقم بتثبيت التطبيق\n2. قم بإنشاءحساب أو تسجيل الدخول\n3. افتح رابط الدعوة:\n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -757,17 +572,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "هل مفتاح الجهاز صحيح؟", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "يكتب…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "انضم {username} للمحادثة", + "joinedTheChat": "👋 انضم {username} إلى المحادثة", "@joinedTheChat": { "type": "text", "placeholders": { @@ -779,17 +589,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "المفاتيح محفوظة على ذاكرة التخزين المؤقتة", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "المفاتيح مفقودة", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} طرد {targetName}", + "kicked": "👞 {username} ركل {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -797,7 +597,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} طرد وحظر {targetName}", + "kickedAndBanned": "🙅 {username} ركل وحظر {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -817,16 +617,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "آخر عنوان IP مسجل", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "آخر ظهور كان منذ زمن طويل", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "غادر", "@leave": { "type": "text", @@ -881,36 +671,11 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "اجعله مشرفًا", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "اجعله مديرًا", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "تأكد من صحة المعرّف", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "ستحذف الرسالة عند كل المنتسبين", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "مشرف", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "الثلاثاء", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "أكتم الماحدثة", "@muteChat": { "type": "text", @@ -921,7 +686,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "رسالة جديدة في فلافي-شات", + "newMessageInFluffyChat": "💬 رسالة جديدة في FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -936,26 +701,16 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat حالياً لا يدعم تفعيل التأكد المتبادل. الرجاء تفعيله من خلال تطبيق Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "لم يُعثر على انفعالة. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "يبدو أنك لا تستخدم خدمات غوغل على هاتفك. هذا قرار جيد للحفاظ على خصوصيتك! من أجل استلام الإشعارات في FluffyChat نقترح استخدام https://microg.org أو https://unifiedpush.org.", + "noGoogleServicesWarning": "يبدو أن خدمة Firebase Cloud Messaging غير متاحة على جهازك. لمواصلة تلقي الإشعارات، نوصي بتثبيت ntfy. باستخدام ntfy أو أي مزود خدمة Unified Push آخر، يمكنك تلقي إشعارات الدفع بطريقة آمنة للبيانات. يمكنك تنزيل ntfy من PlayStore أو من F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "يرجى تشغيل النسخ الاحتياطي عبر الإنترنت من داخل تطبيق Element بدلاً من ذلك.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "بدون", "@none": { "type": "text", @@ -971,34 +726,17 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "غير مدعوم في الويب", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "حُدد {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "ok": "موافق", "@ok": { "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "تم تعطيل النسخ الاحتياطي للمفاتيح عبر الإنترنت", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "تم تفعيل النسخ الاحتياطي للمفاتيح عبر الإنترنت", "@onlineKeyBackupEnabled": { "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "عذراً، هناك خطأ ما…", + "oopsSomethingWentWrong": "عفوًا، حدث خطأ ما…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1013,16 +751,6 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "اسم المجموعة (اختياري)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "أجهزة المنتسبين", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "عبارة المرور أو مفتاح الاستعادة", "@passphraseOrKey": { "type": "text", @@ -1055,16 +783,6 @@ "fileName": {} } }, - "pleaseChooseAUsername": "اختر اسم المستخدم", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "أدخل معرف Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "أدخل كلمة السر", "@pleaseEnterYourPassword": { "type": "text", @@ -1141,11 +859,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "أزل رسالة", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "صيّر الرسائل ذات المحتوى الكبير", "@renderRichContent": { "type": "text", @@ -1161,31 +874,11 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "أطلب السماح بقراءة الرسائل القديمة", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "أبطل كل الأذون", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "رُقيّت الغرفة", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "السبت", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "ابحث عن محادثة", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "seenByUser": "رآه {username}", "@seenByUser": { "type": "text", @@ -1193,22 +886,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{رآه {username} و {count} أخرون}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "رآه {username} و {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "أرسل", "@send": { "type": "text", @@ -1224,11 +901,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "اسمح بإرسال تقريرات عن العلل باستخدام sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "أرسل ملف", "@sendFile": { "type": "text", @@ -1249,35 +921,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "أرسلَ {username} ملفًا", + "sentAFile": "📁 أرسل {username} ملفا", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "أرسلَ {username} ملفًا صوتيًا", + "sentAnAudio": "🎤 أرسل {username} ملفا صوتيا", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "أرسلَ {username} صورة", + "sentAPicture": "🖼️ {username} أرسل صورة", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "أرسلَ {username} ملصقا", + "sentASticker": "😊 أرسل {username} ملصقا", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "أرسلَ {username} فيديو", + "sentAVideo": "🎥 أرسل {username} مقطع فيديو", "@sentAVideo": { "type": "text", "placeholders": { @@ -1291,26 +963,6 @@ "senderName": {} } }, - "sentryInfo": "معلومات عن خصوصيتك: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "تُحقق من الجلسة", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "عيّن صورة ملف شخصي", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "عيّن وصفا للمجموعة", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "عيّن رابط الدعوة", "@setInvitationLink": { "type": "text", @@ -1338,11 +990,6 @@ "username": {} } }, - "signUp": "سجّل", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "تخط", "@skip": { "type": "text", @@ -1360,11 +1007,6 @@ "senderName": {} } }, - "startYourFirstChat": "ابدأ محادثتك الأولى! 🙂\n- أنقر زر 'رسالة جديدة'\n- اسمح رمز الاستجابة السريعة لصديقك\n- اكتب ما يحلو لك", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "ماهو وضعك؟", "@statusExampleMessage": { "type": "text", @@ -1375,21 +1017,11 @@ "type": "text", "placeholders": {} }, - "sunday": "الأحد", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "النظام", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "اضغط لعرض القائمة", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "لا يتطبقان", "@theyDontMatch": { "type": "text", @@ -1400,26 +1032,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "أُرشِفت هته الغرفة.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "الخميس", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "فلافي-شات", "@title": { "description": "Title for the application", @@ -1431,11 +1043,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "الثلاثاء", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unbannedUser": "ألغى {username} حظر {targetName}", "@unbannedUser": { "type": "text", @@ -1466,11 +1073,6 @@ "type": {} } }, - "unknownSessionVerify": "الجلسة مجهولة، تحقق منها", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "ألغِ كتم المحادثة", "@unmuteChat": { "type": "text", @@ -1488,18 +1090,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 رسالة غير مقروءة} other{{unreadEvents} رسائل غير مقروءة}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "هل تريد استخدم ألوان متوافقة مع AMOLED؟", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} و {count} أخرون يكتبون…", "@userAndOthersAreTyping": { "type": "text", @@ -1523,7 +1113,7 @@ "username": {} } }, - "userLeftTheChat": "غادر {username} المحادثة", + "userLeftTheChat": "🚪 {username} غادر المحادثة", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -1543,21 +1133,11 @@ "type": {} } }, - "verifiedSession": "تُحقق من الجلسة بنجاح!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "تحقق", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "تحقق يدويا", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "ابدأ التحقق", "@verifyStart": { "type": "text", @@ -1573,13 +1153,8 @@ "type": "text", "placeholders": {} }, - "verifyUser": "تحقق من مستخدم", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "مكالمة فيديو", - "@videoCall": { + "videoCall": "مكالمة فيديو", + "@videoCall": { "type": "text", "placeholders": {} }, @@ -1618,7 +1193,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "الخلفية", + "wallpaper": "الخلفية:", "@wallpaper": { "type": "text", "placeholders": {} @@ -1628,21 +1203,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "التشفير طرفا لطرف لا يزال في مرحلة البيتا! استخدمه تحت مسؤوليتك!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "الأربعاء", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "مرحبا بك في أظرف مراسل فروري لمايتركس.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "من يسمح له الانضمام للمجموعة", "@whoIsAllowedToJoinThisGroup": { "type": "text", @@ -1663,36 +1223,16 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "دُعيتَ لهذه المحادثة", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "لم تعد منتسبا لهذه المحادثة", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "لا يمكنك دعوة نفسك", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "حُظرت من هذه المحادثة", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "اسم المستخدم الخاص بك", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "مجموعات عمومية", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "people": "أشخاص", "@people": { "type": "text", @@ -1700,12 +1240,6 @@ }, "scanQrCode": "امسح رمز الاستجابة السريعة", "@scanQrCode": {}, - "typeInInviteLinkManually": "اكتب رابط الدعوة...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "شارك رابط الدعوة", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "اطلب من أصدقائك مسح رمز الاستجابة السريعة أو أرسل لهم رابط الدعوة.", - "@createNewChatExplaination": {}, "noMatrixServer": "{server1} ليس خادم ماتريكس، بدلًا منه أتريد استخدام {server2}؟", "@noMatrixServer": { "type": "text", @@ -1714,11 +1248,6 @@ "server2": {} } }, - "noDescription": "بدون وصف", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noConnectionToTheServer": "انقطع الاتصال بالخادم", "@noConnectionToTheServer": { "type": "text", @@ -1749,18 +1278,6 @@ "type": "text", "placeholders": {} }, - "loginWith": "لج عبر {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "invalidEmail": "بريد إلكتروني غير صالح", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inoffensive": "غير مسيء", "@inoffensive": { "type": "text", @@ -1796,11 +1313,6 @@ "type": "text", "placeholders": {} }, - "friends": "الأصدقاء", - "@friends": { - "type": "text", - "placeholders": {} - }, "fontSize": "حجم الخط", "@fontSize": { "type": "text", @@ -1818,8 +1330,6 @@ }, "homeserver": "الخادم", "@homeserver": {}, - "enterASpacepName": "أدخل اسم الفضاء", - "@enterASpacepName": {}, "enterAnEmailAddress": "أدخل عنوان بريد إلكتروني", "@enterAnEmailAddress": { "type": "text", @@ -1855,21 +1365,6 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "ألغ ولاتسأل مجددًا", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "اكتشف مجموعات", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "اكتشف", - "@discover": { - "type": "text", - "placeholders": {} - }, "directChats": "محادثات مباشرة", "@directChats": { "type": "text", @@ -1880,7 +1375,7 @@ "type": "text", "placeholders": {} }, - "createNewSpace": "فضاء جديد", + "createNewSpace": "مساحة جديدة", "@createNewSpace": { "type": "text", "placeholders": {} @@ -1982,11 +1477,6 @@ "type": "text", "description": "Usage hint for the command /ban" }, - "clearText": "امسح النص", - "@clearText": { - "type": "text", - "placeholders": {} - }, "clearArchive": "امسح الأرشيف", "@clearArchive": {}, "chats": "المحادثات", @@ -1994,14 +1484,9 @@ "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "أُزيلت المحادثة من هذا الفضاء", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "أُضيفت المحادثة الى هذا الفضاء", + "chatHasBeenAddedToThisSpace": "أُضيفت المحادثة الى هذا المساحة", "@chatHasBeenAddedToThisSpace": {}, - "chatBackup": "انسخ احتياطيًا المحادثة", + "chatBackup": "النسخ الاحتياطي للمحادثات", "@chatBackup": { "type": "text", "placeholders": {} @@ -2040,16 +1525,6 @@ "type": "text", "placeholder": {} }, - "audioPlayerPlay": "شغّل", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "ألبث", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, "areYouSureYouWantToLogout": "أمتأكد من الخروج؟", "@areYouSureYouWantToLogout": { "type": "text", @@ -2070,32 +1545,18 @@ "type": "text", "placeholders": {} }, - "addToSpace": "أضفه لفضاء", + "addToSpace": "أضف إلى المساحة", "@addToSpace": {}, - "addNewFriend": "أضف صديقًا جديدًا", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addEmail": "أضف بريدًا إلكترونيًا", "@addEmail": { "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "لم يّعثر على أي غرف عمومية…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noPasswordRecoveryDescription": "لم تضف أي طريقة لاستعادة كلمة السر.", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} }, - "newUsernameDescription": "سيكون معرفك على شكل @username:servername", - "@newUsernameDescription": {}, - "newPasswordDescription": "لتتمكن من استعادة كلمة السر في حالة فقدانها أضف عنوان بريد إلكتروني لاحقًا.", - "@newPasswordDescription": {}, "notifications": "الإشعارات", "@notifications": { "type": "text", @@ -2123,27 +1584,17 @@ "error": {} } }, - "enableChatBackup": "فعّل النسخ الاحتياطي للمحادثة كي لا تخسر الوصول إليها.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "عدّل الاسم المميز للغرفة", "@editRoomAliases": { "type": "text", "placeholders": {} }, - "editChatPermissions": "عدّل تصاريح المحادثة", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "configureChat": "ضبط المحادثة", "@configureChat": { "type": "text", "placeholders": {} }, - "chatBackupDescription": "النسخ الاحتياطي لمحادثاتك مأمن بمفتاح، تأكد ألّا تفقده.", + "chatBackupDescription": "يتم تأمين رسائلك القديمة باستخدام مفتاح الاسترداد. يرجى التأكد من أنك لا تضيعه.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -2226,7 +1677,7 @@ "type": "text", "placeholders": {} }, - "spaceIsPublic": "الفضاء عمومي", + "spaceIsPublic": "عام في المساحة", "@spaceIsPublic": { "type": "text", "placeholders": {} @@ -2241,11 +1692,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "انقر على الجهاز لتوثيقه", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "unavailable": "غير متوفر", "@unavailable": { "type": "text", @@ -2261,16 +1707,6 @@ "type": "text", "placeholders": {} }, - "zoomOut": "صغّر", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "كبّر", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, "singlesignon": "تسجيل دخول أحادي", "@singlesignon": { "type": "text", @@ -2286,27 +1722,12 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "الصوت والاهتزاز ولون ضوء الإشعار", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "يُزامن محادثاتك…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "المستخدم غير موثّق", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "verified": "موثّق", "@verified": { "type": "text", "placeholders": {} }, - "spaceName": "اسم الفضاء", + "spaceName": "اسم المساحة", "@spaceName": { "type": "text", "placeholders": {} @@ -2316,26 +1737,11 @@ "type": "text", "placeholders": {} }, - "tapToShowImage": "انقر على صورة لإظهارها", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, "tooManyRequestsWarning": "طابات كثيرة. حاول مجددًا لاحقًا!", "@tooManyRequestsWarning": { "type": "text", "placeholders": {} }, - "unlockChatBackup": "فك قفل النسخ الاحتياطي للمحادثة", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userVerified": "المستخدم موثّق", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "أرسلنا لك رسالة بالبريد الإلكتروني", "@weSentYouAnEmail": { "type": "text", @@ -2346,29 +1752,17 @@ "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "سيتم وصلك بـ {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "status": "الحالة", "@status": { "type": "text", "placeholders": {} }, - "userUnknownVerification": "حالة توثيق المستخدم مجهولة", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, "transferFromAnotherDevice": "أنقله من جهاز آخر", "@transferFromAnotherDevice": { "type": "text", "placeholders": {} }, - "wipeChatBackup": "أتريد حذف النسخ الاحتياطي للمحادثة لإنشاء مفتاح أمان جديد؟", + "wipeChatBackup": "مسح نسخة المحادثة الاحتياطية لإنشاء مفتاح استرداد جديد؟", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2388,21 +1782,11 @@ "type": "text", "placeholders": {} }, - "securityKey": "مفتاح الأمان", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "botMessages": "رسائل البوت", "@botMessages": { "type": "text", "placeholders": {} }, - "securityKeyLost": "فقدت مفتاح الأمان؟", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "sendAsText": "أرسل نصًا", "@sendAsText": { "type": "text" @@ -2432,19 +1816,12 @@ "type": "text", "placeholders": {} }, - "savedFileAs": "حُفظ الملف كـ {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "sendSticker": "أرسل ملصقًا", "@sendSticker": { "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "مستوى الأذونات الإفتراضي", + "defaultPermissionLevel": "مستوى الأذونات الافتراضية للمستخدمين الجدد", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2466,21 +1843,6 @@ "type": "text", "placeholders": {} }, - "publicKey": "المفتاح العمومي", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "أدخل مفتاح الأمان:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "فضاء عام", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "redactMessage": "احذف رسالة", "@redactMessage": { "type": "text", @@ -2496,36 +1858,9 @@ "type": "text", "placeholders": {} }, - "saveFileToFolder": "احفظ الملف في هذا المجلد", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "معرّف المستخدم:", - "@yourUserId": {}, - "deviceVerifyDescription": "لن يكون التشفير آمنا إلا بعد التحقق من جميع الأجهزة.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "iWroteDownTheKey": "كتبتُ المفتاح", - "@iWroteDownTheKey": {}, - "setupChatBackupDescription": "لحماية رسائلك، أنشأنا مفتاح أمان لك.\nيرجى الاحتفاظ به في مكان آمن، كمدير لكلمات السر.", - "@setupChatBackupDescription": {}, - "passwordsDoNotMatch": "كلمتا السر لا تتطبقان!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "رجاءً أدخل بيردًا إلكترونيًا صالحًا.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "كرّر كلمة السر", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "رجاءً اختر ما لا يقل عن {min} محرف.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "removeFromSpace": "أزل من الفضاء", + "removeFromSpace": "أزل من المساحة", "@removeFromSpace": {}, "unverified": "غير مؤكد", "@unverified": {}, @@ -2552,8 +1887,6 @@ "supportedVersions": {} } }, - "setupChatBackup": "إعداد النسخ الاحتياطي للمحادثة", - "@setupChatBackup": {}, "commandHint_clearcache": "مسح الذاكرة المؤقتة", "@commandHint_clearcache": { "type": "text", @@ -2569,13 +1902,6 @@ "type": "text", "placeholders": {} }, - "moreEvents": "{count,plural, =1{1 حدث إضافي} other{{count} أحداث إضافية}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "commandHint_discardsession": "إنهاء الجلسة", "@commandHint_discardsession": { "type": "text", @@ -2586,8 +1912,6 @@ "type": "text", "placeholders": {} }, - "loginWithOneClick": "تسجيل الدخول بكبسة واحدة", - "@loginWithOneClick": {}, "badServerVersionsException": "يدعم الخادم الرئيسي المستخدم إصدارات المواصفات:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", "@badServerVersionsException": { "type": "text", @@ -2601,11 +1925,6 @@ "type": "text", "placeholders": {} }, - "bubbleSize": "حجم الفقاعة", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "yourChatBackupHasBeenSetUp": "تم إعداد النسخ الاحتياطي لمحادثاتك.", "@yourChatBackupHasBeenSetUp": {}, "noEncryptionForPublicRooms": "يمكنك فقط تفعيل التشفير عندما تصبح الغرفة غير متاحة للعامة.", @@ -2621,10 +1940,6 @@ "@unsupportedAndroidVersion": {}, "unsupportedAndroidVersionLong": "تتطلب هذه الميزة إصدار Android أحدث. يرجى التحقق من وجود تحديثات أو دعم Lineage OS.", "@unsupportedAndroidVersionLong": {}, - "thisUserHasNotPostedAnythingYet": "هذا المستخدم لم ينشر أي شيء في قصته حتى الآن", - "@thisUserHasNotPostedAnythingYet": {}, - "storyPrivacyWarning": "يرجى ملاحظة أنه يمكن للأشخاص رؤية بعضهم البعض والتواصل مع بعضهم البعض في قصتك. ستكون قصصك مرئية لمدة 24 ساعة ولكن ليس هناك ما يضمن حذفها من جميع الأجهزة والخوادم.", - "@storyPrivacyWarning": {}, "experimentalVideoCalls": "مكالمات الفيديو التجريبية", "@experimentalVideoCalls": {}, "commandHint_create": "أنشأ محادثة جماعية فارغة\nاستخدم --لا-تشفير لتعطيل التشفير", @@ -2647,15 +1962,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKeyDescription": "لإلغاء قفل النسخة الاحتياطية للمحادثة، يرجى إدخال مفتاح الأمان الذي تم إنشاؤه في جلسة سابقة. مفتاح الأمان الخاص بك ليس كلمة مرورك.", - "@pleaseEnterSecurityKeyDescription": {}, - "noStatusesFound": "لم يتم العثور على حالات حتى الآن.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "removeFromSpaceDescription": "هذا يزيل هذه المحادثة من الفضاء الحالي. ستبقى بعد ذلك موجودة ضمن \"جميع الدردشات\".", - "@removeFromSpaceDescription": {}, "commandHint_myroomavatar": "حدد صورتك لهذه الغرفة (عن طريق mxc-uri)", "@commandHint_myroomavatar": { "type": "text", @@ -2665,8 +1971,6 @@ "@videoCallsBetaWarning": {}, "placeCall": "إجراء مكالمة", "@placeCall": {}, - "replyHasBeenSent": "تم إرسال الرد", - "@replyHasBeenSent": {}, "videoWithSize": "فيديو ({size})", "@videoWithSize": { "type": "text", @@ -2674,32 +1978,10 @@ "size": {} } }, - "storyFrom": "رسالة من {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "يرجى ملاحظة أنه يمكن للأشخاص رؤية بعضهم البعض والتواصل مع بعضهم البعض في قصتك.", - "@whoCanSeeMyStoriesDesc": {}, "emailOrUsername": "البريد الإلكتروني أو اسم المستخدم", "@emailOrUsername": {}, "dismiss": "رفض", "@dismiss": {}, - "matrixWidgets": "إضافات ماتريكس", - "@matrixWidgets": {}, - "integrationsNotImplemented": "تعديل الإضافات والتكاملات ليس ممكنا حتى الآن.", - "@integrationsNotImplemented": {}, - "editIntegrations": "تعديل الإضافات والتكاملات", - "@editIntegrations": {}, - "iUnderstand": "أنا أتفهم", - "@iUnderstand": {}, - "whatIsGoingOn": "ما الذي يحصل؟", - "@whatIsGoingOn": {}, - "addDescription": "إضافة وصف", - "@addDescription": {}, "setAsCanonicalAlias": "تعيين كاسم مستعار رئيسي", "@setAsCanonicalAlias": { "type": "text", @@ -2728,8 +2010,6 @@ "reaction": {} } }, - "saveTheSecurityKeyNow": "احفظ مفتاح الأمان الآن", - "@saveTheSecurityKeyNow": {}, "markAsRead": "حدد كمقروء", "@markAsRead": {}, "openVideoCamera": "افتح الكاميرا لمقطع فيديو", @@ -2739,28 +2019,871 @@ }, "start": "إبدأ", "@start": {}, - "setupChatBackupNow": "قم بإعداد النسخة الاحتياطية للمحادثة الآن", - "@setupChatBackupNow": {}, "publish": "انشر", "@publish": {}, - "whoCanSeeMyStories": "من يمكنه رؤية قصصي؟", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "إلغاء الإشتراك بالقصص", - "@unsubscribeStories": {}, - "yourStory": "قصتك", - "@yourStory": {}, - "addToSpaceDescription": "إختر فضاء لإضافة هذه المحادثة إليه.", + "addToSpaceDescription": "إختر مساحة لإضافة هذه المحادثة إليها.", "@addToSpaceDescription": {}, - "addToStory": "إضافة للقصة", - "@addToStory": {}, "reportUser": "التبيلغ عن المستخدم", "@reportUser": {}, "openChat": "فتح المحادثة", "@openChat": {}, "pinMessage": "تثبيت في الغرفة", "@pinMessage": {}, - "pinnedEventsError": "خطأ في تحميل الرسائل المثبتة", - "@pinnedEventsError": {}, "confirmEventUnpin": "هل أنت متأكد من إلغاء تثبيت الحدث بشكل دائم؟", - "@confirmEventUnpin": {} + "@confirmEventUnpin": {}, + "fileHasBeenSavedAt": "تم حفظ الملف في {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "user": "مستخدم", + "@user": {}, + "custom": "مُخصّص", + "@custom": {}, + "googlyEyesContent": "{senderName} يرسل لك عيون googly", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "widgetVideo": "فيديو", + "@widgetVideo": {}, + "recoveryKeyLost": "هل فقدت مفتاح الاسترداد؟", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKeyDescription": "لإلغاء قفل رسائلك القديمة ، يرجى إدخال مفتاح الاسترداد الذي تم إنشاؤه في جلسة سابقة. مفتاح الاسترداد ليس كلمة المرور الخاصة بك.", + "@pleaseEnterRecoveryKeyDescription": {}, + "confirmMatrixId": "يرجى تأكيد معرف Matrix الخاص بك من أجل حذف حسابك.", + "@confirmMatrixId": {}, + "supposedMxid": "يجب أن يكون هذا {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "hydrateTor": "مستخدمو تور: استيراد تصدير الجلسة", + "@hydrateTor": {}, + "commandHint_googly": "أرسل بعض عيون googly", + "@commandHint_googly": {}, + "commandHint_cuddle": "أرسل عناق", + "@commandHint_cuddle": {}, + "commandHint_hug": "إرسال حضن", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} يحتضنك", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "unlockOldMessages": "إلغاء قفل الرسائل القديمة", + "@unlockOldMessages": {}, + "commandHint_markasdm": "وضع علامة على أنها غرفة رسائل مباشرة لمعرف المصفوفة", + "@commandHint_markasdm": {}, + "allRooms": "جميع الدردشات الجماعية", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "dehydrate": "تصدير الجلسة ومسح الجهاز", + "@dehydrate": {}, + "dehydrateWarning": "لا يمكن التراجع عن هذا الإجراء. تأكد من تخزين ملف النسخ الاحتياطي بأمان.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "بالنسبة لمستخدمي تور ، يوصى بتصدير الجلسة قبل إغلاق النافذة.", + "@dehydrateTorLong": {}, + "dehydrateTor": "مستخدمو تور: تصدير الجلسة", + "@dehydrateTor": {}, + "hydrate": "استعادة من ملف النسخ الاحتياطي", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "الرجاء إدخال مفتاح الاسترداد:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "مفتاح الاسترداد", + "@recoveryKey": {}, + "startFirstChat": "ابدأ محادثتك الأولى", + "@startFirstChat": {}, + "widgetCustom": "مُخصّص", + "@widgetCustom": {}, + "widgetNameError": "يرجى تقديم اسم العرض.", + "@widgetNameError": {}, + "errorAddingWidget": "خطأ في إضافة الأداة.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "لقد رفضت الدعوة", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "لقد انضممت إلى المحادثة", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 لقد قبلت الدعوة", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "لقد حظرت {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "لقد سحبت الدعوة لـ {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 لقد تمت دعوتك من قبل {user}", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "storeInAndroidKeystore": "تخزين في سجل مفاتيح اندرويد", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "تخزين في سلسلة مفاتيح ابل", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "احفظه بأمان على هذا الجهاز", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "ملفات {count}", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "foregroundServiceRunning": "يظهر هذا الإشعار عند تشغيل الخدمة الأمامية.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "مشاركة الشاشة", + "@screenSharingTitle": {}, + "appearOnTop": "يظهر في الأعلى", + "@appearOnTop": {}, + "otherCallingPermissions": "الميكروفون والكاميرا وأذونات FluffyChat الأخرى", + "@otherCallingPermissions": {}, + "enterSpace": "أدخل المساحة", + "@enterSpace": {}, + "enterRoom": "أدخل الغرفة", + "@enterRoom": {}, + "deviceKeys": "مفاتيح الجهاز:", + "@deviceKeys": {}, + "whyIsThisMessageEncrypted": "لماذا هذه الرسالة غير قابلة للقراءة؟", + "@whyIsThisMessageEncrypted": {}, + "nextAccount": "الحساب التالي", + "@nextAccount": {}, + "previousAccount": "الحساب السابق", + "@previousAccount": {}, + "encryptThisChat": "تشفير هذه المحادثة", + "@encryptThisChat": {}, + "screenSharingDetail": "أنت تشارك شاشتك في FuffyChat", + "@screenSharingDetail": {}, + "hideUnimportantStateEvents": "إخفاء أحداث الحالة غير المهمة", + "@hideUnimportantStateEvents": {}, + "newGroup": "مجموعة جديدة", + "@newGroup": {}, + "youKicked": "👞 لقد ركلت {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "newSpace": "مساحة جديدة", + "@newSpace": {}, + "commandHint_markasgroup": "وضع علامة كمجموعة", + "@commandHint_markasgroup": {}, + "separateChatTypes": "الدردشات المباشرة والمجموعات المنفصلة", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "hugContent": "{senderName} يعانقك", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hydrateTorLong": "هل قمت بتصدير جلستك الأخيرة على تور؟ قم باستيرادها بسرعة واستمر في المحادثة.", + "@hydrateTorLong": {}, + "widgetUrlError": "هذا ليس عنوان URL صالحًا.", + "@widgetUrlError": {}, + "indexedDbErrorTitle": "مشاكل الوضع الخاص", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "للأسف ، لم يتم تمكين تخزين الرسائل في الوضع الخاص افتراضيا.\nيرجى زيارة\n - حول:التكوين\n - تعيين dom.indexedDB.privateBrowsing.enabled إلى true\nخلاف ذلك ، لا يمكن تشغيل FluffyChat.", + "@indexedDbErrorLong": {}, + "switchToAccount": "التبديل إلى الحساب {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "addWidget": "إضافة اداة", + "@addWidget": {}, + "widgetEtherpad": "ملاحظة نصية", + "@widgetEtherpad": {}, + "youKickedAndBanned": "🙅 لقد ركلت وحظرت {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "قمت بإلغاء الحظر {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "saveKeyManuallyDescription": "احفظ هذا المفتاح يدويا عن طريق تشغيل مربع حوار مشاركة النظام أو الحافظة.", + "@saveKeyManuallyDescription": {}, + "widgetJitsi": "اجتماعات جيتسي", + "@widgetJitsi": {}, + "youInvitedUser": "📩 قمت بدعوة {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "storeInSecureStorageDescription": "قم بتخزين مفتاح الاسترداد في التخزين الآمن لهذا الجهاز.", + "@storeInSecureStorageDescription": {}, + "widgetName": "الاسم", + "@widgetName": {}, + "users": "المستخدمون", + "@users": {}, + "callingPermissions": "أذونات الاتصال", + "@callingPermissions": {}, + "callingAccount": "الاتصال بالحساب", + "@callingAccount": {}, + "callingAccountDetails": "يسمح لـ FluffyChat باستخدام تطبيق android Dialer الأصلي.", + "@callingAccountDetails": {}, + "appearOnTopDetails": "يسمح للتطبيق بالظهور في الأعلى (ليست هناك حاجة إذا قمت بالفعل بإعداد Fluffychat كحساب اتصال)", + "@appearOnTopDetails": {}, + "numChats": "{number} الدردشات", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "jump": "قفز", + "@jump": {}, + "report": "تقرير", + "@report": {}, + "noKeyForThisMessage": "يمكن أن يحدث هذا إذا تم إرسال الرسالة قبل تسجيل الدخول إلى حسابك على هذا الجهاز.\n\nمن الممكن أيضا أن يكون المرسل قد حظر جهازك أو حدث خطأ ما في الاتصال بالإنترنت.\n\nهل يمكنك قراءة الرسالة في جلسة أخرى؟ ثم يمكنك نقل الرسالة منه! انتقل إلى الإعدادات > الأجهزة وتأكد من أن أجهزتك قد تحققت من بعضها البعض. عندما تفتح الغرفة في المرة التالية وتكون كلتا الجلستين في المقدمة ، سيتم إرسال المفاتيح تلقائيا.\n\nألا تريد أن تفقد المفاتيح عند تسجيل الخروج أو تبديل الأجهزة؟ تأكد من تمكين النسخ الاحتياطي للدردشة في الإعدادات.", + "@noKeyForThisMessage": {}, + "allSpaces": "كل المساحات", + "@allSpaces": {}, + "doNotShowAgain": "لا تظهر مرة أخرى", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "محادثة فارغة (كانت {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "disableEncryptionWarning": "لأسباب أمنية ، لا يمكنك تعطيل التشفير في المحادثة ، حيث تم تمكينه من قبل.", + "@disableEncryptionWarning": {}, + "reportErrorDescription": "😭 أوه لا. هناك خطأ ما. إذا كنت تريد، يمكنك الإبلاغ عن هذا الخطأ إلى المطورين.", + "@reportErrorDescription": {}, + "newSpaceDescription": "يسمح لك تطبيق المساحات بتوحيد دردشاتك وبناء مجتمعات خاصة أو عامة.", + "@newSpaceDescription": {}, + "sorryThatsNotPossible": "معذرة... هذا غير ممكن", + "@sorryThatsNotPossible": {}, + "openLinkInBrowser": "فتح الرابط في المتصفح", + "@openLinkInBrowser": {}, + "reopenChat": "إعادة فتح المحادثة", + "@reopenChat": {}, + "noBackupWarning": "تحذير! بدون تمكين النسخ الاحتياطي للدردشة ، ستفقد الوصول إلى رسائلك المشفرة. يوصى بشدة بتمكين النسخ الاحتياطي للدردشة أولاً قبل تسجيل الخروج.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "لم يتم العثور على أجهزة أخرى", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "تعذر الإرسال! لا يدعم الخادم سوى المرفقات التي تصل إلى {max}.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "الانتقال إلى آخر رسالة مقروءة", + "@jumpToLastReadMessage": {}, + "readUpToHere": "اقرأ حتى هنا", + "@readUpToHere": {}, + "signInWithPassword": "سجل الدخول بكلمة السر", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "رجاء حاول مجددا أو اختر خادما مختلفا.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "تسجيل الدخول باستخدام {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "importNow": "استيراد الآن", + "@importNow": {}, + "importEmojis": "استيراد الرموز التعبيرية", + "@importEmojis": {}, + "exportEmotePack": "تصدير حزمة الرموز التعبيرية بتنسيق zip", + "@exportEmotePack": {}, + "notAnImage": "ليس ملف صورة.", + "@notAnImage": {}, + "importFromZipFile": "الاستيراد من ملف .zip", + "@importFromZipFile": {}, + "replace": "استبدال", + "@replace": {}, + "sendTypingNotifications": "إرسال إشعارات الكتابة", + "@sendTypingNotifications": {}, + "createGroup": "إنشاء مجموعة", + "@createGroup": {}, + "messagesStyle": "الرسائل:", + "@messagesStyle": {}, + "shareInviteLink": "شارك رابط الدعوة", + "@shareInviteLink": {}, + "profileNotFound": "لا يمكن العثور على المستخدم على الخادم. ربما هناك مشكلة في الاتصال أو المستخدم غير موجود.", + "@profileNotFound": {}, + "setTheme": "تعيين السمة:", + "@setTheme": {}, + "setColorTheme": "تعيين لون السمة:", + "@setColorTheme": {}, + "inviteContactToGroupQuestion": "هل تريد دعوة {contact} إلى المحادثة \"{groupName}\"؟?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "أعد المحاولة", + "@tryAgain": {}, + "redactMessageDescription": "سيتم تنقيح الرسالة لجميع المشاركين في هذه المحادثة. هذا لا يمكن التراجع عنها.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(اختياري) سبب تنقيح هذه الرسالة ...", + "@optionalRedactReason": {}, + "redactedBy": "منقح بواسطة {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedByBecause": "تم حجبه بواسطة {username} بسبب: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "invite": "دعوة", + "@invite": {}, + "addChatDescription": "أضف وصفًا للدردشة...", + "@addChatDescription": {}, + "chatPermissions": "صلاحيات المحادثة", + "@chatPermissions": {}, + "chatDescription": "وصف المحادثة", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "تغير وصف المجموعة", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "لم يتم إنشاء وصف للمحادثة حتى الآن.", + "@noChatDescriptionYet": {}, + "invalidServerName": "اسم الخادم غير متاح", + "@invalidServerName": {}, + "setChatDescription": "تعيين وصفًا للدردشة", + "@setChatDescription": {}, + "directChat": "محادثة مباشرة", + "@directChat": {}, + "inviteGroupChat": "📨 دعوة للمحادثة الجماعية", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 دعوة دردشة خاصة", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "التعبيرات المستخدمة مؤخرًا ستظهر هنا ...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "مدخل غير صالح!", + "@invalidInput": {}, + "wrongPinEntered": "تم إدخال رمز خاطئ! حاول مرة أخرى خلال {seconds} ثانية...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "hasKnocked": "🚪 لقد طرق {user}", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "pleaseEnterANumber": "الرجاء إدخال رقم أكبر من 0", + "@pleaseEnterANumber": {}, + "banUserDescription": "سيتم حظر المستخدم من المحادثة ولن يتمكن من الدخول إلى المحادثة مرة أخرى حتى يتم رفع الحظر عنه.", + "@banUserDescription": {}, + "removeDevicesDescription": "سيتم تسجيل خروجك من هذا الجهاز ولن تتمكن بعد ذلك من تلقي الرسائل.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "سيتمكن المستخدم من الدخول إلى المحادثة مرة أخرى إذا حاول.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "دفع الإخطارات غير متوفرة", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "بمجرد تعيين هذا المستخدم كمسؤول، قد لا تتمكن من التراجع عن هذا لأنه سيكون لديه نفس الأذونات التي تتمتع بها.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "سيتم نقل المحادثة إلى الأرشيف. سيتمكن المستخدمون الآخرون من رؤية أنك غادرت المحادثة.", + "@archiveRoomDescription": {}, + "learnMore": "تعلم المزيد", + "@learnMore": {}, + "roomUpgradeDescription": "سيتم بعد ذلك إعادة إنشاء المحادثة باستخدام إصدار الغرفة الجديد. سيتم إخطار جميع المشاركين بأنهم بحاجة إلى التبديل إلى المحادثة الجديدة. يمكنك معرفة المزيد حول إصدارات الغرف على https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "kickUserDescription": "يتم طرد المستخدم من المحادثة ولكن لا يتم حظره. في المحادثات العامة، يمكن للمستخدم الانضمام مرة أخرى في أي وقت.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "إنشاء مجموعة ودعوة المستخدمين", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "يمكن العثور على المجموعة عبر البحث", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "لسوء الحظ، لا يمكن العثور على مستخدم لديه \"{query}\". يرجى التحقق مما إذا كنت قد ارتكبت خطأ كتابي.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "yourGlobalUserIdIs": "معرف المستخدم العمومي الخاص بك هو: ", + "@yourGlobalUserIdIs": {}, + "groupName": "أسم المجموعة", + "@groupName": {}, + "searchChatsRooms": "ابحث عن #الدردشات، @المستخدمين...", + "@searchChatsRooms": {}, + "startConversation": "بدء محادثة", + "@startConversation": {}, + "commandHint_sendraw": "إرسال جيسون الخام", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "عذرًا... لا يبدو أن هذا هو مفتاح الاسترداد الصحيح.", + "@wrongRecoveryKey": {}, + "blockListDescription": "يمكنك حظر المستخدمين الذين يزعجونك. لن تتمكن من تلقي أي رسائل أو دعوات للغرفة من المستخدمين الموجودين في قائمة الحظر الشخصية الخاصة بك.", + "@blockListDescription": {}, + "blockedUsers": "المستخدمون المحظورون", + "@blockedUsers": {}, + "block": "حظر", + "@block": {}, + "blockUsername": "تجاهل اسم المستخدم", + "@blockUsername": {}, + "databaseMigrationTitle": "تم تحسين قاعدة البيانات", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "انتظر من فضلك. قد يستغرق ذلك بعض الوقت.", + "@databaseMigrationBody": {}, + "thisDevice": "هذا الجهاز:", + "@thisDevice": {}, + "publicSpaces": "مساحة عامة", + "@publicSpaces": {}, + "passwordIsWrong": "كلمة السر للدخول خاطئة", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "من فضلك أدخل كلمة السر الحالية", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "رابط عام", + "@publicLink": {}, + "nothingFound": "لم نجد شيئاً.", + "@nothingFound": {}, + "decline": "رفض", + "@decline": {}, + "newPassword": "كلمة المرور الجديدة", + "@newPassword": {}, + "passwordsDoNotMatch": "كلمات المرور لا تتطابق", + "@passwordsDoNotMatch": {}, + "subspace": "مساحة فرعية", + "@subspace": {}, + "select": "اختر", + "@select": {}, + "pleaseChooseAStrongPassword": "الرجاء اختيار كلمة مرور قوية", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "إضافة دردشة أو مساحة فرعية", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "اتركه فارغًا لمسح حالتك.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "انضم إلى المساحة", + "@joinSpace": {}, + "searchForUsers": "ابحث عن @users...", + "@searchForUsers": {}, + "databaseBuildErrorBody": "غير قادر على بناء قاعدة بيانات SQlite. يحاول التطبيق استخدام قاعدة بيانات قديمة في الوقت الحالي. الرجاء الإبلاغ عن هذا الخطأ للمطورين على {url}. رسالة الخطأ هي: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "حدث خطأ بداخل التطبيق", + "@initAppError": {}, + "sessionLostBody": "جلستك مفقودة يرجى إبلاغ المطورين بهذا الخطأ في {url}. رسالة الخطأ هي: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "يحاول التطبيق الآن استعادة جلستك من النسخة الاحتياطية. الرجاء الإبلاغ عن هذا الخطأ للمطورين على {url}. رسالة الخطأ هي:{error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "completedKeyVerification": "أكمل {sender} عملية التحقق من المفتاح", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "طلب {sender} التحقق من المفتاح", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "شفّاف", + "@transparent": {}, + "youInvitedToBy": "📩 تمت دعوتك عبر الرابط إلى:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "formattedMessagesDescription": "عرض محتوى الرسالة الغنية مثل النص الغامق باستخدام الماركداون.", + "@formattedMessagesDescription": {}, + "verifyOtherUserDescription": "إذا قمت بالتحقق من مستخدم آخر، فيمكنك التأكد من أنك تعرف من تكتب إليه حقًا. 💪\n\nعند بدء عملية التحقق، سترى أنت والمستخدم الآخر نافذة منبثقة في التطبيق. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض.\n\nأفضل طريقة للقيام بذلك هي الالتقاء أو بدء مكالمة فيديو. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "عند التحقق من جهاز آخر، يمكن لهذه الأجهزة تبادل المفاتيح، مما يزيد من أمانك بشكل عام. 💪 عند بدء عملية التحقق، ستظهر نافذة منبثقة في التطبيق على كلا الجهازين. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض. من الأفضل أن يكون كلا الجهازين في متناول يديك قبل بدء عملية التحقق. 🤳", + "@verifyOtherDeviceDescription": {}, + "formattedMessages": "رسائل منسقة", + "@formattedMessages": {}, + "sendReadReceipts": "إرسال بالقراءة", + "@sendReadReceipts": {}, + "verifyOtherDevice": "🔐 التحقق من الجهاز الآخر", + "@verifyOtherDevice": {}, + "forwardMessageTo": "هل تريد إعادة توجيه الرسالة إلى {roomName}؟", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendTypingNotificationsDescription": "يستطيع المشاركون الآخرون في المحادثة رؤيتك عند كتابة رسالة جديدة.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "يمكن للمشاركين الآخرين في المحادثة معرفة متى قرأت الرسالة.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUser": "🔐 التحقق من المستخدم الآخر", + "@verifyOtherUser": {}, + "acceptedKeyVerification": "وافق {sender} على التحقق من المفتاح", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "قام {sender} بإلغاء التحقق من المفتاح", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} جاهز للتحقق من المفتاح", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "بدأ {sender} عملية التحقق من المفتاح", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "hidePresences": "إخفاء قائمة الحالة؟", + "@hidePresences": {}, + "incomingMessages": "الرسائل الواردة", + "@incomingMessages": {}, + "presenceStyle": "الحضور:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "إظهار رسائل الحالة من المستخدمين الآخرين", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "stickers": "الملصقات", + "@stickers": {}, + "discover": "استكشف", + "@discover": {}, + "commandHint_ignore": "تجاهل معرف المصفوفة المعطى", + "@commandHint_ignore": {}, + "commandHint_unignore": "إلغاء تجاهل معرف المصفوفة المحدد", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} الدردشات غير المقروءة", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "تشفير قاعدة البيانات غير مدعوم على هذا النظام الأساسي", + "@noDatabaseEncryption": {}, + "appLockDescription": "قفل التطبيق عند عدم استخدامه بالرمز السري", + "@appLockDescription": {}, + "accessAndVisibility": "الوصول والرؤية", + "@accessAndVisibility": {}, + "calls": "المكالمات", + "@calls": {}, + "customEmojisAndStickers": "الرموز التعبيرية والملصقات المخصصة", + "@customEmojisAndStickers": {}, + "hideRedactedMessagesBody": "إذا قام شخص ما بتنقيح رسالة، فلن تكون هذه الرسالة مرئية في المحادثة بعد الآن.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "إخفاء تنسيقات الرسائل غير الصالحة أو غير المعروفة", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "نظرة عامة", + "@overview": {}, + "notifyMeFor": "أعلمني بـ", + "@notifyMeFor": {}, + "passwordRecoverySettings": "إعدادات استعادة كلمة المرور", + "@passwordRecoverySettings": {}, + "globalChatId": "معرف المحادثة العامة", + "@globalChatId": {}, + "accessAndVisibilityDescription": "من المسموح له بالانضمام إلى هذه المحادثة وكيف يمكن اكتشاف المحادثة.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "قم بإضافة أو مشاركة الرموز التعبيرية أو الملصقات المخصصة التي يمكن استخدامها في أي دردشة.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "إخفاء الرسائل المكررة", + "@hideRedactedMessages": {}, + "hideMemberChangesInPublicChats": "إخفاء تغييرات الأعضاء في الدردشات العامة", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "لا تظهر في المخطط الزمني للدردشة إذا انضم شخص ما إلى محادثة عامة أو غادرها لتحسين إمكانية القراءة.", + "@hideMemberChangesInPublicChatsBody": {}, + "usersMustKnock": "المستخدم يجب أن يطرق الباب", + "@usersMustKnock": {}, + "chatCanBeDiscoveredViaSearchOnServer": "يمكن اكتشاف الشات عن طريق البحث في {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "noOneCanJoin": "لا أحد يستطيع الانضمام", + "@noOneCanJoin": {}, + "knocking": "طرق", + "@knocking": {}, + "userWouldLikeToChangeTheChat": "{user} يرغب في الانضمام إلى المحادثة.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "لم يتم بعد إنشاء أي رابط عام", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "دق", + "@knock": {}, + "thereAreCountUsersBlocked": "يوجد حاليًا {count} من المستخدمين المحظورين.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "publicChatAddresses": "عناوين المحادثة العامة", + "@publicChatAddresses": {}, + "createNewAddress": "إنشاء عنوان جديد", + "@createNewAddress": {}, + "userRole": "دور المستخدم", + "@userRole": {}, + "minimumPowerLevel": "{level} هو الحد الأدنى من مستوى الطاقة.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchIn": "بحث في {chat}...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "files": "الملفات", + "@files": {}, + "restricted": "مقيد", + "@restricted": {}, + "knockRestricted": "قيود النقر", + "@knockRestricted": {}, + "searchMore": "ابحث أكثر...", + "@searchMore": {}, + "gallery": "المعرض", + "@gallery": {}, + "swipeRightToLeftToReply": "اسحب من اليمين إلى اليسار للرد", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "countChatsAndCountParticipants": "{chats} دردشات و {participants} مشاركين", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "لم يتم العثور على دردشات...", + "@noMoreChatsFound": {}, + "joinedChats": "انضم إلى الدردشة", + "@joinedChats": {}, + "unread": "غير المقروءة", + "@unread": {}, + "space": "المساحة", + "@space": {}, + "spaces": "المساحات", + "@spaces": {}, + "markAsUnread": "تحديد كغير مقروء", + "@markAsUnread": {}, + "goToSpace": "انتقل إلى المساحة: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "userLevel": "{level} - مستخدم", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - مشرف", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - مدير", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "تغيير إعدادات الدردشة العامة", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "دعوة مستخدمين آخرين إلى هذه الدردشة", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "تغيير أذونات الدردشة", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "تغيير رؤية سجل الدردشة", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "تغيير عنوان الدردشة العامة الرئيسي", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "إرسال إشعارات @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "تغيير وصف الدردشة", + "@changeTheDescriptionOfTheGroup": {}, + "invitedBy": "📩 تمت دعوته من قبل {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "chatPermissionsDescription": "‪حدد مستوى الصلاحية الضروري لإجراءات معينة في هذه الدردشة. عادة ما تمثل مستويات الصلاحية 0 و 50 و 100 المستخدمين والمشرفين ولكن أي تدرج ممكن.", + "@chatPermissionsDescription": {}, + "changelog": "سجل التغييرات", + "@changelog": {}, + "updateInstalled": "تم تثبيت🎉 تحديث {version}!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "sendCanceled": "تم إلغاء الإرسال", + "@sendCanceled": {}, + "noChatsFoundHere": "لم يتم العثور على دردشات هنا حتى الآن. ابدأ محادثة جديدة مع شخص ما باستخدام الزر أدناه. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "تسجيل الدخول باستخدام معرف ماتريكس", + "@loginWithMatrixId": {}, + "discoverHomeservers": "اكتشف الخوادم المنزلية", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "ما هو خادم المنزل ؟", + "@whatIsAHomeserver": {}, + "homeserverDescription": "يتم تخزين جميع بياناتك على خادم المنزل، تمامًا مثل مزود خدمة البريد الإلكتروني. يمكنك اختيار خادم البيت الذي تريد استخدامه، بينما لا يزال بإمكانك التواصل مع الجميع. اعرف المزيد على https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "لا يبدو أنه خادم منزلي متوافق. عنوان URL غير صحيح ؟", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "جارٍ حساب حجم الملف...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "إعداد مرفق الإرسال...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "جارٍ إرسال المرفق...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "جارٍ إنشاء صورة مصغرة للفيديو...", + "@generatingVideoThumbnail": {}, + "compressVideo": "جارٍ ضغط الفيديو...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "جارٍ إرسال المرفق {index} من {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "تم الوصول إلى حد الخادم! انتظر {seconds} ثانية...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "لم يتم التحقق من أحد أجهزتك", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "ملاحظة: عند توصيل جميع أجهزتك بنسخة احتياطية للدردشة، يتم التحقق منها تلقائيًا.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "استمرار", + "@continueText": {}, + "welcomeText": "مرحبًا، 👋 معك FluffyChat. يمكنك تسجيل الدخول إلى أي خادم منزلي، وهو متوافق مع https://matrix.org. ثم دردش مع أي شخص. إنها شبكة مراسلة لا مركزية ضخمة!", + "@welcomeText": {}, + "blur": "الضبابية:", + "@blur": {}, + "setWallpaper": "تعيين الخلفية", + "@setWallpaper": {}, + "opacity": "التعتيم:", + "@opacity": {}, + "manageAccount": "‫إدارة الحساب‬", + "@manageAccount": {}, + "noContactInformationProvided": "لا يقدم السيرفر أي معلومات اتصال صحيحة", + "@noContactInformationProvided": {}, + "contactServerAdmin": "اتصل بمسؤول الخادم", + "@contactServerAdmin": {}, + "contactServerSecurity": "الاتصال بمسؤول أمان ااخادم", + "@contactServerSecurity": {}, + "supportPage": "صفحة الدعم", + "@supportPage": {}, + "serverInformation": "معلومات الخادم:", + "@serverInformation": {}, + "name": "الإسم", + "@name": {}, + "version": "اﻹصدار", + "@version": {}, + "website": "الموقع اﻹلكتروني", + "@website": {}, + "aboutHomeserver": "حول {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "compressBeforeSending": "ضغط قبل الإرسال", + "@compressBeforeSending": {}, + "sendUncompressed": "إرسال غير مضغوط", + "@sendUncompressed": {}, + "boldText": "خط غامق", + "@boldText": {}, + "italicText": "خط مائل", + "@italicText": {}, + "strikeThrough": "يتوسطه خط", + "@strikeThrough": {}, + "invalidUrl": "رابط غير صحيح", + "@invalidUrl": {}, + "addLink": "إضافة رابط", + "@addLink": {}, + "pleaseFillOut": "من فضلك قم بتعبئته", + "@pleaseFillOut": {}, + "unableToJoinChat": "يتعذر الانضمام إلى الدردشة. ربما يكون الطرف الآخر قد أغلق المحادثة بالفعل.", + "@unableToJoinChat": {} } diff --git a/assets/l10n/intl_be.arb b/assets/l10n/intl_be.arb new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/assets/l10n/intl_be.arb @@ -0,0 +1 @@ +{} diff --git a/assets/l10n/intl_bn.arb b/assets/l10n/intl_bn.arb index 78ef4c201c..c758ff5fe4 100644 --- a/assets/l10n/intl_bn.arb +++ b/assets/l10n/intl_bn.arb @@ -1,30 +1,1885 @@ { - "@@last_modified": "2021-08-14 12:41:10.154280", - "about": "সম্পর্কে", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "স্বীকার করি", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} + "@@last_modified": "2021-08-14 12:41:10.154280", + "about": "সম্পর্কে", + "@about": { + "type": "text", + "placeholders": {} + }, + "accept": "স্বীকার করি", + "@accept": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "account": "অ্যাকাউন্ট", + "@account": { + "type": "text", + "placeholders": {} + }, + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@admin": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@addAccount": {}, + "@close": { + "type": "text", + "placeholders": {} + }, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "text", + "placeholders": {} + }, + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "text", + "placeholders": {} + }, + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@encryption": { + "type": "text", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@password": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "@remove": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@alias": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "text", + "placeholders": {} + }, + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@copy": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "text", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@username": { + "type": "text", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "text", + "placeholders": {} + }, + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "@verified": { + "type": "text", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "text", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "text", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@ignore": { + "type": "text", + "placeholders": {} + }, + "@recording": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@moderator": { + "type": "text", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@send": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "@banned": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@notifications": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@chat": { + "type": "text", + "placeholders": {} + }, + "@group": { + "type": "text", + "placeholders": {} + }, + "@leave": { + "type": "text", + "placeholders": {} + }, + "@skip": { + "type": "text", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@allChats": { + "type": "text", + "placeholders": {} + }, + "@reportUser": {}, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@license": { + "type": "text", + "placeholders": {} + }, + "@addToSpace": {}, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@forward": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "text", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "text", + "placeholders": {} + }, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "text", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@you": { + "type": "text", + "placeholders": {} + }, + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "text", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@messages": { + "type": "text", + "placeholders": {} + }, + "@login": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@settings": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@security": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "text", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@archive": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "@devices": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@share": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "text", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "@verify": { + "type": "text", + "placeholders": {} + }, + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@pin": { + "type": "text", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@unsupportedAndroidVersionLong": {}, + "@storeSecurlyOnThisDevice": {}, + "@ok": { + "type": "text", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@screenSharingDetail": {}, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@extremeOffensive": { + "type": "text", + "placeholders": {} } - }, - "account": "অ্যাকাউন্ট", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "অ্যাকাউন্ট তথ্য", - "@accountInformation": { - "type": "text", - "placeholders": {} - } } \ No newline at end of file diff --git a/assets/l10n/intl_bo.arb b/assets/l10n/intl_bo.arb new file mode 100644 index 0000000000..b7b04532c9 --- /dev/null +++ b/assets/l10n/intl_bo.arb @@ -0,0 +1,1880 @@ +{ + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@admin": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@addAccount": {}, + "@close": { + "type": "text", + "placeholders": {} + }, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "text", + "placeholders": {} + }, + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "text", + "placeholders": {} + }, + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@encryption": { + "type": "text", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@password": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "@remove": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@alias": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "text", + "placeholders": {} + }, + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@copy": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "text", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@username": { + "type": "text", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "text", + "placeholders": {} + }, + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "@verified": { + "type": "text", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "text", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "text", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@ignore": { + "type": "text", + "placeholders": {} + }, + "@recording": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@moderator": { + "type": "text", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@ok": { + "type": "text", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@send": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "@banned": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "@account": { + "type": "text", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@notifications": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@chat": { + "type": "text", + "placeholders": {} + }, + "@group": { + "type": "text", + "placeholders": {} + }, + "@leave": { + "type": "text", + "placeholders": {} + }, + "@skip": { + "type": "text", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@allChats": { + "type": "text", + "placeholders": {} + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@license": { + "type": "text", + "placeholders": {} + }, + "@addToSpace": {}, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@forward": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@about": { + "type": "text", + "placeholders": {} + }, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "text", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "text", + "placeholders": {} + }, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "text", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@you": { + "type": "text", + "placeholders": {} + }, + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "text", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@messages": { + "type": "text", + "placeholders": {} + }, + "@login": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@settings": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@security": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "text", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@archive": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "@devices": { + "type": "text", + "placeholders": {} + }, + "@accept": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@share": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "text", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "@verify": { + "type": "text", + "placeholders": {} + }, + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@pin": { + "type": "text", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + } +} \ No newline at end of file diff --git a/assets/l10n/intl_ca.arb b/assets/l10n/intl_ca.arb index 03b924fc50..e9c5f012a9 100644 --- a/assets/l10n/intl_ca.arb +++ b/assets/l10n/intl_ca.arb @@ -10,7 +10,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} ha acceptat la invitació", + "acceptedTheInvitation": "👍 {username} ha acceptat la invitació", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -22,23 +22,13 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informació del compte", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ha activat el xifratge d’extrem a extrem", + "activatedEndToEndEncryption": "🔐 {username} ha activat el xifratge d’extrem a extrem", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "addGroupDescription": "Afegeix descripció de grup", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Administració", "@admin": { "type": "text", @@ -54,11 +44,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Ja teniu un compte?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} ha respost a la trucada", "@answeredTheCall": { "type": "text", @@ -81,36 +66,21 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Sala arxivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Accés dels usuaris convidats", + "areGuestsAllowedToJoin": "Es pot entrar al xat com a convidadi", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "areYouSure": "N’esteu segur?", + "areYouSure": "N’esteu seguri?", "@areYouSure": { "type": "text", "placeholders": {} }, - "askSSSSCache": "Introduïu la frase de seguretat o la clau de recuperació per a desar les claus en memòria cau.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Introduïu la frase de seguretat o clau de recuperació per a verificar la vostra sessió.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Voleu acceptar aquesta sol·licitud de verificació de: {username}?", "@askVerificationRequest": { "type": "text", @@ -118,22 +88,12 @@ "username": {} } }, - "authentication": "Autenticació", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "L’avatar ha canviat", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "banFromChat": "Veta del xat", "@banFromChat": { "type": "text", "placeholders": {} }, - "banned": "Vetat", + "banned": "Vetadi", "@banned": { "type": "text", "placeholders": {} @@ -156,11 +116,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Claus desades a la memòria cau", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancel·la", "@cancel": { "type": "text", @@ -274,21 +229,11 @@ "username": {} } }, - "changelog": "Registre de canvis", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Canvia la contrasenya", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "S’han desat els canvis", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Canvia el servidor", "@changeTheHomeserver": { "type": "text", @@ -304,16 +249,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Canvia el servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Canvia el fons", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "El xifratge s’ha corromput", "@channelCorruptedDecryptError": { "type": "text", @@ -339,11 +274,6 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Trieu un nom d’usuari", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "close": "Tanca", "@close": { "type": "text", @@ -359,7 +289,7 @@ "type": "text", "description": "Usage hint for the command /leave" }, - "commandHint_op": "Estableix el nivell d'autoritat de l'usuari (per defecte: 50)", + "commandHint_op": "Estableix el nivell d'autoritat d'uni usuàriï (per defecte: 50)", "@commandHint_op": { "type": "text", "description": "Usage hint for the command /op" @@ -374,12 +304,12 @@ "type": "text", "description": "Usage hint for the command /send" }, - "compareEmojiMatch": "Compareu i assegureu-vos que els emojis següents coincideixen amb els de l’altre dispositiu:", + "compareEmojiMatch": "Compareu aquests emojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Compareu i assegureu-vos que els nombres següents coincideixen amb els de l’altre dispositiu:", + "compareNumbersMatch": "Compareu aquests números", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -394,11 +324,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Ha fallat l’intent de connexió", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -409,16 +334,11 @@ "type": "text", "placeholders": {} }, - "containsUserName": "Conté el nom d’usuari", + "containsUserName": "Inclou nom d'usuàriï", "@containsUserName": { "type": "text", "placeholders": {} }, - "contentViewer": "Visualitzador de continguts", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "S’ha copiat al porta-retalls", "@copiedToClipboard": { "type": "text", @@ -436,16 +356,6 @@ "error": {} } }, - "couldNotSetAvatar": "No s'ha pogut establir la imatge de perfil", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "No s’ha pogut definir l'àlies", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participants", "@countParticipants": { "type": "text", @@ -458,33 +368,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Crea un compte ara", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} ha creat el xat", + "createdTheChat": "💬 {username} ha creat el xat", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Crea un grup nou", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Signatura creuada desactivada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Signatura creuada activada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Actiu actualment", "@currentlyActive": { "type": "text", @@ -520,7 +410,7 @@ "day": {} } }, - "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuari. Això no es pot desfer! Esteu segur de fer-ho?", + "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} @@ -540,11 +430,6 @@ "type": "text", "placeholders": {} }, - "deny": "Denega", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Dispositiu", "@device": { "type": "text", @@ -565,21 +450,11 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Descarta la imatge", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Ha canviat l'àlies", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Donació", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Baixa el fitxer", "@downloadFile": { "type": "text", @@ -595,11 +470,6 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "Canvia la instància de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "emoteExists": "L'emoticona ja existeix!", "@emoteExists": { "type": "text", @@ -655,21 +525,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algorisme de xifratge", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "El xifratge no s’ha activat", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Paràmetres del xifratge d’extrem a extrem", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} ha finalitzat la trucada", "@endedTheCall": { "type": "text", @@ -677,21 +537,11 @@ "senderName": {} } }, - "enterAGroupName": "Introduïu un nom de grup", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Introduïu una adreça electrònica", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Introduïu un nom d’usuari", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Introdueix el teu servidor", "@enterYourHomeserver": { "type": "text", @@ -702,11 +552,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Mida del fitxer", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -717,11 +562,6 @@ "type": "text", "placeholders": {} }, - "friday": "divendres", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Des de la unió", "@fromJoining": { "type": "text", @@ -737,16 +577,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Descripció de grup", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descripció de grup canviada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "El grup és públic", "@groupIsPublic": { "type": "text", @@ -782,7 +612,7 @@ "type": "text", "placeholders": {} }, - "hideRedactedEvents": "Amaga els esdeveniments velats", + "hideRedactedEvents": "Amaga els esdeveniments estripats", "@hideRedactedEvents": { "type": "text", "placeholders": {} @@ -792,11 +622,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "El servidor no és compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "id": "Id.", "@id": { "type": "text", @@ -812,16 +637,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Pots ignorar els usuaris que et molestin. No rebràs els missatges ni les invitacions dels usuaris que es trobin a la teva llista personal d'ignorats.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignora nom d'usuari", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "He fet clic a l'enllaç", "@iHaveClickedOnLink": { "type": "text", @@ -849,7 +664,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} ha convidat a {targetName}", + "invitedUser": "📩 {username} ha convidat a {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -857,7 +672,7 @@ "targetName": {} } }, - "invitedUsersOnly": "Només usuaris convidats", + "invitedUsersOnly": "Només usuàriïs convidadis", "@invitedUsersOnly": { "type": "text", "placeholders": {} @@ -867,7 +682,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Instal·la FluffyChat: https://fluffychat.im\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació: {link}", + "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l'app\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -875,17 +690,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "És correcta la següent clau de dispositiu?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "escrivint…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} s'ha unit al xat", + "joinedTheChat": "👋 {username} s'ha unit al xat", "@joinedTheChat": { "type": "text", "placeholders": { @@ -897,17 +707,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Les claus estan desades a la memòria cau", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Falten les claus", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} ha expulsat a {targetName}", + "kicked": "👞 {username} ha expulsat a {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -915,7 +715,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} ha expulsat i vetat a {targetName}", + "kickedAndBanned": "🙅 {username} ha expulsat i vetat a {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -935,16 +735,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Última direcció IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vist va molt de temps", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Abandona", "@leave": { "type": "text", @@ -1004,33 +794,11 @@ "homeserver": {} } }, - "loginWith": "Inicia la sessió amb {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Finalitza la sessió", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Crea un moderador", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Crea un administrador", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Assegura't que l'identificador sigui vàlid", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Canvis de participants", "@memberChanges": { "type": "text", @@ -1041,21 +809,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "El missatge s'eliminarà per a tots els participants", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderador", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "dilluns", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Silencia el xat", "@muteChat": { "type": "text", @@ -1066,7 +824,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Missatge nou al FluffyChat", + "newMessageInFluffyChat": "💬 Missatge nou al FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1086,26 +844,16 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "De moment FluffyChat no és compatible amb la signatura creuada. Activa-la des d'Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "No s’ha trobat cap emoticona. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem utilitzar https://microg.org/ o https://unifiedpush.org/.", + "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem instaŀlar ntfy. Amb ntfy o qualsevol altre proveïdor de Unified Push, pots rebre notificacions de forma segura i lliure. Pots instaŀlar ntfy des de la PlayStore o des de F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "De moment FluffyChat no és compatible amb la còpia de seguretat de claus en línia. Activa-la des d'Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Cap", "@none": { "type": "text", @@ -1136,19 +884,7 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "No compatible amb la versió web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seleccionat/s", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} usuaris escrivint…", + "numUsersTyping": "{count} usuàriïs escrivint…", "@numUsersTyping": { "type": "text", "placeholders": { @@ -1170,11 +906,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "La còpia de seguretat de claus en línia està desactivada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "La còpia de seguretat de claus en línia està activada", "@onlineKeyBackupEnabled": { "type": "text", @@ -1195,21 +926,11 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Opcional) Nom del grup", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "O", "@or": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "Dispositius d'usuari participant", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "contrasenya o clau de recuperació", "@passphraseOrKey": { "type": "text", @@ -1257,11 +978,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Tria un nom d'usuari", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Fes clic a l'enllaç del correu i, després, segueix.", "@pleaseClickOnLink": { "type": "text", @@ -1272,17 +988,12 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Introdueix un identificador de Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Introdueix la teva contrasenya", "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} }, - "pleaseEnterYourUsername": "Introdueix el teu nom d'usuari", + "pleaseEnterYourUsername": "Introdueix el teu nom d'usuàriï", "@pleaseEnterYourUsername": { "type": "text", "placeholders": {} @@ -1307,7 +1018,7 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username} ha velat un esdeveniment", + "redactedAnEvent": "{username} ha estripat un esdeveniment", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -1353,16 +1064,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "Desfés l'expulsió", + "unbanFromChat": "Aixeca el veto", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "Elimina missatge", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Mostra el contingut enriquit dels missatges", "@renderRichContent": { "type": "text", @@ -1378,31 +1084,11 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Sol·licita llegir els missatges antics", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revoca tots els permisos", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "La sala s'ha actualitzat", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "dissabte", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Cerca un xat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Seguretat", "@security": { "type": "text", @@ -1415,22 +1101,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Vist per {username} i {count} més}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Vist per {username} i {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Envia", "@send": { "type": "text", @@ -1450,11 +1120,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Permet l'enviament d'informes d'error amb sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Envia un fitxer", "@sendFile": { "type": "text", @@ -1480,35 +1145,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} ha enviat un fitxer", + "sentAFile": "📁 {username} ha enviat un fitxer", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} ha enviat un àudio", + "sentAnAudio": "🎤 {username} ha enviat un àudio", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} ha enviat una imatge", + "sentAPicture": "🖼️ {username} ha enviat una imatge", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} ha enviat un adhesiu", + "sentASticker": "😊 {username} ha enviat un adhesiu", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} ha enviat un vídeo", + "sentAVideo": "🎥 {username} ha enviat un vídeo", "@sentAVideo": { "type": "text", "placeholders": { @@ -1522,26 +1187,6 @@ "senderName": {} } }, - "sentryInfo": "Informació sobre la vostra privadesa: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "S’ha verificat la sessió", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Defineix una foto de perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Defineix la descripció del grup", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Defineix l’enllaç per a convidar", "@setInvitationLink": { "type": "text", @@ -1574,11 +1219,6 @@ "username": {} } }, - "signUp": "Registre", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Autenticació única", "@singlesignon": { "type": "text", @@ -1589,11 +1229,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "So, vibració i color de LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Codi font", "@sourceCode": { "type": "text", @@ -1606,11 +1241,6 @@ "senderName": {} } }, - "startYourFirstChat": "Creeu el vostre primer xat ara mateix! 🙂\n- Feu clic al botó 'Nou xat'\n- Escanegeu el codi QR d’un conegut\n- Gaudiu del xat", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "Com us sentiu avui?", "@statusExampleMessage": { "type": "text", @@ -1621,26 +1251,11 @@ "type": "text", "placeholders": {} }, - "sunday": "diumenge", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Sistema", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowImage": "Toqueu per a mostrar la imatge", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toqueu per a mostrar el menú", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "No coincideixen", "@theyDontMatch": { "type": "text", @@ -1651,26 +1266,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Aquesta sala ha estat arxivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "dijous", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1692,17 +1287,12 @@ "type": "text", "placeholders": {} }, - "tuesday": "dimarts", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "No disponible", "@unavailable": { "type": "text", "placeholders": {} }, - "unbannedUser": "{username} ha tret el veto a {targetName}", + "unbannedUser": "{username} ha aixecat el veto a {targetName}", "@unbannedUser": { "type": "text", "placeholders": { @@ -1732,11 +1322,6 @@ "type": {} } }, - "unknownSessionVerify": "La sessió és desconeguda; verifiqueu-la", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Deixa de silenciar el xat", "@unmuteChat": { "type": "text", @@ -1754,24 +1339,12 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 missatge no llegit} other{{unreadEvents} missatges no llegits}}", - "@unreadMessages": { + "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", + "@userAndOthersAreTyping": { "type": "text", "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Voleu utilitzar colors adients per a AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} + "username": {}, + "count": {} } }, "userAndUserAreTyping": "{username} i {username2} estan escrivint…", @@ -1789,14 +1362,14 @@ "username": {} } }, - "userLeftTheChat": "{username} ha marxat del xat", + "userLeftTheChat": "🚪 {username} ha marxat del xat", "@userLeftTheChat": { "type": "text", "placeholders": { "username": {} } }, - "username": "Nom d’usuari", + "username": "Nom d’usuàriï", "@username": { "type": "text", "placeholders": {} @@ -1809,21 +1382,11 @@ "type": {} } }, - "verifiedSession": "Sessió verificada amb èxit!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verifica", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verifica manualment", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Inicia la verificació", "@verifyStart": { "type": "text", @@ -1839,11 +1402,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifica usuari", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videotrucada", "@videoCall": { "type": "text", @@ -1879,7 +1437,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Fons", + "wallpaper": "Fons:", "@wallpaper": { "type": "text", "placeholders": {} @@ -1889,21 +1447,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "El xifrat d'extrem a extrem es troba actualment en proves (Beta. Utilitza'l sota la teva responsabilitat!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "dimecres", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Us donem la benvinguda a l’aplicació de missatgeria instantània més maca de la xarxa Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Us hem enviat un missatge de correu electrònic", "@weSentYouAnEmail": { "type": "text", @@ -1934,31 +1477,16 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Us han convidat a aquest xat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Ja no participeu en aquest xat", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "No us podeu convidar a vós mateix", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Has estat vetat d'aquest xat", + "youHaveBeenBannedFromThisChat": "T'han vetat en aquest xat", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "El vostre nom d’usuari", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "La vostra clau pública", "@yourPublicKey": { "type": "text", @@ -1969,23 +1497,8 @@ "type": "text", "placeholders": {} }, - "addNewFriend": "Afegeix una amistat", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Posa en pausa", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Afegeix a un espai", "@addToSpace": {}, - "audioPlayerPlay": "Reprodueix", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, "areYouSureYouWantToLogout": "Segur que voleu finalitzar la sessió?", "@areYouSureYouWantToLogout": { "type": "text", @@ -1996,16 +1509,6 @@ "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "El xat s’ha tret d’aquest espai", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearText": "Neteja el text", - "@clearText": { - "type": "text", - "placeholders": {} - }, "commandInvalid": "L’ordre no és vàlida", "@commandInvalid": { "type": "text" @@ -2025,16 +1528,6 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "No s’ha trobat cap sala pública…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grups públics", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "link": "Enllaç", "@link": {}, "people": "Gent", @@ -2042,12 +1535,7 @@ "type": "text", "placeholders": {} }, - "publicSpace": "Espai públic", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Vela el missatge", + "redactMessage": "Estripa el missatge", "@redactMessage": { "type": "text", "placeholders": {} @@ -2056,21 +1544,11 @@ "@sendOnEnter": {}, "clearArchive": "Neteja l’arxiu", "@clearArchive": {}, - "chatBackupDescription": "La còpia de seguretat dels xats és protegida amb una clau. Assegureu-vos de no perdre-la.", + "chatBackupDescription": "Els teus xats antics estan protegits amb una clau de recuperació. Assegureu-vos de no perdre-la.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "publicKey": "Clau pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "S’estan sincronitzant els vostres xats…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "El xat s’ha afegit a aquest espai", "@chatHasBeenAddedToThisSpace": {}, "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", @@ -2108,16 +1586,6 @@ "type": "text", "placeholders": {} }, - "noDescription": "Cap descripció", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Activeu la còpia de seguretat del xat per a mai perdre accés a les converses.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "newChat": "Xat nou", "@newChat": { "type": "text", @@ -2128,39 +1596,17 @@ "type": "text", "placeholders": {} }, - "zoomIn": "Apropa", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Allunya", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "ignore": "Ignora", "@ignore": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Desa el fitxer en aquesta carpeta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Us connectareu a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "commandHint_react": "Envia una resposta com a reacció", "@commandHint_react": { "type": "text", "description": "Usage hint for the command /react" }, - "defaultPermissionLevel": "Nivell de permisos per defecte", + "defaultPermissionLevel": "Nivell de permisos per defecte per nous membres", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2170,38 +1616,18 @@ "type": "text", "placeholders": {} }, - "iWroteDownTheKey": "He escrit la clau", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "S’ha configurat la còpia de seguretat del xat.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Hem generat una clau de seguretat per a protegir els vostres missatges.\nConserveu-la en un lloc segur, com ara un gestor de contrasenyes.", - "@setupChatBackupDescription": {}, - "setupChatBackup": "Configura la còpia de seguretat dels xats", - "@setupChatBackup": {}, "contentHasBeenReported": "El contingut s’ha denunciat als administradors del servidor", "@contentHasBeenReported": { "type": "text", "placeholders": {} }, - "yourUserId": "El vostre id. d’usuari:", - "@yourUserId": {}, - "deviceVerifyDescription": "El xifratge només és segur quan tots els dispositius s’han verificat.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "enableEncryption": "Activa el xifratge", "@enableEncryption": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Introduïu un nom d’espai", - "@enterASpacepName": {}, - "noStatusesFound": "Encara no s’ha trobat cap estat.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "addAccount": "Afegeix un compte", "@addAccount": {}, "noEncryptionForPublicRooms": "Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.", @@ -2209,23 +1635,11 @@ "type": "text", "placeholders": {} }, - "newUsernameDescription": "El vostre identificador d’usuari tindrà el format @nom-d’usuari:nom-del-servidor", - "@newUsernameDescription": {}, "roomVersion": "Versió de la sala", "@roomVersion": { "type": "text", "placeholders": {} }, - "securityKey": "Clau de seguretat", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Heu perduda la clau de seguretat?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "sendMessages": "Envia missatges", "@sendMessages": { "type": "text", @@ -2236,13 +1650,6 @@ "type": "text", "placeholders": {} }, - "savedFileAs": "S’ha desat el fitxer com a {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "pleaseFollowInstructionsOnWeb": "Seguiu les instruccions al lloc web i toqueu «Següent».", "@pleaseFollowInstructionsOnWeb": { "type": "text", @@ -2263,11 +1670,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Toqueu un dispositiu per a verificar-lo", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "toggleFavorite": "Commuta l’estat «preferit»", "@toggleFavorite": { "type": "text", @@ -2283,16 +1685,6 @@ "type": "text", "placeholders": {} }, - "unlockChatBackup": "Desbloca la còpia de seguretat del xat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "L’usuari no s’ha verificat", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "Defineix emoticones personalitzades", "@setCustomEmotes": { "type": "text", @@ -2308,7 +1700,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Voleu suprimir la còpia de seguretat dels xats per a crear una clau de seguretat nova?", + "wipeChatBackup": "Voleu suprimir la còpia de seguretat dels xats per a crear una clau de recuperació nova?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2318,16 +1710,6 @@ "type": "text", "placeholders": {} }, - "userUnknownVerification": "L’estat de verificació de l’usuari és desconegut", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "L’usuari s’ha verificat", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "unverified": "No verificat", "@unverified": {}, "commandHint_me": "Descriviu-vos", @@ -2358,11 +1740,6 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "Cancel·la i no m’ho tornis a preguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "errorObtainingLocation": "S’ha produït un error en obtenir la ubicació: {error}", "@errorObtainingLocation": { "type": "text", @@ -2370,11 +1747,6 @@ "error": {} } }, - "friends": "Amistats", - "@friends": { - "type": "text", - "placeholders": {} - }, "groups": "Grups", "@groups": { "type": "text", @@ -2440,7 +1812,7 @@ "type": "text", "description": "Usage hint for the command /join" }, - "commandHint_kick": "Elimina l'usuari indicat d'aquesta sala", + "commandHint_kick": "Expulsa uni usuàriï d'aquesta sala", "@commandHint_kick": { "type": "text", "description": "Usage hint for the command /kick" @@ -2455,12 +1827,12 @@ "type": "text", "description": "Usage hint for the command /dm" }, - "commandHint_invite": "Convida l'usuari indicat a aquesta sala", + "commandHint_invite": "Convida uni usuàriï a aquesta sala", "@commandHint_invite": { "type": "text", "description": "Usage hint for the command /invite" }, - "commandHint_ban": "Prohibeix l'usuari indicat d'aquesta sala", + "commandHint_ban": "Veta uni usuàriï d'aquesta sala", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -2475,24 +1847,8 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "passwordsDoNotMatch": "Les contrasenyes no coincideixen!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Introduïu una adreça electrònica vàlida.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Repetiu la contrasenya", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Seleccioneu almenys {min} caràcters.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "bubbleSize": "Mida de la bombolla", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "commandHint_myroomnick": "Estableix el teu àlies per a aquesta sala", "@commandHint_myroomnick": { "type": "text", @@ -2511,19 +1867,1027 @@ "supportedVersions": {} } }, - "discoverGroups": "Descobreix grups", - "@discoverGroups": { + "hugContent": "{senderName} t'abraça", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "jumpToLastReadMessage": "Salta a l'últim missatge llegit", + "@jumpToLastReadMessage": {}, + "allRooms": "Tots els xats de grup", + "@allRooms": { "type": "text", "placeholders": {} }, - "discover": "Descobreix", - "@discover": { + "commandHint_cuddle": "Envia una carícia", + "@commandHint_cuddle": {}, + "widgetVideo": "Vídeo", + "@widgetVideo": {}, + "dismiss": "Ignora-ho", + "@dismiss": {}, + "reportErrorDescription": "😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d'aquest bug a l'equip de desenvolupament.", + "@reportErrorDescription": {}, + "removeYourAvatar": "Esborra el teu avatar", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Aquesta versió d'Android és incompatible", + "@unsupportedAndroidVersion": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "messageType": "Tipus de missatge", + "@messageType": {}, + "indexedDbErrorLong": "L'emmagatzematge de missatges no està disponible per defecte en el mode privat.\nVisita\n - about:config\n - posa a true l'opció dom.indexedDB.privateBrowsing.enabled\nSi no ho fas, no podràs fer servir FluffyChat en mode privat.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Una de les teves aplicacions ha tancat la sessió", + "@oneClientLoggedOut": {}, + "startFirstChat": "Comença el teu primer xat", + "@startFirstChat": {}, + "callingAccount": "Compte de la trucada", + "@callingAccount": {}, + "setColorTheme": "Tria el color del tema:", + "@setColorTheme": {}, + "nextAccount": "Compte següent", + "@nextAccount": {}, + "allSpaces": "Tots els espais", + "@allSpaces": {}, + "supposedMxid": "Això hauria de ser {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "user": "Usuàrïi", + "@user": {}, + "youAcceptedTheInvitation": "👍 Has acceptat la invitació", + "@youAcceptedTheInvitation": {}, + "noMatrixServer": "{server1} no és un servidor de matrix, vols fer servir {server2} ?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "youInvitedBy": "📩 {user} t'ha convidat", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "banUserDescription": "Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.", + "@banUserDescription": {}, + "widgetEtherpad": "Nota de text", + "@widgetEtherpad": {}, + "removeDevicesDescription": "Tancaràs la sessió d'aquest dispositiu i no hi podràs rebre més missatges.", + "@removeDevicesDescription": {}, + "separateChatTypes": "Separa xats directes i grups", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "tryAgain": "Torna-ho a provar", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Has expulsat i vetat a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "unbanUserDescription": "L'usuàrïi ja pot tornar a entrar al xat.", + "@unbanUserDescription": {}, + "youRejectedTheInvitation": "Has rebutjat la invitació", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Micròfon, càmera i altres permisos del FluffyChat", + "@otherCallingPermissions": {}, + "messagesStyle": "Missatges:", + "@messagesStyle": {}, + "widgetUrlError": "La URL no és vàlida.", + "@widgetUrlError": {}, + "emailOrUsername": "Email o nom d'usuàrïi", + "@emailOrUsername": {}, + "newSpaceDescription": "Els espais et permeten consolidar ls por", + "@newSpaceDescription": {}, + "chatDescription": "Descripció del xat", + "@chatDescription": {}, + "callingAccountDetails": "Permet al FluffyChat de fer servir l'app de trucades nativa de l'Android.", + "@callingAccountDetails": {}, + "editRoomAliases": "Canvia els àlies de la sala", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "enterSpace": "Obre l'espai", + "@enterSpace": {}, + "encryptThisChat": "Xifra aquest xat", + "@encryptThisChat": {}, + "previousAccount": "Compte anterior", + "@previousAccount": {}, + "reopenChat": "Reobre el xat", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Introdueix la teva clau de recuperació:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "Posa el nom públic.", + "@widgetNameError": {}, + "inoffensive": "Inofensiu", + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "addToBundle": "Afegeix al pquet", + "@addToBundle": {}, + "addWidget": "Afegeix un giny", + "@addWidget": {}, + "countFiles": "{count} arxius", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noKeyForThisMessage": "Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d'aquest dispositiu.\n\nTambé pot ser que l'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura't que els teus dispositius s'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura't que has activat la còpia de seguretat del xat als paràmetres.", + "@noKeyForThisMessage": {}, + "commandHint_markasgroup": "Marca com un grup", + "@commandHint_markasgroup": {}, + "hydrateTor": "Usuàrïis de Tor: Importa una sessió anterior", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "Les notificacions push no estan disponibles", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Desa en la Apple KeyChain", + "@storeInAppleKeyChain": {}, + "replaceRoomWithNewerVersion": "Substitueix la sala amb la versió més recent", + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "hydrate": "Restaura un arxiu de recuperació", + "@hydrate": {}, + "invalidServerName": "El nom del servidor és invàlid", + "@invalidServerName": {}, + "chatPermissions": "Permisos del xat", + "@chatPermissions": {}, + "sender": "Remitent", + "@sender": {}, + "storeInAndroidKeystore": "Desa en la Android KeyStore", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "Inicia sessió amb contrasenya", + "@signInWithPassword": {}, + "offensive": "Ofensiu", + "@offensive": { + "type": "text", + "placeholders": {} + }, + "makeAdminDescription": "Un cop hagis fet admin aquesta persona ja no podràs desfer-ho, ja que llavors tindrà els mateixos permisos que tu.", + "@makeAdminDescription": {}, + "saveKeyManuallyDescription": "Per desar aquesta clau manualment, pica l'eina de compartir o copia-la al porta-retalls.", + "@saveKeyManuallyDescription": {}, + "editBundlesForAccount": "Edita paquets per aquest compte", + "@editBundlesForAccount": {}, + "whyIsThisMessageEncrypted": "Per què no es pot llegir aquest missatge?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Posa una descripció de xat", + "@setChatDescription": {}, + "importFromZipFile": "Importa des d'un arxiu zip", + "@importFromZipFile": {}, + "dehydrateWarning": "Aquesta acció és irreversible. Assegura't que deses l'arxiu de recuperació en un lloc segur.", + "@dehydrateWarning": {}, + "noOtherDevicesFound": "No s'han trobat més dispositius", + "@noOtherDevicesFound": {}, + "redactedBy": "Estripat per {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "videoCallsBetaWarning": "Tingues en compte que les trucades de vídeo estan encara en beta. Pot ser que no funcioni bé o que falli en alguna plataforma.", + "@videoCallsBetaWarning": {}, + "participant": "Participant", + "@participant": { + "type": "text", + "placeholders": {} + }, + "signInWith": "Inicia sessió amb {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "fileIsTooBigForServer": "No s'ha pogut enviar! El servidor només accepta adjunts de fins a {max}.", + "@fileIsTooBigForServer": {}, + "homeserver": "Servidor", + "@homeserver": {}, + "callingPermissions": "Permisos de trucada", + "@callingPermissions": {}, + "readUpToHere": "Llegit fins aquí", + "@readUpToHere": {}, + "start": "Comença", + "@start": {}, + "register": "Registra't", + "@register": { + "type": "text", + "placeholders": {} + }, + "unlockOldMessages": "Desbloqueja els missatges antics", + "@unlockOldMessages": {}, + "numChats": "{number} xats", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "optionalRedactReason": "(Opcional) El motiu per estripar el missatge...", + "@optionalRedactReason": {}, + "dehydrate": "Exporta la sessió i neteja el dispositiu", + "@dehydrate": {}, + "archiveRoomDescription": "Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Exporta com un pack Emote en .zip", + "@exportEmotePack": {}, + "switchToAccount": "Canvia al compte {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "experimentalVideoCalls": "Trucades de vídeo experimentals", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "Per desbloquejar els missatges antics, introdueix la clau de recuperació que vas generar en una sessió anterior. La clau de recuperació NO és la teva contrasenya.", + "@pleaseEnterRecoveryKeyDescription": {}, + "openInMaps": "Obre als mapes", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Vols convidar {contact} al xat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Estripat per {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "Has rebutjat la invitació de {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "appearOnTopDetails": "Permet a l'app que aparegui sobre d'altres apps. No cal si ja has afegit FluffyChat com a compte de trucades", + "@appearOnTopDetails": {}, + "enterRoom": "Entra a la sala", + "@enterRoom": {}, + "reportUser": "Denuncia l'usuàrïi", + "@reportUser": {}, + "confirmEventUnpin": "Vols desfixar l'esdeveniment permanentment?", + "@confirmEventUnpin": {}, + "badServerVersionsException": "Aquest servidor suporta aquestes versions de Matrix:\n{serverVersions}\nPerò aquesta aplicación només és compatible amb {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "youInvitedUser": "📩 Has convidat a {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "fileHasBeenSavedAt": "S'ha desat l'arxiu a {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "redactMessageDescription": "S'estriparà el missatge per a totser d'aquesta conversa. Aquesta acció és irreversible.", + "@redactMessageDescription": {}, + "recoveryKey": "Clau de recuperació", + "@recoveryKey": {}, + "invalidInput": "L'entrada no és vàlida!", + "@invalidInput": {}, + "dehydrateTorLong": "Per a lis usuàrïis de Tor, es recomana exportar la sessió abans de tancar la finestra.", + "@dehydrateTorLong": {}, + "doNotShowAgain": "No ho tornis a mostrar", + "@doNotShowAgain": {}, + "report": "informa", + "@report": {}, + "serverRequiresEmail": "Aquest servidor necessita validar la teva adreça per registrar-t'hi.", + "@serverRequiresEmail": {}, + "hideUnimportantStateEvents": "Amaga canvis d'estat poc importants", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "compartició de pantalla", + "@screenSharingTitle": {}, + "widgetCustom": "Personalització", + "@widgetCustom": {}, + "addToSpaceDescription": "Tria un espai per afegir-hi el xat.", + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} t'ha enviat un parell d'ulls", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "youBannedUser": "Has vetat a {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "addChatDescription": "Afegeix una descripció al xat...", + "@addChatDescription": {}, + "editRoomAvatar": "Canvia la imatge de la sala", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pica a la porta", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "publish": "Publica", + "@publish": {}, + "openLinkInBrowser": "Obre l'enllaç en un navegador", + "@openLinkInBrowser": {}, + "messageInfo": "Informació del missatge", + "@messageInfo": {}, + "disableEncryptionWarning": "Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.", + "@disableEncryptionWarning": {}, + "directChat": "Xat directe", + "@directChat": {}, + "wrongPinEntered": "Pin incorrecte! Torna-ho a provar en {seconds} segons...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Envia notificacions d'escriptura", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Convida al grup", + "@inviteGroupChat": {}, + "appearOnTop": "Mostra per sobre", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Convida a un xat privat", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "Aquesta notificació apareix quan el servei de primer pla està corrent.", + "@foregroundServiceRunning": {}, + "voiceCall": "Videotrucada", + "@voiceCall": {}, + "commandHint_unban": "Aixeca el veto a aquesti usuàriï per aquesta sala", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa emojis", + "@importEmojis": {}, + "wasDirectChatDisplayName": "Xat buit ( era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "No s'ha afegit una descripció de xat.", + "@noChatDescriptionYet": {}, + "removeFromBundle": "Esborra del paquet", + "@removeFromBundle": {}, + "confirmMatrixId": "Confirma la teva ID de Matrix per poder esborrar el compte.", + "@confirmMatrixId": {}, + "learnMore": "Llegeix-ne més", + "@learnMore": {}, + "notAnImage": "No és un arxiu d'image.", + "@notAnImage": {}, + "users": "Usuàrïis", + "@users": {}, + "openGallery": "Obre la galeria", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Ha canviat la descripció del xat", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "Grup nou", + "@newGroup": {}, + "bundleName": "Nom del paquet", + "@bundleName": {}, + "dehydrateTor": "Usuàrïis de Tor: Exporta la sessió", + "@dehydrateTor": {}, + "removeFromSpace": "Esborra de l'espai", + "@removeFromSpace": {}, + "roomUpgradeDescription": "El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Introdueix un número major que 0", + "@pleaseEnterANumber": {}, + "youKicked": "👞 Has expulsat a {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "profileNotFound": "No s'ha trobat el compte en aquest servidor. Pot ser un error de connexió, o que realment no existeixi.", + "@profileNotFound": {}, + "jump": "Salta", + "@jump": {}, + "reactedWith": "{sender} ha reaccionat amb {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "sorryThatsNotPossible": "Aquesta acció no és possible", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Vídeo {size}", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "shareInviteLink": "Comparteix un enllaç d'invitació", + "@shareInviteLink": {}, + "commandHint_markasdm": "Marca com a conversa directa la sala amb aquesta ID de Matrix", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Que has perdut la clau de recuperació?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} et fa una carícia", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "deviceKeys": "Claus del dispositiu:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Els últims emotes usats apareixeran aquí...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Tria el tema:", + "@setTheme": {}, + "youJoinedTheChat": "T'has afegit al xat", + "@youJoinedTheChat": {}, + "openVideoCamera": "Obre la càmera per a fer un vídeo", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "markAsRead": "Marca com a llegit", + "@markAsRead": {}, + "widgetName": "Nom", + "@widgetName": {}, + "errorAddingWidget": "S'ha produït un error en afegir el giny.", + "@errorAddingWidget": {}, + "commandHint_hug": "Envia una abraçada", + "@commandHint_hug": {}, + "replace": "Reemplaça", + "@replace": {}, + "oopsPushError": "Ep! Sembla que s'ha produït un error en configurar les notificacions.", + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "youUnbannedUser": "Has aixecat el veto a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "newSpace": "Espai nou", + "@newSpace": {}, + "emojis": "Emojis", + "@emojis": {}, + "pleaseEnterYourPin": "Introdueix el teu pin", + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "pleaseChoose": "Escull", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "Envia uns ulls curiosos", + "@commandHint_googly": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Torna-ho a provar més tard o tria un servidor diferent.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Crea un grup", + "@createGroup": {}, + "hydrateTorLong": "Que vas exportar la teva última sessió a Tor? La pots importar ara i continuar xatejant.", + "@hydrateTorLong": {}, + "time": "Temps", + "@time": {}, + "custom": "Personalitzat", + "@custom": {}, + "noBackupWarning": "Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "Desa la clau de recuperació en l'emmagatzematge segur d'aquest dispositiu.", + "@storeInSecureStorageDescription": {}, + "openChat": "Obre el xat", + "@openChat": {}, + "kickUserDescription": "Li usuàrïi ha estat expulsadi però no vetadi. Als xats públics, pot tornar-hi a entrar en qualsevol moment.", + "@kickUserDescription": {}, + "importNow": "Importa-ho ara", + "@importNow": {}, + "pinMessage": "Fixa a la sala", + "@pinMessage": {}, + "invite": "Convida", + "@invite": {}, + "enableMultiAccounts": "(Beta) Activa multi-compte en aquest dispositiu", + "@enableMultiAccounts": {}, + "indexedDbErrorTitle": "Problemes amb el mode privat", + "@indexedDbErrorTitle": {}, + "unsupportedAndroidVersionLong": "Aquesta funcionalitat només funciona amb versions d'Android més noves.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Desa de forma segura en aquest dispositiu", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "Estàs compartint la teva pantalla a FluffyChat", + "@screenSharingDetail": {}, + "placeCall": "Truca", + "@placeCall": {}, + "block": "Bloca", + "@block": {}, + "blockUsername": "Ignora aquesti usuàrïi", + "@blockUsername": {}, + "blockedUsers": "Usuàrïis blocadis", + "@blockedUsers": {}, + "blockListDescription": "Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.", + "@blockListDescription": {}, + "pleaseChooseAStrongPassword": "Tria una contrasenya forta", + "@pleaseChooseAStrongPassword": {}, + "youInvitedToBy": "📩 T'han enviat un enllaç d'invitació per:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "groupName": "Nom del grup", + "@groupName": {}, + "createGroupAndInviteUsers": "Crea un grup i convida-hi usuàrïis", + "@createGroupAndInviteUsers": {}, + "wrongRecoveryKey": "Malauradament, aquesta clau de recuperació no és la correcta.", + "@wrongRecoveryKey": {}, + "publicLink": "Enllaç públic", + "@publicLink": {}, + "transparent": "Transparent", + "@transparent": {}, + "sendReadReceiptsDescription": "Lis altris participants d'un xat poden veure quan has llegit un missatge.", + "@sendReadReceiptsDescription": {}, + "yourGlobalUserIdIs": "La teva ID global és: ", + "@yourGlobalUserIdIs": {}, + "startConversation": "Comença una conversa", + "@startConversation": {}, + "commandHint_sendraw": "Envia un json pelat", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "La base de dades ha estat optimitzada", + "@databaseMigrationTitle": {}, + "pleaseEnterYourCurrentPassword": "Fica la teva contrasenya actual", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Contrasenya nova", + "@newPassword": {}, + "restoreSessionBody": "L'aplicació provarà de restaurar la teva sessió des de la còpia de seguretat. Si us plau, comunica aquest error a l'equi pde desenvolupament a {url}. El missatge d'error és {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "formattedMessages": "Missatges amb format", + "@formattedMessages": {}, + "formattedMessagesDescription": "Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verifica uni altri usuàrïi", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Verifica un altre dispositiu", + "@verifyOtherDevice": {}, + "databaseBuildErrorBody": "No s'ha pogut construir la base de dades SQLite. L'aplicació provarà de fer servir un format de base de dades antiquat. Si us plau, comunica aquesta situació a la comunitat de desenvolupament a {url}. El missatge d'error és: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "S'ha produït un error mentre s'inicialitzava l'aplicació", + "@initAppError": {}, + "hidePresences": "Amagar la llista de Status?", + "@hidePresences": {}, + "noUsersFoundWithQuery": "No s'ha trobat cap usuàrïi amb \"{query}\". Revisa si ho has escrit malament.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "leaveEmptyToClearStatus": "Per esborrar el teu estat, deixa-ho en blanc.", + "@leaveEmptyToClearStatus": {}, + "select": "Tria", + "@select": {}, + "searchForUsers": "Cerca @usuariïs...", + "@searchForUsers": {}, + "subspace": "Subespai", + "@subspace": {}, + "addChatOrSubSpace": "Afegeix un xat o un subespai", + "@addChatOrSubSpace": {}, + "decline": "Denega", + "@decline": {}, + "sendReadReceipts": "Envia informes de tecleig", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Lis altris participants d'un xat poden veure quan estàs teclejant un missatge nou.", + "@sendTypingNotificationsDescription": {}, + "incomingMessages": "Missatge d'entrada", + "@incomingMessages": {}, + "presenceStyle": "Presència:", + "@presenceStyle": { "type": "text", "placeholders": {} }, - "editChatPermissions": "Edita els permisos del xat", - "@editChatPermissions": { + "acceptedKeyVerification": "{sender} ha acceptat la verificació de claus", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} ha canceŀlat la verificació de claus", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} ha comletat la verificació de claus", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} està a punt per verificar les claus", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "nothingFound": "No s'ha trobat res...", + "@nothingFound": {}, + "searchChatsRooms": "Cerca #sales, @usuariïs...", + "@searchChatsRooms": {}, + "groupCanBeFoundViaSearch": "El grup es pot trobar per la cerca general", + "@groupCanBeFoundViaSearch": {}, + "databaseMigrationBody": "Espereu un moment, si us plau.", + "@databaseMigrationBody": {}, + "passwordsDoNotMatch": "Les contrasenyes no coincideixen", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "La contrasenya introduïda és incorrecta", + "@passwordIsWrong": {}, + "joinSpace": "Fica't a l'espai", + "@joinSpace": {}, + "publicSpaces": "Espais públics", + "@publicSpaces": {}, + "thisDevice": "Aquest dispositiu:", + "@thisDevice": {}, + "sessionLostBody": "S'ha perdut la teva sessió. Si us plau, comunica aquest error a l'equip de desenvolupament a {url}. El missatge d'error és: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "forwardMessageTo": "Vols reenviar el missatge a {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "verifyOtherUserDescription": "Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l'altra persona i tu veureu un missatge emergent a l'app. Us sortiran un seguit d'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d'iniciar la verificació. 🤳", + "@verifyOtherDeviceDescription": {}, + "requestedKeyVerification": "{sender} ha soŀlicitat verificar claus", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} ha iniciat la verificació de claus", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presencesToggle": "Mostra els missatges d'estat d'altres usuàrïis", + "@presencesToggle": { "type": "text", "placeholders": {} - } + }, + "stickers": "Enganxines", + "@stickers": {}, + "discover": "Descobreix", + "@discover": {}, + "commandHint_ignore": "Ignora el compte de matrix especificat", + "@commandHint_ignore": {}, + "commandHint_unignore": "Deixa d'ignorar el compt de matrix especificat", + "@commandHint_unignore": {}, + "sendCanceled": "S'ha canceŀlat l'enviament", + "@sendCanceled": {}, + "noChatsFoundHere": "Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️", + "@noChatsFoundHere": {}, + "hideMemberChangesInPublicChatsBody": "No mostres a l'històric de conversa de les sales públiques quan algú hi entra o surt. Això facilita la lectura.", + "@hideMemberChangesInPublicChatsBody": {}, + "invitedBy": "📩 Convidadi per {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "knock": "Pica", + "@knock": {}, + "knocking": "S'està picant", + "@knocking": {}, + "restricted": "Restringit", + "@restricted": {}, + "knockRestricted": "No es pot picar a la porta", + "@knockRestricted": {}, + "goToSpace": "Ves a l'espai {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Canvia les opcions generals de xat", + "@changeGeneralChatSettings": {}, + "sendRoomNotifications": "Envia notificacions @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Canvia la descripció del xat", + "@changeTheDescriptionOfTheGroup": {}, + "changelog": "Registre de canvis", + "@changelog": {}, + "userLevel": "{level} - Usuàriï", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderadori", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "inviteOtherUsers": "Convida més gent a la conversa", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Canvia els permisos del xat", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Canvia la visibilitat de l'historial de conversa", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Canvia l'adreça principal del xat", + "@changeTheCanonicalRoomAlias": {}, + "accessAndVisibilityDescription": "Qui pot entrar a aquesta conversa i com pot ser descoberta.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Emojis i stickers propis", + "@customEmojisAndStickers": {}, + "accessAndVisibility": "Accés i visibilitat", + "@accessAndVisibility": {}, + "calls": "Trucades", + "@calls": {}, + "hideRedactedMessages": "Amaga els missatges estripats", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Amaga els missatges que tinguin un format desconegut", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Amaga els canvis d'estat de lis membres a les sales públiques", + "@hideMemberChangesInPublicChats": {}, + "notifyMeFor": "Nofica'm que", + "@notifyMeFor": {}, + "overview": "Resum", + "@overview": {}, + "passwordRecoverySettings": "Recuperació de contrasenya", + "@passwordRecoverySettings": {}, + "userRole": "Rol d'usuàriï", + "@userRole": {}, + "minimumPowerLevel": "El nivell mínim de permisos és {level}.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "gallery": "Galeria", + "@gallery": {}, + "noDatabaseEncryption": "No es pot xifrar la base de dades en aquesta plataforma", + "@noDatabaseEncryption": {}, + "usersMustKnock": "Lis membres han de picar a la porta", + "@usersMustKnock": {}, + "noOneCanJoin": "Ningú s'hi pot ficar", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} vol entrar al xat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "customEmojisAndStickersBody": "Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessagesBody": "Si algú estripa un missatge, ja no apareixerà a l'historial de la conversa.", + "@hideRedactedMessagesBody": {}, + "searchIn": "Cerca al xat \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "markAsUnread": "Marca com a no llegit", + "@markAsUnread": {}, + "chatPermissionsDescription": "Defineix quin nivell de permisos cal per cada acció en aquest xat. Els nivells 0, 50 i 100 normalment representen usuàriïs, mods i admins, però es pot canviar.", + "@chatPermissionsDescription": {}, + "updateInstalled": "🎉 S'ha actualitzat a la versió {version}!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "appLockDescription": "Bloca l'app amb un pin quan no la facis servir", + "@appLockDescription": {}, + "swipeRightToLeftToReply": "Llisca de dreta esquerra per respondre", + "@swipeRightToLeftToReply": {}, + "globalChatId": "Identificador global de xat", + "@globalChatId": {}, + "createNewAddress": "Crea una adreça nova", + "@createNewAddress": {}, + "searchMore": "Cerca més...", + "@searchMore": {}, + "files": "Arxius", + "@files": {}, + "publicChatAddresses": "Adreces públiques del xat", + "@publicChatAddresses": {}, + "unreadChatsInApp": "{appname}: {unread} converses pendents", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "thereAreCountUsersBlocked": "Ara mateix hi ha {count} usuàriïs bloquejadis.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "loginWithMatrixId": "Entra amb l'id de Matrix", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Descobreix servidors", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Què és un servidor de Matrix?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Totes les teves dades s'emmagatzemen al servidor, com passa amb el e-mail. Pots triar quin servidor vols fer servir sense témer a no poder comunicar gent d'altres servidors. Llegeix-ne més a https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "No sembla un servidor compatible. Pot ser que la URL estigui malament?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} xats i {participants} participants", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "No hi ha més xats...", + "@noMoreChatsFound": {}, + "space": "Espai", + "@space": {}, + "joinedChats": "Xats on has entrat", + "@joinedChats": {}, + "unread": "Sense llegir", + "@unread": {}, + "spaces": "Espais", + "@spaces": {}, + "noPublicLinkHasBeenCreatedYet": "No s'ha creat cap enllaç públic", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "El xat es pot descobrir amb la cerca de {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "calculatingFileSize": "S'està calculant la mida de l'arxiu...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "S'està preparant per enviar l'adjunt...", + "@prepareSendingAttachment": {}, + "generatingVideoThumbnail": "S'està generant la miniatura del vídeo...", + "@generatingVideoThumbnail": {}, + "noticeChatBackupDeviceVerification": "Nota: quan connectes tots els dispositius al backup del xat, es verifiquen automàticament.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Continua", + "@continueText": {}, + "strikeThrough": "Text ratllat", + "@strikeThrough": {}, + "addLink": "Afegeix un enllaç", + "@addLink": {}, + "noContactInformationProvided": "El servidor no ofereix cap informació de contacte vàlida", + "@noContactInformationProvided": {}, + "setWallpaper": "Tria imatge de fons", + "@setWallpaper": {}, + "sendImages": "Envia {count} imatge", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "sendingAttachment": "S'està enviant l'adjunt...", + "@sendingAttachment": {}, + "compressVideo": "S'està comprimint el vídeo...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "S'està enviant l'adjunt {index} de {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "S'ha arribat al límit del servidor! Esperant {seconds} segons...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Un dels teus dispositius no està verificat", + "@oneOfYourDevicesIsNotVerified": {}, + "welcomeText": "Hola hola! 👋 Això és FluffyChat. Pots iniciar sessió en qualsevol servidor compatible amb https://matrix.org. I llavors xatejar amb qualsevol. És una xarxa enorme de missatgeria descentralitzada !", + "@welcomeText": {}, + "blur": "Difumina:", + "@blur": {}, + "opacity": "Opacitat:", + "@opacity": {}, + "manageAccount": "Gestiona el compte", + "@manageAccount": {}, + "contactServerAdmin": "Contacta l'admin del servidor", + "@contactServerAdmin": {}, + "contactServerSecurity": "Contacta l'equip de seguretat del servidor", + "@contactServerSecurity": {}, + "version": "Versió", + "@version": {}, + "website": "Lloc web", + "@website": {}, + "compress": "Comprimeix", + "@compress": {}, + "pleaseFillOut": "Emplena", + "@pleaseFillOut": {}, + "invalidUrl": "URL invàlida", + "@invalidUrl": {}, + "unableToJoinChat": "No s'ha pogut entrar al xat. Pot ser que l'altri participant hagi tancat la conversa.", + "@unableToJoinChat": {}, + "aboutHomeserver": "Quant a {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "supportPage": "Pàgina de suport", + "@supportPage": {}, + "serverInformation": "Informació del servidor:", + "@serverInformation": {}, + "name": "Nom", + "@name": {}, + "boldText": "Text en negreta", + "@boldText": {}, + "italicText": "Text en cursiva", + "@italicText": {} } diff --git a/assets/l10n/intl_cs.arb b/assets/l10n/intl_cs.arb index 72c369fb0c..6fa9911adc 100644 --- a/assets/l10n/intl_cs.arb +++ b/assets/l10n/intl_cs.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} přijali pozvání", + "acceptedTheInvitation": "👍 {username} přijal/a pozvání", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informace o účtu", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktivoval koncové šifrování", + "activatedEndToEndEncryption": "🔐 {username} aktivoval/a koncové šifrování", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Přidat popis skupiny", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Přidat nového přítele", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Správce", "@admin": { "type": "text", @@ -70,11 +55,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Máte již účet?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} odpověděl na hovor", "@answeredTheCall": { "type": "text", @@ -97,11 +77,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Archivovaná místnost", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Mohou se připojit hosté", "@areGuestsAllowedToJoin": { "type": "text", @@ -117,21 +92,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Prosím zadejte vaší přístupovu frázi k „bezpečnému úložišti“ anebo „klíč na obnovu“ pro uložení klíčů.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Pro ověření této osoby zadejte prosím přístupovou frázi k „bezpečnému úložišti“ anebo „klíč pro obnovu“.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Zadejte prosím vaší přístupovou frází k „bezpečnému úložišti“ anebo „klíč pro obnovu“ pro ověření vaší relace.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Přijmout žádost o ověření od {username}?", "@askVerificationRequest": { "type": "text", @@ -139,31 +104,11 @@ "username": {} } }, - "audioPlayerPause": "Pozastavit", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Přehrát", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Ověření", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Automaticky přehrajte animované nálepky a emoce", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar byl změněn", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Homeserver podporuje přihlášení typu:\n{serverVersions}\nAle tato aplikace podporuje pouze:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -213,11 +158,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Klíče v mezipaměti", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Zrušit", "@cancel": { "type": "text", @@ -339,21 +279,11 @@ "username": {} } }, - "changelog": "Historie změn", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Změnit heslo", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Změny byly uloženy", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Změnit domovský server", "@changeTheHomeserver": { "type": "text", @@ -369,16 +299,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Změňte server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Změnit pozadí", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Změňte svůj avatar", "@changeYourAvatar": { "type": "text", @@ -399,7 +319,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "Záloha chatu je zabezpečena bezpečnostním klíčem. Ujistěte se, že klíč neztratíte.", + "chatBackupDescription": "Záloha chatu je zabezpečena bezpečnostním klíčem. Ujistěte se, prosím, že klíč neztratíte.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -419,18 +339,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Vyberte uživatelské jméno", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Vymazat archiv", "@clearArchive": {}, - "clearText": "Smazat text", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Zavřít", "@close": { "type": "text", @@ -543,11 +453,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Pokus o připojení selhal", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt byl pozván do skupiny", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -568,11 +473,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Prohlížeč obsahu", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Zkopírováno do schránky", "@copiedToClipboard": { "type": "text", @@ -595,16 +495,6 @@ "error": {} } }, - "couldNotSetAvatar": "Nebylo možné nastavit avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nebylo možné nastavit přezdívku uživatele", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} účastníků", "@countParticipants": { "type": "text", @@ -617,38 +507,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Vytvořit účet teď", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} založil chat", + "createdTheChat": "💬 {username} založil/a chat", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Založit novou skupinu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Nový prostor", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Křížové ověření je vypnuté", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Křížové ověření je zapnuté", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Aktuálně aktivní", "@currentlyActive": { "type": "text", @@ -689,7 +559,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Výchozí úroveň oprávnění", + "defaultPermissionLevel": "Výchozí úroveň oprávnění nových uživatelů", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -709,11 +579,6 @@ "type": "text", "placeholders": {} }, - "deny": "Odmítnout", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Zařízení", "@device": { "type": "text", @@ -729,46 +594,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Šifrování je bezpečné pouze tehdy, kdy jsou ověřená všechna zařízení.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Přímé chatování", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Zahodit obrázek", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Objevit", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Objevte skupiny", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Přezdívka byla změněna", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Přispějte", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Zrušit a znovu se neptat", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Stáhnout soubor", "@downloadFile": { "type": "text", @@ -784,21 +619,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Upravit oprávnění chatu", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Změnit přezdívku", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Nastavení komunikátoru Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Upravit aliasy místností", "@editRoomAliases": { "type": "text", @@ -844,11 +669,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Povolte zálohu chatu, abyste nikdy neztratili přístup ke svým chatům.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Povolit balíček emotikon všude", "@enableEmotesGlobally": { "type": "text", @@ -874,21 +694,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Šifrovací algoritmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Šifrování není aktivní", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Nastavení koncového šifrování", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} ukončil hovor", "@endedTheCall": { "type": "text", @@ -896,23 +706,11 @@ "senderName": {} } }, - "enterAGroupName": "Zadejte název skupiny", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Zadejte e-mailovou adresu", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Zadejte název prostoru", - "@enterASpacepName": {}, - "enterAUsername": "Zadejte uživatelské jméno", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Zadejte svůj domovský server", "@enterYourHomeserver": { "type": "text", @@ -940,11 +738,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Velikost souboru", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -960,16 +753,6 @@ "type": "text", "placeholders": {} }, - "friday": "Pátek", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Přátelé", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Od vstupu", "@fromJoining": { "type": "text", @@ -990,16 +773,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Popis skupiny", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Popis skupiny byl změněn", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Skupina je veřejná", "@groupIsPublic": { "type": "text", @@ -1050,11 +823,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Domácí server není kompatibilní", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Jak urážlivý je tento obsah?", "@howOffensiveIsThisContent": { "type": "text", @@ -1080,16 +848,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Můžete ignorovat uživatele, kteří vás znepokojují. Nebudete moci přijímat žádné zprávy nebo pozvánky od uživatelů na vašem osobním seznamu ignorovaných.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorovat uživatelské jméno", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Klikl jsem na odkaz", "@iHaveClickedOnLink": { "type": "text", @@ -1105,11 +863,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Neplatný e-mail", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Pozvat kontakt", "@inviteContact": { "type": "text", @@ -1127,7 +880,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} pozvali {targetName}", + "invitedUser": "📩 {username} pozval/a {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1145,7 +898,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainstalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte se anebo se přihlašte\n3. Otevřete odkaz na pozvánce: {link}", + "inviteText": "{username} vás pozvali na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se anebo se přihlašte.\n3. Otevřete pozvánku: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1153,17 +906,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Je následjící klíč zařízení správný?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "píše…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} se připojili k chatu", + "joinedTheChat": "👋 {username} se připojil/a k chatu", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1175,17 +923,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Klíče jsou uloženy v mezipaměti", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Chybí klíče", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} vyhodil {targetName}", + "kicked": "👞 {username} vyhodil/a {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1213,16 +951,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Naposledy viděná IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Viděn velmi dávno", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Opustit", "@leave": { "type": "text", @@ -1282,33 +1010,11 @@ "homeserver": {} } }, - "loginWith": "Přihlásit se pomocí {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Odhlásit", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Přidat práva moderátora", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Přidat práva administrátora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Ujistěte se, že je identifikátor validní", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Změny členů", "@memberChanges": { "type": "text", @@ -1324,28 +1030,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Zpráva bude odstraněna pro všechny účastníky", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderátor", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Pondělí", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count, plural, =1{1 další událost} other{{count} dalších událostí}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Ztlumit chat", "@muteChat": { "type": "text", @@ -1386,16 +1075,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychet momentálně nepodporuje aktivaci křížového podpisu. Prosím aktivujte si ho z prostředí Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Bez popisu", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Nebyly nalezeny žádné emotikony. 😕", "@noEmotesFound": { "type": "text", @@ -1406,7 +1085,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Zdá se, že v telefonu nemáte žádné služby Google. To je dobré rozhodnutí pro vaše soukromí! Chcete-li dostávat push oznámení ve FluffyChat, doporučujeme použít: https://microg.org/ nebo https://unifiedpush.org/.", + "noGoogleServicesWarning": "Zdá se, že služba Firebase Cloud Messaging není ve vašem zařízení k dispozici. Chcete-li i nadále přijímat push oznámení, doporučujeme nainstalovat ntfy. Pomocí ntfy nebo jiného poskytovatele Unified Push můžete přijímat oznámení push zabezpečeným způsobem přenosu dat. Aplikaci ntfy si můžete stáhnout z obchodu PlayStore nebo z webu F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1419,11 +1098,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Místo toho prosím zapněte online zálohování klíčů z prostředí Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Žádný", "@none": { "type": "text", @@ -1439,21 +1113,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Nebyly nalezeny žádné veřejné místnosti…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Nebyly nalezeny žádné místnosti…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Dosud nebyly nalezeny žádné stavy.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Oznámení", "@notifications": { "type": "text", @@ -1464,18 +1128,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Web není podporován", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} označených zpráv", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} uživatelé píší…", "@numUsersTyping": { "type": "text", @@ -1508,11 +1160,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Online záloha klíčů je vypnutá", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Online záloha kíčů je zapnuta", "@onlineKeyBackupEnabled": { "type": "text", @@ -1543,16 +1190,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Volitelné) Vaše e-mailová adresa", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Volitelné) Název skupiny", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Nebo", "@or": { "type": "text", @@ -1563,11 +1200,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Připojená zařízení uživatele", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "heslo nebo klíč pro obnovení", "@passphraseOrKey": { "type": "text", @@ -1625,11 +1257,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Zvolte si prosím uživatelské jméno", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Klikněte na odkaz v e-mailu a pokračujte.", "@pleaseClickOnLink": { "type": "text", @@ -1640,16 +1267,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Prosím zadejte identifikátor sítě Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Zadejte svůj bezpečnostní klíč:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Zadejte prosím své heslo", "@pleaseEnterYourPassword": { "type": "text", @@ -1675,26 +1292,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Veřejné skupiny", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Veřejný klíč", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Veřejné místnosti", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Veřejný prostor", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Pravidla push", "@pushRules": { "type": "text", @@ -1771,11 +1373,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Odstranit zprávu", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Odstraňte svého avatara", "@removeYourAvatar": { "type": "text", @@ -1806,16 +1403,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Vyžádat přečtení starších zpráv", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Zrušit všechna oprávnění", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Místnost byla upgradována", "@roomHasBeenUpgraded": { "type": "text", @@ -1826,53 +1413,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Sobota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Uložený soubor jako {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Uložit soubor", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Uložte soubor do této složky", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Hledat", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Vyhledat chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Bezpečnostní", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Bezpečnostní klíč", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ztratili jste bezpečnostní klíč?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Viděno uživatelem {username}", "@seenByUser": { "type": "text", @@ -1880,22 +1435,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Viděno uživatelem {username} a {count} dalšími}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Viděno uživateli {username} a {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Odeslat", "@send": { "type": "text", @@ -1915,11 +1454,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Povolte zasílání hlášení o chybách prostřednictvím sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Odeslat soubor", "@sendFile": { "type": "text", @@ -1992,21 +1526,6 @@ "senderName": {} } }, - "sentryInfo": "Informace o vašem soukromí: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sezení je ověřené", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Nastavit profilový obrázek", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Nastavit jako hlavní alias", "@setAsCanonicalAlias": { "type": "text", @@ -2017,11 +1536,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Nastavit popis skupiny", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Nastavit zvací odkaz", "@setInvitationLink": { "type": "text", @@ -2064,11 +1578,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Přihlásit se", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Jedinečné přihlášení", "@singlesignon": { "type": "text", @@ -2079,11 +1588,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Zvuk, vibrace LED barvy", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Zdrojové kódy", "@sourceCode": { "type": "text", @@ -2106,11 +1610,6 @@ "senderName": {} } }, - "startYourFirstChat": "Začněte svůj první chat hned teď! 🙂\n- Klepněte na 'Nový chat'\n- Naskenujte QR kód přítele\n- Bavte se chatováním", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Stav", "@status": { "type": "text", @@ -2126,11 +1625,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Neděle", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Synchronizace ... Čekejte prosím.", "@synchronizingPleaseWait": { "type": "text", @@ -2141,21 +1635,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Klepněte na zařízení pro jeho ověření", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Klepnutím zobrazíte obrázek", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Klepněte pro zobrazení menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Neshodují se", "@theyDontMatch": { "type": "text", @@ -2166,26 +1645,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Tato místnost byla archivována.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Čtvrtek", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2222,11 +1681,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Úterý", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Nedostupní", "@unavailable": { "type": "text", @@ -2262,16 +1716,6 @@ "type": {} } }, - "unknownSessionVerify": "Neznámé sezení, prosíme o ověření", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Odemknout zálohu chatu", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Zrušit ztlumení chatu", "@unmuteChat": { "type": "text", @@ -2289,18 +1733,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 nepřečtená zpráva} other{{unreadEvents} nepřečtených zpráv}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Použít barvy kompatibilní s AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} a {count} dalších píší…", "@userAndOthersAreTyping": { "type": "text", @@ -2336,11 +1768,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Uživatel není ověřen", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} poslali událost {type}", "@userSentUnknownEvent": { "type": "text", @@ -2349,36 +1776,16 @@ "type": {} } }, - "userUnknownVerification": "Stav ověření uživatele je neznámý", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Uživatel je ověřen", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Ověřeno", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sezení úspěšně ověřeno!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Ověřit", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Ověřit ručně", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Zahájit ověření", "@verifyStart": { "type": "text", @@ -2394,11 +1801,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Ověřit uživatele", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Video hovor", "@videoCall": { "type": "text", @@ -2439,7 +1841,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Pozadí", + "wallpaper": "Pozadí:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2449,21 +1851,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Koncové šifrování je momentálně ve verzi Beta! Používejte na vlastní nebezpečí!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Středa", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Vítejte v nejroztomilejší diskuzní aplikaci pro síť Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Zaslali jsme vám e-mail", "@weSentYouAnEmail": { "type": "text", @@ -2509,91 +1896,35 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Jste zváni do tohoto chatu", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Tohoto chatu se nadále neúčastníte", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Nemůžete pozvat sami sebe", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Byl vám zablokován přístup k tomuto chatu", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Vaše chaty se synchronizují…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Vaše vlastní uživatelské jméno", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Váš veřejný klíč", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Budete připojeni k {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Přiblížit", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Oddálit", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Chat byl z tohoto prostoru odstraněn", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Do tohoto prostoru byl přidán chat", "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Přidat do prostoru", "@addToSpace": {}, "scanQrCode": "Naskenujte QR kód", "@scanQrCode": {}, - "typeInInviteLinkManually": "Ručně zadejte odkaz na pozvánku ...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Sdílejte váš odkaz na pozvání", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Pokud nejste vedle sebe, stačí naskenovat QR kód nebo sdílet odkaz na pozvánku.", - "@createNewChatExplaination": {}, "sendOnEnter": "Odeslat při vstupu", "@sendOnEnter": {}, "homeserver": "Domácí server", "@homeserver": {}, "serverRequiresEmail": "Tento server potřebuje k registraci ověřit vaši e -mailovou adresu.", "@serverRequiresEmail": {}, - "newUsernameDescription": "Vaše ID uživatele pak bude mít formát @uživatelské jméno: název serveru", - "@newUsernameDescription": {}, - "newPasswordDescription": "Abyste mohli obnovit své heslo, měli byste ke svému účtu později přidat e -mailovou adresu.", - "@newPasswordDescription": {}, "addToBundle": "Přidat do balíčku", "@addToBundle": {}, - "setupChatBackup": "Nastavit zálohu chatu", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Níže jsem napsal klíč", - "@iWroteDownTheKey": {}, "addAccount": "Přidat účet", "@addAccount": {}, "bundleName": "Název balíčku", @@ -2602,10 +1933,6 @@ "@link": {}, "yourChatBackupHasBeenSetUp": "Vaše záloha chatu byla nastavena.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Abychom chránili vaše zprávy, vygenerovali jsme pro vás bezpečnostní klíč.\n Uchovejte ho na bezpečném místě, například ve správci hesel.", - "@setupChatBackupDescription": {}, - "yourUserId": "Vaše uživatelské ID:", - "@yourUserId": {}, "editBundlesForAccount": "Upravit balíčky pro tento účet", "@editBundlesForAccount": {}, "enableMultiAccounts": "(BETA) Na tomto zařízení povolte více účtů", @@ -2624,37 +1951,16 @@ "@messageType": {}, "sender": "Odesílatel", "@sender": {}, - "pleaseChooseAtLeastChars": "Vyberte prosím alespoň {min} znaků.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "passwordsDoNotMatch": "Hesla se neshodují!", - "@passwordsDoNotMatch": {}, "repeatPassword": "Zopakujte heslo", "@repeatPassword": {}, - "pleaseEnterValidEmail": "Prosím zadejte platnou emailovou adresu.", - "@pleaseEnterValidEmail": {}, "openGallery": "Otevřít galerii", "@openGallery": {}, "addToSpaceDescription": "Vyberte umístění, do kterého chcete tento chat přidat.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Přihlaste se jedním kliknutím", - "@loginWithOneClick": {}, "start": "Start", "@start": {}, - "removeFromSpaceDescription": "Tímto se chat odstraní z aktuálního místa. Poté bude stále viditelný v sekci \"Všechny chaty\".", - "@removeFromSpaceDescription": {}, "removeFromSpace": "Odstranit z tohoto místa", "@removeFromSpace": {}, - "setupChatBackupNow": "Nastavte si zálohu chatu hned teď", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Uložte bezpečnostní klíč nyní", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Chcete-li odemknout zálohu chatu, zadejte svůj bezpečnostní klíč, který byl vygenerován v předchozí relaci. Váš bezpečnostní klíč NENÍ vaše heslo.", - "@pleaseEnterSecurityKeyDescription": {}, "commandHint_clearcache": "Vymazat mezipamět", "@commandHint_clearcache": { "type": "text", @@ -2680,20 +1986,8 @@ "type": "text", "placeholders": {} }, - "addToStory": "Přidat do příběhu", - "@addToStory": {}, "publish": "Uveřejnit", "@publish": {}, - "whoCanSeeMyStories": "Kdo může vidět moje příběhy?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Odhlásit příběhy", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Tento uživatel zatím nic ve svém příběhu nezveřejnil", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Váš příběh", - "@yourStory": {}, - "replyHasBeenSent": "Odpověď byla odeslána", - "@replyHasBeenSent": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2701,43 +1995,14 @@ "size": {} } }, - "storyFrom": "Příběh z {date}:\n {body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Upozorňujeme, že lidé se ve vašem příběhu mohou navzájem vidět a kontaktovat.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Co se děje?", - "@whatIsGoingOn": {}, - "addDescription": "Přidat popis", - "@addDescription": {}, - "iUnderstand": "Rozumím", - "@iUnderstand": {}, "markAsRead": "Označit jako přečtené", "@markAsRead": {}, - "bubbleSize": "Velikost bubliny", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "reportUser": "Nahlásit uživatele", "@reportUser": {}, "openChat": "Otevřete chat", "@openChat": {}, - "storyPrivacyWarning": "Upozorňujeme, že lidé se ve vašem příběhu mohou navzájem vidět a kontaktovat. Vaše příběhy budou viditelné po dobu 24 hodin, ale není zaručeno, že budou smazány ze všech zařízení a serverů.", - "@storyPrivacyWarning": {}, "dismiss": "Zavrhnout", "@dismiss": {}, - "matrixWidgets": "Matrix widgety", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Úpravy widgetů a integrace nejsou zatím možné.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Upravte widgety a integrace", - "@editIntegrations": {}, "reactedWith": "{sender} reagoval s {reaction}", "@reactedWith": { "type": "text", @@ -2762,8 +2027,6 @@ "@experimentalVideoCalls": {}, "unsupportedAndroidVersionLong": "Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.", "@unsupportedAndroidVersionLong": {}, - "pinnedEventsError": "Při načítání připnutých zpráv došlo k chybě", - "@pinnedEventsError": {}, "pinMessage": "Připnout zprávu do místnosti", "@pinMessage": {}, "confirmEventUnpin": "Opravdu chcete událost trvale odepnout?", @@ -2792,8 +2055,6 @@ "@widgetJitsi": {}, "youAcceptedTheInvitation": "Přijal jsi pozvání", "@youAcceptedTheInvitation": {}, - "showSpaces": "Zobrazit seznam prostorů", - "@showSpaces": {}, "youJoinedTheChat": "Připojili jste se k chatu", "@youJoinedTheChat": {}, "youInvitedBy": "Byli jste pozváni uživatelem {user}", @@ -2804,8 +2065,6 @@ }, "nextAccount": "Další účet", "@nextAccount": {}, - "editWidgets": "Upravit widgety", - "@editWidgets": {}, "addWidget": "Přidat widget", "@addWidget": {}, "widgetVideo": "Video", @@ -2838,11 +2097,6 @@ "user": {} } }, - "showDirectChatsInSpaces": "Zobrazit související přímé chaty ve službě Spaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "widgetCustom": "Vlastní", "@widgetCustom": {}, "youRejectedTheInvitation": "Odmítli jste pozvání", @@ -2859,6 +2113,329 @@ "@widgetNameError": {}, "errorAddingWidget": "Chyba při přidávání widgetu.", "@errorAddingWidget": {}, - "noEmailWarning": "Prosím zadejte platnou emailovou adresu. V opačném případě nebudete moci obnovit heslo. Pokud nechcete, pokračujte dalším klepnutím na tlačítko.", - "@noEmailWarning": {} + "disableEncryptionWarning": "Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.", + "@disableEncryptionWarning": {}, + "confirmMatrixId": "Prosím, potvrďte vaše Matrix ID, abyste mohli smazat váš účet.", + "@confirmMatrixId": {}, + "commandHint_googly": "Poslat kroutící se očička", + "@commandHint_googly": {}, + "commandHint_cuddle": "Poslat mazlení", + "@commandHint_cuddle": {}, + "commandHint_hug": "Poslat obejmutí", + "@commandHint_hug": {}, + "hugContent": "{senderName} vás objímá", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "googlyEyesContent": "{senderName} vám posílá kroutící se očička", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} se s vámi mazlí", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "notAnImage": "Není obrázek.", + "@notAnImage": {}, + "importNow": "Importovat nyní", + "@importNow": {}, + "redactedByBecause": "Smazáno uživatelem {username} s důvodem: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "storeInAndroidKeystore": "Uložit v Android KeyStore", + "@storeInAndroidKeystore": {}, + "dehydrateTorLong": "Uživatelům TOR se doporučuje exportovat sezení před zavřením okna.", + "@dehydrateTorLong": {}, + "numChats": "{number} konverzací", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "dehydrate": "Exportovat sezení a promazat zařízení", + "@dehydrate": {}, + "newGroup": "Nová skupina", + "@newGroup": {}, + "hydrateTor": "TOR uživatelé: Import exportovaného sezení", + "@hydrateTor": {}, + "doNotShowAgain": "Nezobrazovat znovu", + "@doNotShowAgain": {}, + "commandHint_markasdm": "Označit jako místnost přímé konverzace s daným Matrix ID", + "@commandHint_markasdm": {}, + "recoveryKey": "Klíč k obnovení", + "@recoveryKey": {}, + "hydrateTorLong": "Exportovali jste vaše poslední sezení na TOR? Rychle jej importujte a pokračujte v konverzaci.", + "@hydrateTorLong": {}, + "hydrate": "Obnovit ze záložního souboru", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Prosím vložte váš klíč pro obnovení:", + "@pleaseEnterRecoveryKey": {}, + "createGroup": "Vytvořit skupinu", + "@createGroup": {}, + "shareInviteLink": "Sdílet pozvánku", + "@shareInviteLink": {}, + "pleaseEnterRecoveryKeyDescription": "K odemknutí vašich starých zpráv prosím vložte váš klíč k obnovení vygenerovaný v předchozím sezení. Váš klíč k obnovení NENÍ vaše heslo.", + "@pleaseEnterRecoveryKeyDescription": {}, + "setColorTheme": "Nastavit barvy:", + "@setColorTheme": {}, + "importEmojis": "Importovat Emoji", + "@importEmojis": {}, + "importFromZipFile": "Importovat ze .zip souboru", + "@importFromZipFile": {}, + "exportEmotePack": "Exportovat Emoji jako .zip", + "@exportEmotePack": {}, + "replace": "Nahradit", + "@replace": {}, + "users": "Uživatelé", + "@users": {}, + "storeInAppleKeyChain": "Uložit v Apple KeyChain", + "@storeInAppleKeyChain": {}, + "jumpToLastReadMessage": "Skočit na naposledy přečtenou zprávu", + "@jumpToLastReadMessage": {}, + "signInWithPassword": "Přihlásit se pomocí hesla", + "@signInWithPassword": {}, + "redactedBy": "Smazáno uživatelem {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "inviteContactToGroupQuestion": "Chcete pozvat {contact} do konverzace \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "dehydrateTor": "TOR uživatelé: Export sezení", + "@dehydrateTor": {}, + "tryAgain": "Zkuste to znovu", + "@tryAgain": {}, + "redactMessageDescription": "Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(Nepovinné) Důvod smazání této zprávy…", + "@optionalRedactReason": {}, + "messagesStyle": "Zprávy:", + "@messagesStyle": {}, + "allSpaces": "Všechny prostory", + "@allSpaces": {}, + "noOtherDevicesFound": "Žádná ostatní zařízení nebyla nalezena", + "@noOtherDevicesFound": {}, + "addChatDescription": "Přidejte popis konverzace", + "@addChatDescription": {}, + "chatDescription": "Popis konverzace", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Popis konverzace byl změněn", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Zatím nebyl vytvořen žádný popis konverzace.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Neplatné jméno serveru", + "@invalidServerName": {}, + "chatPermissions": "Oprávnění konverzace", + "@chatPermissions": {}, + "directChat": "Přímá konverzace", + "@directChat": {}, + "setChatDescription": "Nastavit popis konverzace", + "@setChatDescription": {}, + "startFirstChat": "Začněte svou první konverzaci", + "@startFirstChat": {}, + "callingPermissions": "Oprávnění volání", + "@callingPermissions": {}, + "whyIsThisMessageEncrypted": "Proč nelze přečíst tuto zprávu?", + "@whyIsThisMessageEncrypted": {}, + "wasDirectChatDisplayName": "Prázdná konverzace (dříve {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "newSpaceDescription": "Prostory umožňují organizovat vaše konverzace a vytvářet soukromé nebo veřejné komunity", + "@newSpaceDescription": {}, + "profileNotFound": "Uživatel nebyl na serveru nalezen. Možná je problém s připojením nebo uživatel neexistuje.", + "@profileNotFound": {}, + "setTheme": "Nastavit vzhled:", + "@setTheme": {}, + "sendTypingNotifications": "Posílat oznámení o psaní", + "@sendTypingNotifications": {}, + "commandHint_markasgroup": "Označit jako skupinu", + "@commandHint_markasgroup": {}, + "allRooms": "Všechny skupinové konverzace", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "recoveryKeyLost": "Ztracený klíč k obnovení?", + "@recoveryKeyLost": {}, + "unlockOldMessages": "Odemknout staré zprávy", + "@unlockOldMessages": {}, + "foregroundServiceRunning": "Toto oznámení se zobrazuje když běží služba na pozadí.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "Sdílíte svou obrazovku přes FluffyChat", + "@screenSharingDetail": {}, + "callingAccountDetails": "Opravňuje FluffyChat používat Android systémovou aplikaci pro vytáčení.", + "@callingAccountDetails": {}, + "appearOnTop": "Zobrazovat nahoře", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofon, kamera a ostatní oprávnění FluffyChat", + "@otherCallingPermissions": {}, + "encryptThisChat": "Zašifrovat tuto konverzaci", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "Omlouváme se… to není možné", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Klíče zařízení:", + "@deviceKeys": {}, + "reopenChat": "Znovu otevřít konverzaci", + "@reopenChat": {}, + "fileIsTooBigForServer": "Server oznamuje že soubor je příliš velký na odeslání.", + "@fileIsTooBigForServer": {}, + "jump": "Skočit", + "@jump": {}, + "openLinkInBrowser": "Otevřít odkaz v prohlížeči", + "@openLinkInBrowser": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Prosím zkuste to znovu nebo si vyberte jiný server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Přihlásit se pomocí {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "supposedMxid": "Tady by mělo být {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "newSpace": "Nový prostor", + "@newSpace": {}, + "screenSharingTitle": "sdílení obrazovky", + "@screenSharingTitle": {}, + "user": "Uživatel", + "@user": {}, + "fileHasBeenSavedAt": "Soubor uložen do {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "custom": "Vlastní", + "@custom": {}, + "dehydrateWarning": "Tuto akci nelze vzít zpět. Ujistěte se že záložní soubor máte bezpečně uložen.", + "@dehydrateWarning": {}, + "storeInSecureStorageDescription": "Klíč k obnovení uložte v zabezpečeném úložišti tohoto zařízení.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Uložte tento klíč manuálně pomocí systémového dialogu sdílení nebo zkopírováním do schránky.", + "@saveKeyManuallyDescription": {}, + "storeSecurlyOnThisDevice": "Uložit bezpečně na tomto zařízení", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} souborů", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "emoteKeyboardNoRecents": "Naposledy použité emoce se zobrazí zde...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "appLockDescription": "Zamknout aplikaci pomocí PIN kódu když není používána", + "@appLockDescription": {}, + "globalChatId": "Globální ID chatu", + "@globalChatId": {}, + "accessAndVisibility": "Přístup a viditelnost", + "@accessAndVisibility": {}, + "calls": "Volání", + "@calls": {}, + "customEmojisAndStickers": "Vlastní emoji a nálepky", + "@customEmojisAndStickers": {}, + "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emoji nebo nálepky, které mohou být použité v konverzaci.", + "@customEmojisAndStickersBody": {}, + "swipeRightToLeftToReply": "Potáhněte z prava do leva pro odpověď", + "@swipeRightToLeftToReply": {}, + "countChatsAndCountParticipants": "{chats} konverzaci a {participants} účastníci", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Žádné další konverzace nalezeny...", + "@noMoreChatsFound": {}, + "hideRedactedMessages": "Skrýt upravené zprávy", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Skrytí nesprávných nebo neznámých formátů zpráv", + "@hideInvalidOrUnknownMessageFormats": {}, + "blockUsername": "Ignorovat uživatelské jméno", + "@blockUsername": {}, + "hideMemberChangesInPublicChats": "Skrýt změny členů ve veřejných chatech", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Nezobrazovat na časové ose chatu, pokud se někdo připojí nebo opustí veřejný chat, aby se zlepšila čitelnost.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Přehled", + "@overview": {}, + "notifyMeFor": "Upozorněte mě na", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Nastavení obnovení hesla", + "@passwordRecoverySettings": {}, + "presenceStyle": "Dostupnost:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "block": "Blokovat", + "@block": {}, + "indexedDbErrorLong": "Ukládání zpráv bohužel není ve výchozím nastavení v soukromém režimu povoleno.\nNavštivte prosím\n - about:config\n - nastavte dom.indexedDB.privateBrowsing.enabled na true\nV opačném případě nebude možné FluffyChat spustit.", + "@indexedDbErrorLong": {}, + "youInvitedToBy": "📩 Prostřednictvím odkazu jste byli pozváni na:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "indexedDbErrorTitle": "Problémy privátního prostředí", + "@indexedDbErrorTitle": {}, + "blockListDescription": "Můžete blokovat uživatele, kteří vás obtěžují. Od uživatelů na vašem osobním seznamu blokovaných uživatelů nebudete moci přijímat žádné zprávy ani pozvánky do místnosti.", + "@blockListDescription": {}, + "blockedUsers": "Zablokování uživatelé", + "@blockedUsers": {}, + "alwaysUse24HourFormat": "Vypnuto", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noChatsFoundHere": "Nejsou zde žádné chaty. Začněte nový chat s někým, použitím níže uvedeného tlačítka. ⤵️", + "@noChatsFoundHere": {}, + "joinedChats": "Připojené chaty", + "@joinedChats": {}, + "unread": "Nepřečtené", + "@unread": {}, + "space": "Prostor", + "@space": {}, + "spaces": "Prostory", + "@spaces": {}, + "presencesToggle": "Zobrazení stavových zpráv od jiných uživatelů", + "@presencesToggle": { + "type": "text", + "placeholders": {} + } } diff --git a/assets/l10n/intl_de.arb b/assets/l10n/intl_de.arb index 0313abe0a5..2566c6c8e6 100644 --- a/assets/l10n/intl_de.arb +++ b/assets/l10n/intl_de.arb @@ -1,6 +1,10 @@ { "@@locale": "de", "@@last_modified": "2021-08-14 12:41:10.119255", + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, "about": "Über", "@about": { "type": "text", @@ -11,7 +15,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} hat die Einladung angenommen", + "acceptedTheInvitation": "👍 {username} hat die Einladung angenommen", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +27,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Kontoinformationen", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} hat Ende-zu-Ende Verschlüsselung aktiviert", + "activatedEndToEndEncryption": "🔐 {username} hat Ende-zu-Ende Verschlüsselung aktiviert", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +39,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Eine Beschreibung für die Gruppe hinzufügen", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Neuen Freund hinzufügen", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Admin", "@admin": { "type": "text", @@ -70,11 +59,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Hast du schon ein Konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} hat den Anruf angenommen", "@answeredTheCall": { "type": "text", @@ -97,11 +81,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Archivierter Raum", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Dürfen Gäste beitreten", "@areGuestsAllowedToJoin": { "type": "text", @@ -117,21 +96,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Bitte gib dein Secure-Store Passwort oder Wiederherstellungsschlüssel ein, um die Keys zu cachen.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Bitte gib, um die andere Person signieren zu können, dein Sicherheitsschlüssel oder Wiederherstellungsschlüssel ein.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Bitte gib, um deine Session zu verifizieren, dein Secure-Store-Passwort oder Wiederherstellungsschlüssel ein.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Diese Bestätigungsanfrage von {username} annehmen?", "@askVerificationRequest": { "type": "text", @@ -139,26 +108,6 @@ "username": {} } }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Abspielen", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authentifizierung", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar wurde geändert", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Der Homeserver unterstützt diese Anmelde-Typen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -208,11 +157,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Schlüssel zwischengespeichert", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Abbrechen", "@cancel": { "type": "text", @@ -334,21 +278,11 @@ "username": {} } }, - "changelog": "Protokoll der Änderungen", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Passwort ändern", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Änderungen wurden gespeichert", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Anderen Homeserver verwenden", "@changeTheHomeserver": { "type": "text", @@ -364,16 +298,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Ändere den Server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Hintergrund ändern", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Deinen Avatar ändern", "@changeYourAvatar": { "type": "text", @@ -394,12 +318,12 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "Dein Chat-Backup ist mit einem Sicherheitsschlüssel gesichert. Bitte stelle sicher, dass du diesen nicht verlierst.", + "chatBackupDescription": "Deine alten Nachrichten sind mit einem Wiederherstellungsschlüssel gesichert. Bitte stellen sicher, dass du ihn nicht verlierst.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "chatDetails": "Gruppeninfo", + "chatDetails": "Chatdetails", "@chatDetails": { "type": "text", "placeholders": {} @@ -414,24 +338,14 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Wähle einen Benutzernamen", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Archiv leeren", "@clearArchive": {}, - "clearText": "Text löschen", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Schließen", "@close": { "type": "text", "placeholders": {} }, - "commandHint_ban": "Verbanne den übergebenen Benutzer aus diesen Raum", + "commandHint_ban": "Banne ausgewählten Benutzer aus diesen Raum", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -446,7 +360,7 @@ "type": "text", "description": "Usage hint for the command /invite" }, - "commandHint_join": "Betrete den übergebenen Raum", + "commandHint_join": "Betritt den ausgewählten Raum", "@commandHint_join": { "type": "text", "description": "Usage hint for the command /join" @@ -513,12 +427,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Vergleiche und stelle sicher, dass die folgenden Emoji mit denen des anderen Gerätes übereinstimmen:", + "compareEmojiMatch": "Bitte vergleiche die Emojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Vergleiche und stelle sicher, dass die folgenden Zahlen mit denen des anderen Gerätes übereinstimmen:", + "compareNumbersMatch": "Bitte vergleiche die Zahlen", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -538,11 +452,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Verbindungsversuch fehlgeschlagen", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt wurde in die Gruppe eingeladen", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -563,11 +472,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Content Viewer", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Wurde in die Zwischenablage kopiert", "@copiedToClipboard": { "type": "text", @@ -590,16 +494,6 @@ "error": {} } }, - "couldNotSetAvatar": "Profilbild konnte nicht gesetzt werden", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Anzeigename konnte nicht gesetzt werden", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} Mitglieder", "@countParticipants": { "type": "text", @@ -612,38 +506,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Konto jetzt erstellen", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} hat den Chat erstellt", + "createdTheChat": "💬 {username} hat den Chat erstellt", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Neue Gruppe", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Neuer Space", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Cross-Signing ist deaktiviert", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Cross-Signing ist aktiviert", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Jetzt gerade online", "@currentlyActive": { "type": "text", @@ -684,7 +558,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Standardberechtigungsstufe", + "defaultPermissionLevel": "Standardberechtigungsstufe für neue Benutzer", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -704,11 +578,6 @@ "type": "text", "placeholders": {} }, - "deny": "Ablehnen", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Gerät", "@device": { "type": "text", @@ -724,46 +593,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Die Verschlüsselung ist erst sicher, wenn alle Geräte verifiziert sind.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Direkte Chats", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Bild verwerfen", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Entdecken", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Gruppen entdecken", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Anzeigename wurde geändert", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Spenden", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Abbrechen und nicht erneut fragen", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Datei herunterladen", "@downloadFile": { "type": "text", @@ -779,21 +618,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Chatberechtigungen bearbeiten", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Anzeigename ändern", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Jitsi-Instanz ändern", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Raum-Aliase bearbeiten", "@editRoomAliases": { "type": "text", @@ -839,11 +668,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Aktiviere das Chat-Backup, um niemals den Zugang zu deinen Nachrichten zu verlieren.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Aktiviere Emoticon-Bündel global", "@enableEmotesGlobally": { "type": "text", @@ -869,21 +693,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Verschlüsselungsalgorithmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Verschlüsselung ist nicht aktiviert", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Ende-zu-Ende-Verschlüsselung", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} hat den Anruf beendet", "@endedTheCall": { "type": "text", @@ -891,23 +705,11 @@ "senderName": {} } }, - "enterAGroupName": "Gib einen Gruppennamen ein", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Gib eine E-Mail-Adresse ein", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Namen für den Space eingeben", - "@enterASpacepName": {}, - "enterAUsername": "Gib einen Benutzernamen ein", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Gib Deinen Homeserver ein", "@enterYourHomeserver": { "type": "text", @@ -935,11 +737,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Dateigröße", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -955,16 +752,6 @@ "type": "text", "placeholders": {} }, - "friday": "Freitag", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Freunde", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Ab dem Beitritt", "@fromJoining": { "type": "text", @@ -985,16 +772,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Gruppenbeschreibung", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Gruppenbeschreibung wurde geändert", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Öffentliche Gruppe", "@groupIsPublic": { "type": "text", @@ -1045,11 +822,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Homeserver ist nicht kompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Wie beleidigend ist dieser Inhalt?", "@howOffensiveIsThisContent": { "type": "text", @@ -1075,16 +847,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Du kannst störende Personen ignorieren. Du bist dann nicht mehr in der Lage, Nachrichten oder Raumeinladungen von diesen zu erhalten.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignoriere Benutzername", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Ich habe den Link angeklickt", "@iHaveClickedOnLink": { "type": "text", @@ -1100,11 +862,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Ungültige E-Mail", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Kontakt einladen", "@inviteContact": { "type": "text", @@ -1122,7 +879,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} hat {targetName} eingeladen", + "invitedUser": "📩 {username} hat {targetName} eingeladen", "@invitedUser": { "type": "text", "placeholders": { @@ -1140,7 +897,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} hat Dich zu FluffyChat eingeladen. \n1. Installiere FluffyChat: https://fluffychat.im \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: {link}", + "inviteText": "{username} hat Dich zu FluffyChat eingeladen. \n1. Gehe auf fluffychat.im und installiere die App \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1148,17 +905,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Ist der folgende Geräteschlüssel korrekt?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "schreibt …", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} ist dem Chat beigetreten", + "joinedTheChat": "👋 {username} ist dem Chat beigetreten", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1170,17 +922,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Keys sind gecached", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Keys fehlen", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} hat {targetName} hinausgeworfen", + "kicked": "👞 {username} hat {targetName} hinausgeworfen", "@kicked": { "type": "text", "placeholders": { @@ -1188,7 +930,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} hat {targetName} hinausgeworfen und verbannt", + "kickedAndBanned": "🙅 {username} hat {targetName} hinausgeworfen und verbannt", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1208,16 +950,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Letzte bekannte IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vor sehr langer Zeit gesehen", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Verlassen", "@leave": { "type": "text", @@ -1277,33 +1009,11 @@ "homeserver": {} } }, - "loginWith": "Anmelden mit", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Abmelden", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Zum Moderator ernennen", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Zum Admin ernennen", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Gib bitte einen richtigen Benutzernamen ein", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Änderungen der Mitglieder", "@memberChanges": { "type": "text", @@ -1319,28 +1029,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Nachricht wird für alle Mitglieder entfernt", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Montag", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 weiteres Ereignis} other{{count} weitere Ereignisse}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Stummschalten", "@muteChat": { "type": "text", @@ -1356,7 +1049,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Neue Nachricht in FluffyChat", + "newMessageInFluffyChat": "💬 Neue Nachricht in FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1381,16 +1074,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat kann Cross-Signing noch nicht einschalten. Bitte schalte es innerhalb von Element an.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Keine Beschreibung", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Keine Emoticons gefunden. 😕", "@noEmotesFound": { "type": "text", @@ -1401,16 +1084,11 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Es sieht so aus, als hättest du keine Google-Dienste auf deinem Gerät. Das ist eine gute Entscheidung für deine Privatsphäre! Um Push-Benachrichtigungen in FluffyChat zu erhalten, empfehlen wir die Verwendung von microG https://microg.org/ oder Unified Push https://unifiedpush.org/.", + "noGoogleServicesWarning": "Firebase Cloud Messaging scheint auf deinem Gerät nicht verfügbar zu sein. Um trotzdem Push-Benachrichtigungen zu erhalten, empfehlen wir die Installation von ntfy. Mit ntfy oder einem anderen Unified-Push-Anbieter kannst du Push-Benachrichtigungen datensicher empfangen. Du kannst ntfy im PlayStore oder bei F-Droid herunterladen.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "FluffyChat kann die Online-Schlüsselsicherung noch nicht aktivieren. Bitte schalte es innerhalb von Element an.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Keiner", "@none": { "type": "text", @@ -1426,21 +1104,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Keine öffentlichen Räume gefunden …", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Keine Räume gefunden …", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Keine Einträge gefunden.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Benachrichtigungen", "@notifications": { "type": "text", @@ -1451,18 +1119,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Wird in der Web-Version nicht unterstützt", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} ausgewählt", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} Mitglieder schreiben …", "@numUsersTyping": { "type": "text", @@ -1495,11 +1151,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Online-Schlüsselsicherung ist deaktiviert", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Online-Schlüsselsicherung ist aktiviert", "@onlineKeyBackupEnabled": { "type": "text", @@ -1510,7 +1161,7 @@ "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "Hoppla! Etwas ist schief gelaufen…", + "oopsSomethingWentWrong": "Hoppla, da ist etwas schiefgelaufen…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1530,31 +1181,16 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Optional) Ihre E-Mail-Adresse", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optional) Name für die Gruppe", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Oder", "@or": { "type": "text", "placeholders": {} }, - "participant": "Mitglieder", + "participant": "Mitglied", "@participant": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "Teilnehmende Geräte", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "Passwort oder Wiederherstellungsschlüssel", "@passphraseOrKey": { "type": "text", @@ -1612,11 +1248,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Bitte wähle einen Benutzernamen", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Bitte auf den Link in der E-Mail klicken und dann fortfahren.", "@pleaseClickOnLink": { "type": "text", @@ -1627,16 +1258,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Bitte eine Matrix-ID eingeben.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Bitte Sicherheitsschlüssel eingeben:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Bitte dein Passwort eingeben", "@pleaseEnterYourPassword": { "type": "text", @@ -1662,26 +1283,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Öffentliche Gruppen", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Öffentlicher Schlüssel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Öffentliche Räume", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Öffentlicher Space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Push-Regeln", "@pushRules": { "type": "text", @@ -1697,7 +1303,7 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username} hat ein Ereignis entfernt", + "redactedAnEvent": "{username} hat ein Ereignis gelöscht", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -1758,11 +1364,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Nachricht entfernen", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Deinen Avatar löschen", "@removeYourAvatar": { "type": "text", @@ -1793,16 +1394,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Anfrage um ältere Nachrichten zu lesen", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Alle Berechtigungen zurücknehmen", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Der Raum wurde ge-upgraded", "@roomHasBeenUpgraded": { "type": "text", @@ -1813,35 +1404,13 @@ "type": "text", "placeholders": {} }, - "saturday": "Samstag", - "@saturday": { + "saveFile": "Datei speichern", + "@saveFile": { "type": "text", "placeholders": {} }, - "savedFileAs": "Datei gespeichert als {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Datei speichern", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Datei in diesem Ordner speichern", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Suchen", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Chat suchen", - "@searchForAChat": { + "search": "Suchen", + "@search": { "type": "text", "placeholders": {} }, @@ -1850,16 +1419,6 @@ "type": "text", "placeholders": {} }, - "securityKey": "Sicherheitsschlüssel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Sicherheitsschlüssel verloren?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Gelesen von {username}", "@seenByUser": { "type": "text", @@ -1867,22 +1426,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Gelesen von {username} und {count} anderen}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Gelesen von {username} und {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Senden", "@send": { "type": "text", @@ -1902,11 +1445,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Erlaube das Senden von Fehlermeldungen via sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Datei senden", "@sendFile": { "type": "text", @@ -1937,35 +1475,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} hat eine Datei gesendet", + "sentAFile": "📁 {username} hat eine Datei gesendet", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} hat eine Audio-Datei gesendet", + "sentAnAudio": "🎤 {username} hat eine Audio-Datei gesendet", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} hat ein Bild gesendet", + "sentAPicture": "🖼️ {username} hat ein Bild gesendet", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} hat einen Sticker gesendet", + "sentASticker": "😊 {username} hat einen Sticker gesendet", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} hat ein Video gesendet", + "sentAVideo": "🎥 {username} hat ein Video gesendet", "@sentAVideo": { "type": "text", "placeholders": { @@ -1979,21 +1517,6 @@ "senderName": {} } }, - "sentryInfo": "Information über deine Privatsphäre: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sitzung ist verifiziert", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Ein Profilbild festlegen", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Als Haupt-Alias festlegen", "@setAsCanonicalAlias": { "type": "text", @@ -2004,11 +1527,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Gruppenbeschreibung festlegen", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Einladungslink festlegen", "@setInvitationLink": { "type": "text", @@ -2051,11 +1569,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Registrieren", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Einmalige Anmeldung", "@singlesignon": { "type": "text", @@ -2066,11 +1579,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Ton, Vibration, LED-Farbe", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Quellcode", "@sourceCode": { "type": "text", @@ -2093,11 +1601,6 @@ "senderName": {} } }, - "startYourFirstChat": "Starte jetzt deinen ersten Chat! 🙂\n- Tippe auf Nachrichten-Button\n- Gib einen Benutzernamen ein\n- Viel Spaß beim Chatten", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Status", "@status": { "type": "text", @@ -2113,11 +1616,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Sonntag", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Synchronisiere... Bitte warten.", "@synchronizingPleaseWait": { "type": "text", @@ -2128,21 +1626,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Auf Gerät tippen zum Verifizieren", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Antippen, um das Bild anzuzeigen", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tippen, um das Menü anzuzeigen", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Stimmen nicht überein", "@theyDontMatch": { "type": "text", @@ -2153,26 +1636,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Dieser Raum wurde archiviert.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Donnerstag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2204,16 +1667,11 @@ "type": "text", "placeholders": {} }, - "tryToSendAgain": "Nochmal versuchen zu senden", + "tryToSendAgain": "Noch mal versuchen zu senden", "@tryToSendAgain": { "type": "text", "placeholders": {} }, - "tuesday": "Dienstag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Nicht verfügbar", "@unavailable": { "type": "text", @@ -2242,29 +1700,19 @@ "type": "text", "placeholders": {} }, - "unknownEvent": "Unbekanntes Ereignis „{type}“", + "unknownEvent": "Unbekanntes Ereignis '{type}'", "@unknownEvent": { "type": "text", "placeholders": { "type": {} } }, - "unknownSessionVerify": "Unbekannte Sitzung, bitte verifiziere diese", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Chat-Backup entsperren", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Stumm aus", "@unmuteChat": { "type": "text", "placeholders": {} }, - "unpin": "Abpinnen", + "unpin": "Nicht mehr anpinnen", "@unpin": { "type": "text", "placeholders": {} @@ -2276,18 +1724,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 ungelesene Nachricht} other{{unreadEvents} ungelesene Nachrichten}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED-optimierte Farben verwenden?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} und {count} andere schreiben …", "@userAndOthersAreTyping": { "type": "text", @@ -2311,7 +1747,7 @@ "username": {} } }, - "userLeftTheChat": "{username} hat den Chat verlassen", + "userLeftTheChat": "🚪 {username} hat den Chat verlassen", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2323,11 +1759,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Mitglied ist nicht verifiziert", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} hat ein {type}-Ereignis gesendet", "@userSentUnknownEvent": { "type": "text", @@ -2336,36 +1767,16 @@ "type": {} } }, - "userUnknownVerification": "Mitglied hat einen unbekannten Verifikationsstatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Mitglied ist verifiziert", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Verifiziert", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sitzung erfolgreich verifiziert!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Bestätigen", + "verify": "Verifizieren", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verifiziere manuell", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Starte Verifikation", "@verifyStart": { "type": "text", @@ -2381,11 +1792,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifiziere Mitglied", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videoanruf", "@videoCall": { "type": "text", @@ -2426,7 +1832,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Hintergrund", + "wallpaper": "Hintergrund:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2436,21 +1842,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Ende-zu-Ende-Verschlüsselung ist im Beta-Status. Benutzung auf eigene Gefahr!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Mittwoch", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Herzlich willkommen beim knuffigsten Instant-Messenger im Matrix-Netzwerk.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Wir haben dir eine E-Mail gesendet", "@weSentYouAnEmail": { "type": "text", @@ -2471,7 +1862,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Chat-Backup löschen, um neuen Sicherheitsschlüssel zu erstellen?", + "wipeChatBackup": "Den Chat-Backup löschen, um einen neuen Wiederherstellungsschlüssel zu erstellen?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2496,58 +1887,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Du wurdest in diesen Chat eingeladen", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Du bist kein Mitglied mehr in diesem Chat", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Du kannst dich nicht selbst einladen", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Du wurdest aus dem Chat verbannt", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Deine Chats werden synchronisiert …", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Dein eigener Benutzername", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Dein öffentlicher Schlüssel", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Du wirst mit {homeserver} verbunden", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Vergrößern", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Verkleinern", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "noMatrixServer": "{server1} ist kein Matrix-Server, stattdessen {server2} benutzen?", "@noMatrixServer": { "type": "text", @@ -2558,17 +1912,6 @@ }, "scanQrCode": "QR-Code scannen", "@scanQrCode": {}, - "typeInInviteLinkManually": "Einladungslink manuell eingeben ...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Teile deinen Einladungslink", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Einfach den QR-Code scannen oder teile deinen Einladungslink, falls ihr nicht nebeneinander steht.", - "@createNewChatExplaination": {}, - "chatHasBeenRemovedFromThisSpace": "Chat wurde aus dem Weltraum entfernt", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Chat wurde zum Space hinzugefügt", "@chatHasBeenAddedToThisSpace": {}, "autoplayImages": "Animierte Sticker und Emotes automatisch abspielen", @@ -2594,28 +1937,16 @@ "@addAccount": {}, "oneClientLoggedOut": "Einer deiner Clients wurde abgemeldet", "@oneClientLoggedOut": {}, - "newUsernameDescription": "Deine User-ID wird das Format @username:servername haben", - "@newUsernameDescription": {}, - "newPasswordDescription": "Um dein Passwort wiederherstellen zu können, füge später bitte eine E-Mail-Adresse zu deinem Konto hinzu.", - "@newPasswordDescription": {}, "homeserver": "Homeserver", "@homeserver": {}, "sendOnEnter": "Senden mit Enter", "@sendOnEnter": {}, "link": "Link", "@link": {}, - "setupChatBackup": "Chat-Backup einrichten", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Ich habe den Schlüssel aufgeschrieben", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Dein Chat-Backup wurde eingerichtet.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Um deine Nachrichten zu schützen, haben wir einen Sicherheitsschlüssel für dich generiert.\nBewahre ihn bitte an einem sicheren Ort auf, wie zum Beispiel einem Passwort-Manager.", - "@setupChatBackupDescription": {}, "unverified": "Unverifiziert", "@unverified": {}, - "yourUserId": "Deine Benutzer-ID:", - "@yourUserId": {}, "messageInfo": "Nachrichten-Info", "@messageInfo": {}, "time": "Zeit", @@ -2628,34 +1959,13 @@ "@openGallery": {}, "removeFromSpace": "Aus dem Space entfernen", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Dadurch wird dieser Chat aus dem aktuellen Space entfernt. Er ist dann weiterhin unter \"Alle Chats\" sichtbar.", - "@removeFromSpaceDescription": {}, "addToSpaceDescription": "Wähle einen Space aus, um diesen Chat hinzuzufügen.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Anmelden mit einem Klick", - "@loginWithOneClick": {}, "start": "Start", "@start": {}, - "setupChatBackupNow": "Richte jetzt ein Chat-Backup ein", - "@setupChatBackupNow": {}, - "passwordsDoNotMatch": "Passwörter stimmen nicht überein!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Bitte gib eine gültige E-Mail-Adresse ein.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Passwort wiederholen", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Bitte wähle mindestens {min} Zeichen.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "pleaseEnterSecurityKeyDescription": "Um deinen Chat-Backup zu entsperren, gib bitte deinen Sicherheitsschlüssel ein, der in einer früheren Sitzung generiert wurde. Der Sicherheitsschlüssel ist NICHT dein Passwort.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Jetzt Sicherheitsschlüssel speichern", - "@saveTheSecurityKeyNow": {}, - "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption um die Verschlüsselung auszuschalten", + "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2670,23 +1980,11 @@ "type": "text", "description": "Usage hint for the command /clearcache" }, - "commandHint_create": "Erstelle ein leeren Gruppenchat\nBenutze --no-encryption um die Verschlüsselung auszuschalten", + "commandHint_create": "Erstelle ein leeren Gruppenchat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" }, - "yourStory": "Deine Story", - "@yourStory": {}, - "replyHasBeenSent": "Antwort wurde gesendet", - "@replyHasBeenSent": {}, - "storyFrom": "Story von {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, "openVideoCamera": "Video aufnehmen", "@openVideoCamera": { "type": "text", @@ -2699,35 +1997,10 @@ "size": {} } }, - "whoCanSeeMyStoriesDesc": "Bitte beachte, dass sich Leute in deiner Story sehen und kontaktieren können.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Story hinzufügen", - "@addToStory": {}, "publish": "Veröffentlichen", "@publish": {}, - "whoCanSeeMyStories": "Wer kann meine Storys sehen?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Story deabbonieren", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Dieses Mitglied hat noch keine Story gepostet", - "@thisUserHasNotPostedAnythingYet": {}, - "whatIsGoingOn": "Was gibt es neues?", - "@whatIsGoingOn": {}, - "addDescription": "Beschreibung hinzufügen", - "@addDescription": {}, - "storyPrivacyWarning": "Bitte beachte, dass sich die Leute in deiner Story sehen und kontaktieren können. Ihre Stories sind 24 Stunden lang sichtbar, aber es gibt keine Garantie dafür, dass sie von allen Geräten und Servern gelöscht werden.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Ich habe verstanden", - "@iUnderstand": {}, - "bubbleSize": "Sprechblasengröße", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "pinMessage": "An Raum anheften", "@pinMessage": {}, - "pinnedEventsError": "Angeheftete Nachrichten nicht gefunden", - "@pinnedEventsError": {}, "emojis": "Emojis", "@emojis": {}, "placeCall": "Anruf tätigen", @@ -2740,16 +2013,10 @@ "@videoCallsBetaWarning": {}, "emailOrUsername": "E-Mail oder Benutzername", "@emailOrUsername": {}, - "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder Lineage OS-Unterstützung.", + "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder prüfe die Lineage-OS-Unterstützung.", "@unsupportedAndroidVersionLong": {}, "experimentalVideoCalls": "Experimentelle Videoanrufe", "@experimentalVideoCalls": {}, - "matrixWidgets": "Matrix-Widgets", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Das Bearbeiten von Widgets und Integrationen ist noch nicht möglich.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Bearbeiten Sie Widgets und Integrationen", - "@editIntegrations": {}, "reactedWith": "{sender} reagierte mit {reaction}", "@reactedWith": { "type": "text", @@ -2768,17 +2035,15 @@ "@confirmEventUnpin": {}, "dismiss": "Verwerfen", "@dismiss": {}, - "switchToAccount": "Zum Account {number} wechseln", + "switchToAccount": "Zu Konto {number} wechseln", "@switchToAccount": { "type": "number", "placeholders": { "number": {} } }, - "nextAccount": "Nächster Account", + "nextAccount": "Nächstes Konto", "@nextAccount": {}, - "editWidgets": "Widgets bearbeiten", - "@editWidgets": {}, "widgetJitsi": "Jitsi Meet", "@widgetJitsi": {}, "widgetCustom": "Angepasst", @@ -2795,29 +2060,22 @@ "@widgetUrlError": {}, "errorAddingWidget": "Fehler beim Hinzufügen des Widgets.", "@errorAddingWidget": {}, - "previousAccount": "Vorheriger Account", + "previousAccount": "Vorheriges Konto", "@previousAccount": {}, - "separateChatTypes": "Separate Direktchats, Gruppen und Spaces", + "separateChatTypes": "Separate Direktchats und Gruppen", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showSpaces": "Bereichsliste anzeigen", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Zugehörige Direkt-Chats in Spaces anzeigen", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "widgetNameError": "Bitte gib einen Anzeigenamen an.", "@widgetNameError": {}, - "youKicked": "Du hast {user} rausgeworfen", + "youKicked": "👞 Du hast {user} rausgeworfen", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Du hast {user} rausgeworfen und verbannt", + "youKickedAndBanned": "🙅 Du hast {user} rausgeworfen und verbannt", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2833,7 +2091,7 @@ "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Du bist dem Chat beigetreten", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Du hast die Einladung angenommen", + "youAcceptedTheInvitation": "👍 Du hast die Einladung angenommen", "@youAcceptedTheInvitation": {}, "youBannedUser": "Du hast den {user} verbannt", "@youBannedUser": { @@ -2847,18 +2105,797 @@ "user": {} } }, - "youInvitedBy": "Du wurdest von {user} eingeladen", + "youInvitedBy": "📩 Du wurdest von {user} eingeladen", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "Du hast {user} eingeladen", + "youInvitedUser": "📩 Du hast {user} eingeladen", "@youInvitedUser": { "placeholders": { "user": {} } }, - "noEmailWarning": "Bitte gib eine gültige E-Mail-Adresse ein. Andernfalls kannst du dein Passwort nicht zurücksetzen. Wenn du das nicht möchtest, tippe erneut auf die Schaltfläche, um fortzufahren.", - "@noEmailWarning": {} + "recoveryKey": "Wiederherstellungs-Schlüssel", + "@recoveryKey": {}, + "recoveryKeyLost": "Wiederherstellungsschlüssel verloren?", + "@recoveryKeyLost": {}, + "user": "Benutzer", + "@user": {}, + "custom": "Benutzerdefiniert", + "@custom": {}, + "storeInAndroidKeystore": "Im Android KeyStore speichern", + "@storeInAndroidKeystore": {}, + "storeSecurlyOnThisDevice": "Auf diesem Gerät sicher speichern", + "@storeSecurlyOnThisDevice": {}, + "dehydrate": "Sitzung exportieren und Gerät löschen", + "@dehydrate": {}, + "dehydrateWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Stelle sicher, dass du die Sicherungsdatei sicher aufbewahrst.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR-Benutzer: Sitzung exportieren", + "@dehydrateTor": {}, + "dehydrateTorLong": "Für TOR-Benutzer wird empfohlen, die Sitzung zu exportieren, bevor das Fenster geschlossen wird.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR-Benutzer: Session-Export importieren", + "@hydrateTor": {}, + "hydrate": "Aus Sicherungsdatei wiederherstellen", + "@hydrate": {}, + "indexedDbErrorTitle": "Probleme im Privatmodus", + "@indexedDbErrorTitle": {}, + "unlockOldMessages": "Entsperre alte Nachrichten", + "@unlockOldMessages": {}, + "pleaseEnterRecoveryKeyDescription": "Um deine alten Nachrichten zu entsperren, gib bitte den Wiederherstellungsschlüssel ein, der in einer früheren Sitzung generiert wurde. Dein Wiederherstellungsschlüssel ist NICHT dein Passwort.", + "@pleaseEnterRecoveryKeyDescription": {}, + "saveKeyManuallyDescription": "Speicher diesen Schlüssel manuell, indem du den Systemfreigabedialog oder die Zwischenablage auslöst.", + "@saveKeyManuallyDescription": {}, + "hydrateTorLong": "Hast du deine Sitzung das letzte Mal auf TOR exportiert? Importiere sie schnell und chatte weiter.", + "@hydrateTorLong": {}, + "pleaseEnterRecoveryKey": "Bitte gib deinen Wiederherstellungsschlüssel ein:", + "@pleaseEnterRecoveryKey": {}, + "countFiles": "{count} Dateien", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "users": "Benutzer", + "@users": {}, + "storeInSecureStorageDescription": "Speicher den Wiederherstellungsschlüssel im sicheren Speicher dieses Geräts.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Im Apple KeyChain speichern", + "@storeInAppleKeyChain": {}, + "indexedDbErrorLong": "Die Nachrichtenspeicherung ist im privaten Modus standardmäßig leider nicht aktiviert.\nBitte besuche\n- about:config\n- Setze dom.indexedDB.privateBrowsing.enabled auf true\nAndernfalls ist es nicht möglich, FluffyChat auszuführen.", + "@indexedDbErrorLong": {}, + "confirmMatrixId": "Bitte bestätigen deine Matrix-ID, um dein Konto zu löschen.", + "@confirmMatrixId": {}, + "supposedMxid": "das sollte sein {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasdm": "Als Direktnachrichtenraum für die angegebene Matrix-ID markieren", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Als Gruppe markieren", + "@commandHint_markasgroup": {}, + "hideUnimportantStateEvents": "Blende unwichtige Zustandsereignisse aus", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nicht mehr anzeigen", + "@doNotShowAgain": {}, + "appearOnTopDetails": "Ermöglicht, dass die App oben angezeigt wird (nicht erforderlich, wenn du Fluffychat bereits als Anrufkonto eingerichtet haben)", + "@appearOnTopDetails": {}, + "noKeyForThisMessage": "Dies kann passieren, wenn die Nachricht gesendet wurde, bevor du dich auf diesem Gerät bei deinem Konto angemeldet hast.\n\nEs ist auch möglich, dass der Absender dein Gerät blockiert hat oder etwas mit der Internetverbindung schief gelaufen ist.\n\nKannst du die Nachricht in einer anderen Sitzung lesen? Dann kannst du die Nachricht davon übertragen! Gehe zu den Einstellungen > Geräte und vergewissere dich, dass sich deine Geräte gegenseitig verifiziert haben. Wenn du den Raum das nächste Mal öffnest und beide Sitzungen im Vordergrund sind, werden die Schlüssel automatisch übertragen.\n\nDu möchtest die Schlüssel beim Abmelden oder Gerätewechsel nicht verlieren? Stelle sicher, dass du das Chat-Backup in den Einstellungen aktiviert hast.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Diese Benachrichtigung wird angezeigt, wenn der Vordergrunddienst ausgeführt wird.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "Bildschirm teilen", + "@screenSharingTitle": {}, + "callingPermissions": "Anrufberechtigungen", + "@callingPermissions": {}, + "callingAccount": "Anrufkonto", + "@callingAccount": {}, + "callingAccountDetails": "Ermöglicht FluffyChat, die native Android-Dialer-App zu verwenden.", + "@callingAccountDetails": {}, + "appearOnTop": "Oben erscheinen", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofon, Kamera und andere FluffyChat-Berechtigungen", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Warum ist diese Nachricht nicht lesbar?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Neue Gruppe", + "@newGroup": {}, + "newSpace": "Neuer Space", + "@newSpace": {}, + "enterSpace": "Raum betreten", + "@enterSpace": {}, + "enterRoom": "Raum betreten", + "@enterRoom": {}, + "allSpaces": "Alle Spaces", + "@allSpaces": {}, + "screenSharingDetail": "Du teilst deinen Bildschirm in FuffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} Chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "newSpaceDescription": "Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.", + "@newSpaceDescription": {}, + "wasDirectChatDisplayName": "Leerer Chat (war {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "encryptThisChat": "Diesen Chat verschlüsseln", + "@encryptThisChat": {}, + "googlyEyesContent": "{senderName} hat dir Googly Eyes gesendet", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "startFirstChat": "Starte deinen ersten Chat", + "@startFirstChat": {}, + "deviceKeys": "Geräteschlüssel:", + "@deviceKeys": {}, + "commandHint_cuddle": "Umarmung senden", + "@commandHint_cuddle": {}, + "commandHint_hug": "Umarmung senden", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} knuddelt dich", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "sorryThatsNotPossible": "Sorry ... das ist nicht möglich", + "@sorryThatsNotPossible": {}, + "hugContent": "{senderName} umarmt dich", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "Glupschaugen senden", + "@commandHint_googly": {}, + "disableEncryptionWarning": "Aus Sicherheitsgründen kannst du die Verschlüsselung in einem Chat nicht deaktivieren, wo sie zuvor aktiviert wurde.", + "@disableEncryptionWarning": {}, + "reopenChat": "Chat wieder eröffnen", + "@reopenChat": {}, + "noBackupWarning": "Achtung! Ohne Aktivierung des Chat-Backups verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Vor dem Ausloggen wird dringend empfohlen, das Chat-Backup zu aktivieren.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Keine anderen Geräte anwesend", + "@noOtherDevicesFound": {}, + "allRooms": "Alle Gruppenchats", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Datei wurde gespeichert unter {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Zur letzten ungelesenen Nachricht", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Bis hier gelesen", + "@readUpToHere": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Bitte versuche es später noch einmal oder wähle einen anderen Server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "jump": "Springen", + "@jump": {}, + "openLinkInBrowser": "Link im Browser öffnen", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 Oh nein. Etwas ist schief gelaufen. Wenn du möchtest, kannst du den Bug bei den Entwicklern melden.", + "@reportErrorDescription": {}, + "report": "Melden", + "@report": {}, + "signInWithPassword": "Anmelden mit Passwort", + "@signInWithPassword": {}, + "signInWith": "Anmelden mit {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "importNow": "Jetzt importieren", + "@importNow": {}, + "importEmojis": "Emojis importieren", + "@importEmojis": {}, + "importFromZipFile": "Aus ZIP-Datei importieren", + "@importFromZipFile": {}, + "exportEmotePack": "Emote-Paket als ZIP-Datei exportieren", + "@exportEmotePack": {}, + "notAnImage": "Keine Bilddatei.", + "@notAnImage": {}, + "replace": "Ersetzen", + "@replace": {}, + "sendTypingNotifications": "Tippbenachrichtigungen senden", + "@sendTypingNotifications": {}, + "profileNotFound": "Der Benutzer konnte auf dem Server nicht gefunden werden. Vielleicht gibt es ein Verbindungsproblem oder der Benutzer existiert nicht.", + "@profileNotFound": {}, + "createGroup": "Gruppe erstellen", + "@createGroup": {}, + "shareInviteLink": "Einladungslink teilen", + "@shareInviteLink": {}, + "inviteContactToGroupQuestion": "Willst du {contact} zum Chat {groupName} einladen?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Neuer Versuch", + "@tryAgain": {}, + "redactMessageDescription": "Die Nachricht wird für alle Teilnehmer dieses Gesprächs gelöscht. Dies kann nicht rückgängig gemacht werden.", + "@redactMessageDescription": {}, + "redactedBy": "Gelöscht von {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedByBecause": "Gelöscht von {username} weil: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "setTheme": "Design festlegen:", + "@setTheme": {}, + "setColorTheme": "Farbdesign einstellen:", + "@setColorTheme": {}, + "invite": "Einladen", + "@invite": {}, + "optionalRedactReason": "(Optional) Grund für die Löschung dieser Nachricht...", + "@optionalRedactReason": {}, + "messagesStyle": "Nachrichten:", + "@messagesStyle": {}, + "chatPermissions": "Chatberechtigungen", + "@chatPermissions": {}, + "chatDescription": "Chatbeschreibung", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Chatbeschreibung geändert", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Noch keine Chatbeschreibung vorhanden.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Ungültiger Servername", + "@invalidServerName": {}, + "directChat": "Privater Chat", + "@directChat": {}, + "addChatDescription": "Chatbeschreibung hinzufügen ...", + "@addChatDescription": {}, + "setChatDescription": "Chatbeschreibung festlegen", + "@setChatDescription": {}, + "inviteGroupChat": "📨 Einladungen zum Gruppenchat", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Einladungen zum privaten Chat", + "@invitePrivateChat": {}, + "invalidInput": "Ungültige Eingabe!", + "@invalidInput": {}, + "hasKnocked": "🚪 {user} hat angeklopft", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "wrongPinEntered": "Falsche PIN eingegeben! Bitte in {seconds} Sekunden erneut versuchen ...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "pleaseEnterANumber": "Bitte eine Zahl größer 0 eingeben", + "@pleaseEnterANumber": {}, + "emoteKeyboardNoRecents": "Kürzlich verwendete Emotes werden hier angezeigt ...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "banUserDescription": "Der Benutzer wird aus dem Chat gebannt und kann den Chat erst wieder betreten, wenn die Verbannung aufgehoben wird.", + "@banUserDescription": {}, + "removeDevicesDescription": "Du wirst von diesem Gerät abgemeldet und kannst dann dort keine Nachrichten mehr empfangen.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Der Benutzer kann den Chat dann wieder betreten, wenn er es versucht.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push-Benachrichtigungen nicht verfügbar", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Sobald du diesen Benutzer zum Administrator gemacht hast, kannst du das möglicherweise nicht mehr rückgängig machen, da er dann über dieselben Berechtigungen wie du verfügt.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Der Chat wird in das Archiv verschoben. Andere Benutzer können sehen, dass du den Chat verlassen hast.", + "@archiveRoomDescription": {}, + "learnMore": "Erfahre mehr", + "@learnMore": {}, + "roomUpgradeDescription": "Der Chat wird dann mit der neuen Raumversion neu erstellt. Alle Teilnehmer werden benachrichtigt, dass sie zum neuen Chat wechseln müssen. Mehr über Raumversionen erfährst du unter https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "kickUserDescription": "Der Benutzer wird aus dem Chat geworfen, aber nicht gebannt. In öffentlichen Chats kann der Benutzer jederzeit wieder beitreten.", + "@kickUserDescription": {}, + "blockListDescription": "Du kannst Benutzer blockieren, die dich stören. Von Benutzern auf deiner persönlichen Blocklierliste kannst du keine Nachrichten oder Raumeinladungen mehr erhalten.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Gruppe erstellen und Nutzer einladen", + "@createGroupAndInviteUsers": {}, + "startConversation": "Unterhaltung starten", + "@startConversation": {}, + "blockedUsers": "Blockierte Benutzer", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Gruppe kann über die Suche gefunden werden", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Leider konnte mit \"{query}\" kein Benutzer gefunden werden. Bitte schau nach, ob dir ein Tippfehler unterlaufen ist.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "Blockieren", + "@block": {}, + "yourGlobalUserIdIs": "Deine globale Benutzer-ID ist: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Rohes JSON senden", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Entschuldigung ... das scheint nicht der richtige Wiederherstellungsschlüssel zu sein.", + "@wrongRecoveryKey": {}, + "blockUsername": "Blockiere Benutzername", + "@blockUsername": {}, + "groupName": "Gruppenname", + "@groupName": {}, + "searchChatsRooms": "Suche nach #Chats, @Nutzer ...", + "@searchChatsRooms": {}, + "databaseMigrationTitle": "Datenbank wird optimiert", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Bitte warten. Dies kann einen Moment dauern.", + "@databaseMigrationBody": {}, + "thisDevice": "Dieses Gerät:", + "@thisDevice": {}, + "publicSpaces": "Öffentliche Spaces", + "@publicSpaces": {}, + "passwordIsWrong": "Dein eingegebenes Passwort ist falsch", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Bitte dein aktuelles Passwort eingeben", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Öffentlicher Link", + "@publicLink": {}, + "nothingFound": "Nichts gefunden ...", + "@nothingFound": {}, + "decline": "Ablehnen", + "@decline": {}, + "newPassword": "Neues Passwort", + "@newPassword": {}, + "passwordsDoNotMatch": "Passwörter stimmen nicht überein", + "@passwordsDoNotMatch": {}, + "subspace": "Sub-Space", + "@subspace": {}, + "select": "Auswählen", + "@select": {}, + "pleaseChooseAStrongPassword": "Bitte wähle ein starkes Passwort", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Chat oder Sub-Space hinzufügen", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Leer lassen, um den Status zu löschen.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Space beitreten", + "@joinSpace": {}, + "searchForUsers": "Suche nach @benutzer ...", + "@searchForUsers": {}, + "initAppError": "Beim Starten der App ist ein Fehler aufgetreten", + "@initAppError": {}, + "databaseBuildErrorBody": "Die SQlite-Datenbank kann nicht erstellt werden. Die App versucht vorerst, die Legacy-Datenbank zu verwenden. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sessionLostBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "youInvitedToBy": "📩 Du wurdest per Link eingeladen zu:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "sendReadReceipts": "Lesebestätigungen senden", + "@sendReadReceipts": {}, + "formattedMessages": "Formatierte Nachrichten", + "@formattedMessages": {}, + "forwardMessageTo": "Nachricht weiterleiten an {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendTypingNotificationsDescription": "Andere Teilnehmer in einem Chat können sehen, wenn du eine neue Nachricht tippst.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Formatierte Nachrichteninhalte wie fettgedruckten Text mit Markdown anzeigen.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Anderen Benutzer verifizieren", + "@verifyOtherUser": {}, + "sendReadReceiptsDescription": "Andere Teilnehmer in einem Chat können sehen, ob du eine Nachricht gelesen hast.", + "@sendReadReceiptsDescription": {}, + "transparent": "Transparent", + "@transparent": {}, + "verifyOtherDevice": "🔐 Anderes Gerät verifizieren", + "@verifyOtherDevice": {}, + "verifyOtherUserDescription": "Wenn du einen anderen Benutzer verifizierst, kannst du sicher sein, dass du weißt, an wen du wirklich schreibst. 💪\n\nWenn du eine Verifizierung startest, wird dir und dem anderen Nutzer ein Popup in der App angezeigt. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die ihr miteinander vergleichen müsst.\n\nDas geht am besten, wenn man sich trifft oder einen Videoanruf startet. 👭", + "@verifyOtherUserDescription": {}, + "acceptedKeyVerification": "{sender} hat die Schlüsselverifikation akzeptiert", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} hat die Schlüsselverifikation abgebrochen", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} hat die Schlüsselverifikation abgeschlossen", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} ist bereit für die Schlüsselverifikation", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} hat eine Schlüsselverifikation angefragt", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} hat die Schlüsselverifikation gestartet", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "verifyOtherDeviceDescription": "Wenn du ein anderes Gerät verifizieren, können diese Geräteschlüssel austauschen, was die Sicherheit insgesamt erhöht. 💪\n\nSobald du eine Verifizierung starten, erscheint ein Pop-up in der App auf beiden Geräten. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die du miteinander vergleichen musst.\n\nAm besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳", + "@verifyOtherDeviceDescription": {}, + "presenceStyle": "Statusmeldungen:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Status-Nachrichten anderer Benutzer anzeigen", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "incomingMessages": "Eingehende Nachrichten", + "@incomingMessages": {}, + "commandHint_unignore": "Angegebene Matrix-ID nicht mehr ignorieren", + "@commandHint_unignore": {}, + "commandHint_ignore": "Angegebene Matrix-ID ignorieren", + "@commandHint_ignore": {}, + "noDatabaseEncryption": "Datenbankverschlüsselung wird auf dieser Plattform nicht unterstützt", + "@noDatabaseEncryption": {}, + "hidePresences": "Status-Liste verbergen?", + "@hidePresences": {}, + "stickers": "Sticker", + "@stickers": {}, + "discover": "Entdecken", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread} ungelesene Chats", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "customEmojisAndStickersBody": "Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.", + "@customEmojisAndStickersBody": {}, + "globalChatId": "Globale Chat-ID", + "@globalChatId": {}, + "accessAndVisibility": "Zugang und Sichtbarkeit", + "@accessAndVisibility": {}, + "hideMemberChangesInPublicChats": "Mitglieder-Änderungen in öffentlichen Chats ausblenden", + "@hideMemberChangesInPublicChats": {}, + "accessAndVisibilityDescription": "Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.", + "@accessAndVisibilityDescription": {}, + "hideMemberChangesInPublicChatsBody": "Zeige keine Beitritt- oder Verlassen-Ereignisse von Mitgliedern in der Timeline an, um die Lesbarkeit in öffentlichen Chats zu verbessern.", + "@hideMemberChangesInPublicChatsBody": {}, + "userWouldLikeToChangeTheChat": "{user} würde dem Chat gerne beitreten.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Es wurde noch kein öffentlicher Link erstellt", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Chat kann über die Suche auf {server} gefunden werden", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "appLockDescription": "App mit einer PIN sperren, wenn sie nicht verwendet wird", + "@appLockDescription": {}, + "calls": "Anrufe", + "@calls": {}, + "customEmojisAndStickers": "Eigene Emojis und Sticker", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "Geschwärzte Nachrichten verstecken", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Ungültige und unbekannte Nachrichten-Formate ausblenden", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Übersicht", + "@overview": {}, + "notifyMeFor": "Benachrichtige mich für", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Passwort-Wiederherstellungs-Einstellungen", + "@passwordRecoverySettings": {}, + "knock": "Anklopfen", + "@knock": {}, + "knocking": "Klopft", + "@knocking": {}, + "thereAreCountUsersBlocked": "Im Augenblick werden {count} Benutzer blockiert.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "usersMustKnock": "Benutzer müssen anklopfen", + "@usersMustKnock": {}, + "noOneCanJoin": "Niemand kann beitreten", + "@noOneCanJoin": {}, + "createNewAddress": "Neue Adresse erstellen", + "@createNewAddress": {}, + "userRole": "Benutzerrolle", + "@userRole": {}, + "minimumPowerLevel": "{level} is das minimale Power-Level.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "publicChatAddresses": "Öffentliche Chat-Adressen", + "@publicChatAddresses": {}, + "gallery": "Galerie", + "@gallery": {}, + "files": "Dateien", + "@files": {}, + "restricted": "Beschränkt", + "@restricted": {}, + "knockRestricted": "Anklopfen beschränkt", + "@knockRestricted": {}, + "searchIn": "In Chat \"{chat}\" suchen ...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Weiter suchen ...", + "@searchMore": {}, + "unread": "Ungelesen", + "@unread": {}, + "noMoreChatsFound": "Keine weiteren Chats gefunden ...", + "@noMoreChatsFound": {}, + "joinedChats": "Beigetretene Chats", + "@joinedChats": {}, + "space": "Space", + "@space": {}, + "spaces": "Spaces", + "@spaces": {}, + "goToSpace": "Geh zum Space: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Als ungelesen markieren", + "@markAsUnread": {}, + "swipeRightToLeftToReply": "Wische von rechts nach links zum Antworten", + "@swipeRightToLeftToReply": {}, + "countChatsAndCountParticipants": "{chats} Chats und {participants} Teilnehmer", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "changeGeneralChatSettings": "Allgemeine Chat-Einstellungen ändern", + "@changeGeneralChatSettings": {}, + "userLevel": "{level} - Benutzer", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeTheChatPermissions": "Ändere die Chat-Berechtigungen", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Wechsele die Sichtbarkeit der Chat-Historie", + "@changeTheVisibilityOfChatHistory": {}, + "chatPermissionsDescription": "Einstellen, welches Level für bestimmte Aktionen in diesem Chat erforderlich ist. Die Level 0, 50 und 100 stehen üblicherweise für Benutzer, Moderatoren und Admins, aber jede Abstufung ist möglich.", + "@chatPermissionsDescription": {}, + "invitedBy": "📩 Eingeladen von {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "inviteOtherUsers": "Lade andere Benutzer in diesen Chat ein", + "@inviteOtherUsers": {}, + "changeTheCanonicalRoomAlias": "Ändern der Hauptadresse für den öffentlichen Chat", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Sende eine @room-Benachrichtigung", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Chat-Beschreibung ändern", + "@changeTheDescriptionOfTheGroup": {}, + "updateInstalled": "🎉 Update {version} installiert!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Änderungsprotokoll", + "@changelog": {}, + "sendCanceled": "Senden abgebrochen", + "@sendCanceled": {}, + "noChatsFoundHere": "Hier wurden noch keine Chats gefunden. Starte einen neuen Chat mit jemandem, indem du die Schaltfläche unten verwenden. ⤵️", + "@noChatsFoundHere": {}, + "whatIsAHomeserver": "Was ist ein Homeserver?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "Scheint kein kompatibler Homeserver zu sein. Falsche URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "loginWithMatrixId": "Mit Matrix-ID anmelden", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Server suchen", + "@discoverHomeservers": {}, + "homeserverDescription": "Alle deine Daten werden auf einem Homeserver gespeichert, so wie bei einem E-Mail Anbieter. Du kannst aussuchen, welchen Homeserver du benutzen willst und kannst trotzdem mit allen kommunizieren. Erfahre mehr auf https://matrix.org.", + "@homeserverDescription": {}, + "sendingAttachment": "Anhang wird gesendet ...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Generiere Video-Vorschaubild ...", + "@generatingVideoThumbnail": {}, + "serverLimitReached": "Server-Limit erreicht! Warte {seconds} Sekunden ...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "calculatingFileSize": "Dateigröße wird berechnet ...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Anhang zum Senden vorbereiten ...", + "@prepareSendingAttachment": {}, + "compressVideo": "Video wird komprimiert ...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Sende Anhang {index} von {length} ...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "fileIsTooBigForServer": "Kann nicht gesendet werden! Der Server unterstützt nur Anhänge bis höchstens {max}.", + "@fileIsTooBigForServer": { + "type": "text", + "placeholders": { + "max": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Eines deiner Geräte ist nicht verifiziert", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Hinweis: Wenn du alle deine Geräte mit dem Chat-Backup verbindest, sind sie automatisch verifiziert.", + "@noticeChatBackupDeviceVerification": {}, + "setWallpaper": "Hintergrund ändern", + "@setWallpaper": {}, + "opacity": "Deckkraft:", + "@opacity": {}, + "welcomeText": "Hey Hey 👋 Das ist FluffyChat. Du kannst sich bei jedem Homeserver anmelden, der mit https://matrix.org kompatibel ist. Und dann mit jedem chatten. Das hier ist ein riesiges dezentrales Nachrichtennetzwerk!", + "@welcomeText": {}, + "blur": "Verwischen:", + "@blur": {}, + "manageAccount": "Konto verwalten", + "@manageAccount": {}, + "continueText": "Fortfahren", + "@continueText": {}, + "noContactInformationProvided": "Der Server stellt keine gültigen Kontaktinformationen bereit", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Serveradministrator kontaktieren", + "@contactServerAdmin": {}, + "name": "Name", + "@name": {}, + "version": "Version", + "@version": {}, + "website": "Website", + "@website": {}, + "aboutHomeserver": "Über {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "sendUncompressed": "Unkomprimiert senden", + "@sendUncompressed": {}, + "boldText": "Fetter Text", + "@boldText": {}, + "invalidUrl": "Ungültige URL", + "@invalidUrl": {}, + "addLink": "Link hinzufügen", + "@addLink": {}, + "unableToJoinChat": "Chat kann nicht beigetreten werden. Möglicherweise hat die Gegenseite das Gespräch bereits beendet.", + "@unableToJoinChat": {}, + "italicText": "Kursiver Text", + "@italicText": {}, + "strikeThrough": "Durchgestrichen", + "@strikeThrough": {}, + "pleaseFillOut": "Bitte ausfüllen", + "@pleaseFillOut": {}, + "sendImages": "Sende {count} Bilder", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "contactServerSecurity": "Server-Sicherheit kontaktieren", + "@contactServerSecurity": {}, + "compress": "Komprimieren", + "@compress": {}, + "supportPage": "Support-Seite", + "@supportPage": {}, + "serverInformation": "Server-Informationen:", + "@serverInformation": {} } diff --git a/assets/l10n/intl_hy.arb b/assets/l10n/intl_el.arb similarity index 52% rename from assets/l10n/intl_hy.arb rename to assets/l10n/intl_el.arb index c3ecf58685..327d2bdc73 100644 --- a/assets/l10n/intl_hy.arb +++ b/assets/l10n/intl_el.arb @@ -1,158 +1,313 @@ { - "@@locale": "hy", - "@@last_modified": "2021-08-14 12:41:10.006533", - "about": "Հավելվածի մասին", - "@about": { + "@showPassword": { "type": "text", "placeholders": {} }, - "accept": "Ընդունել", - "@accept": { + "hugContent": "{senderName} σε αγκαλιάζει", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@darkTheme": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username}-ը ընդունել է հրավերը", - "@acceptedTheInvitation": { + "@passphraseOrKey": { "type": "text", - "placeholders": { - "username": {} - } + "placeholders": {} }, - "account": "Հաշիվ", - "@account": { + "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} }, - "accountInformation": "Տեղեկություններ հաշվի մասին", - "@accountInformation": { + "@theyMatch": { "type": "text", "placeholders": {} }, - "activatedEndToEndEncryption": "{username}-ը ակտիվացրել է end to end կոդավորումը", - "@activatedEndToEndEncryption": { + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "commandHint_cuddle": "Στείλτε μια αγκαλιά", + "@commandHint_cuddle": {}, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "admin": "Διαχειριστής", + "@admin": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { "type": "text", "placeholders": { - "username": {} + "groupName": {} } }, - "addGroupDescription": "Ավելացնել խմբի նկարագրություն", - "@addGroupDescription": { + "@addAccount": {}, + "@close": { "type": "text", "placeholders": {} }, - "admin": "Համակարգող", - "@admin": { + "@configureChat": { "type": "text", "placeholders": {} }, - "alias": "կեղծանուն", - "@alias": { + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Արդեն հաշի՞վ ունեք", - "@alreadyHaveAnAccount": { + "@currentlyActive": { "type": "text", "placeholders": {} }, - "anyoneCanJoin": "Յուրաքանչյուրը կարող է միանալ", - "@anyoneCanJoin": { + "@removeYourAvatar": { "type": "text", "placeholders": {} }, - "archive": "Արխիվ", - "@archive": { + "@unsupportedAndroidVersion": {}, + "@device": { "type": "text", "placeholders": {} }, - "archivedRoom": "Արխիվացված սենյակ", - "@archivedRoom": { + "blockDevice": "Συσκευή μπλοκ", + "@blockDevice": { "type": "text", "placeholders": {} }, - "areGuestsAllowedToJoin": "Արդյո՞ք հյուր օգտատերերին թույլատրվում է միանալ", - "@areGuestsAllowedToJoin": { + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "areYouSure": "Համոզվա՞ծ եք", - "@areYouSure": { + "@encryption": { "type": "text", "placeholders": {} }, - "askSSSSCache": "", - "@askSSSSCache": { + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { "type": "text", "placeholders": {} }, - "askSSSSSign": "", - "@askSSSSSign": { + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", "type": "text", "placeholders": {} }, - "askSSSSVerify": "", - "@askSSSSVerify": { + "@changeTheNameOfTheGroup": { "type": "text", "placeholders": {} }, - "askVerificationRequest": "", - "@askVerificationRequest": { + "@changedTheChatAvatar": { "type": "text", "placeholders": { "username": {} } }, - "authentication": "", - "@authentication": { + "@verifySuccess": { "type": "text", "placeholders": {} }, - "avatarHasBeenChanged": "", - "@avatarHasBeenChanged": { + "@sendFile": { "type": "text", "placeholders": {} }, - "banFromChat": "", - "@banFromChat": { + "@newVerificationRequest": { "type": "text", "placeholders": {} }, - "banned": "", - "@banned": { + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { "type": "text", "placeholders": {} }, - "bannedUser": "", - "@bannedUser": { + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { "type": "text", "placeholders": { "username": {}, - "targetName": {} + "displayname": {} } }, - "blockDevice": "", - "@blockDevice": { + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { "type": "text", "placeholders": {} }, - "cachedKeys": "", - "@cachedKeys": { + "@warning": { "type": "text", "placeholders": {} }, - "cancel": "", - "@cancel": { + "@password": { "type": "text", "placeholders": {} }, - "changedTheChatAvatar": "", - "@changedTheChatAvatar": { + "@allSpaces": {}, + "supposedMxid": "Αυτό θα πρέπει να είναι {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "changedTheChatDescriptionTo": "", + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "banFromChat": "Απαγόρευση από τη συνομιλία", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "askSSSSSign": "Για να μπορέσετε να υπογράψετε το άλλο άτομο, πληκτρολογήστε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.", + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "remove": "Αφαιρέστε το", + "@remove": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, "@changedTheChatDescriptionTo": { "type": "text", "placeholders": { @@ -160,595 +315,863 @@ "description": {} } }, - "changedTheChatNameTo": "", - "@changedTheChatNameTo": { + "@countParticipants": { "type": "text", "placeholders": { - "username": {}, - "chatname": {} + "count": {} } }, - "changedTheChatPermissions": "", - "@changedTheChatPermissions": { + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "areGuestsAllowedToJoin": "Επιτρέπεται στους φιλοξενούμενους χρήστες να συμμετάσχουν", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "blocked": "Αποκλεισμένο", + "@blocked": { "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { "placeholders": { - "username": {} + "user": {} } }, - "changedTheDisplaynameTo": "", - "@changedTheDisplaynameTo": { + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { "type": "text", "placeholders": { "username": {}, - "displayname": {} + "username2": {} } }, - "changedTheGuestAccessRules": "", + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "sendOnEnter": "Αποστολή με enter", + "@sendOnEnter": {}, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "answeredTheCall": "{senderName} απάντησε στην κλήση", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, "@changedTheGuestAccessRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheGuestAccessRulesTo": "", - "@changedTheGuestAccessRulesTo": { + "@dateWithYear": { "type": "text", "placeholders": { - "username": {}, - "rules": {} + "year": {}, + "month": {}, + "day": {} } }, - "changedTheHistoryVisibility": "", - "@changedTheHistoryVisibility": { + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "alias": "ψευδώνυμο", + "@alias": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "all": "Όλα", + "@all": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { "placeholders": { - "username": {} + "count": {} } }, - "changedTheHistoryVisibilityTo": "", - "@changedTheHistoryVisibilityTo": { + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { "type": "text", "placeholders": { "username": {}, - "rules": {} + "link": {} } }, - "changedTheJoinRules": "", - "@changedTheJoinRules": { + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { "type": "text", "placeholders": { - "username": {} + "error": {} } }, - "changedTheJoinRulesTo": "", - "@changedTheJoinRulesTo": { + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "Ο homeserver υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}", + "@badServerLoginTypesException": { "type": "text", "placeholders": { - "username": {}, - "joinRules": {} + "serverVersions": {}, + "supportedVersions": {} } }, - "changedTheProfileAvatar": "", - "@changedTheProfileAvatar": { + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}", + "@cantOpenUri": { "type": "text", "placeholders": { - "username": {} + "uri": {} } }, - "changedTheRoomAliases": "", - "@changedTheRoomAliases": { + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { "type": "text", "placeholders": { - "username": {} + "localizedTimeShort": {} } }, - "changedTheRoomInvitationLink": "", - "@changedTheRoomInvitationLink": { + "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { - "username": {} + "username": {}, + "rules": {} } }, - "changelog": "", - "@changelog": { + "@weSentYouAnEmail": { "type": "text", "placeholders": {} }, - "changeTheHomeserver": "", - "@changeTheHomeserver": { + "@offensive": { "type": "text", "placeholders": {} }, - "changeTheme": "", - "@changeTheme": { + "@needPantalaimonWarning": { "type": "text", "placeholders": {} }, - "changeTheNameOfTheGroup": "", - "@changeTheNameOfTheGroup": { + "@makeAdminDescription": {}, + "@edit": { "type": "text", "placeholders": {} }, - "changeTheServer": "", - "@changeTheServer": { + "@loadMore": { "type": "text", "placeholders": {} }, - "changeWallpaper": "", - "@changeWallpaper": { + "@noEmotesFound": { "type": "text", "placeholders": {} }, - "channelCorruptedDecryptError": "", - "@channelCorruptedDecryptError": { + "@synchronizingPleaseWait": { "type": "text", "placeholders": {} }, - "chat": "", - "@chat": { + "@transferFromAnotherDevice": { "type": "text", "placeholders": {} }, - "chatDetails": "", - "@chatDetails": { + "@passwordHasBeenChanged": { "type": "text", "placeholders": {} }, - "chooseAStrongPassword": "", - "@chooseAStrongPassword": { + "@pushRules": { "type": "text", "placeholders": {} }, - "chooseAUsername": "", - "@chooseAUsername": { + "@goToTheNewRoom": { "type": "text", "placeholders": {} }, - "close": "", - "@close": { + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "", - "@compareEmojiMatch": { + "@copy": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "", - "@compareNumbersMatch": { + "@saveKeyManuallyDescription": {}, + "@none": { "type": "text", "placeholders": {} }, - "confirm": "", - "@confirm": { + "@editBundlesForAccount": {}, + "@renderRichContent": { "type": "text", "placeholders": {} }, - "connect": "", - "@connect": { + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "importFromZipFile": "Εισαγωγή από αρχείο .zip", + "@importFromZipFile": {}, + "@toggleUnread": { "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "", - "@connectionAttemptFailed": { + "@or": { "type": "text", "placeholders": {} }, - "contactHasBeenInvitedToTheGroup": "", - "@contactHasBeenInvitedToTheGroup": { + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { "type": "text", "placeholders": {} }, - "contentViewer": "", - "@contentViewer": { + "@containsDisplayName": { "type": "text", "placeholders": {} }, - "copiedToClipboard": "", - "@copiedToClipboard": { + "@signInWith": { "type": "text", - "placeholders": {} + "placeholders": { + "provider": {} + } }, - "copy": "", - "@copy": { + "@username": { "type": "text", "placeholders": {} }, - "couldNotDecryptMessage": "", - "@couldNotDecryptMessage": { + "@changedTheRoomAliases": { "type": "text", "placeholders": { - "error": {} + "username": {} } }, - "couldNotSetAvatar": "", - "@couldNotSetAvatar": { + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { "type": "text", "placeholders": {} }, - "couldNotSetDisplayname": "", - "@couldNotSetDisplayname": { + "@chatDetails": { "type": "text", "placeholders": {} }, - "countParticipants": "", - "@countParticipants": { + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { - "count": {} + "username": {}, + "rules": {} } }, - "create": "", - "@create": { + "@leftTheChat": { "type": "text", "placeholders": {} }, - "createAccountNow": "", - "@createAccountNow": { + "@verified": { "type": "text", "placeholders": {} }, - "createdTheChat": "", - "@createdTheChat": { + "repeatPassword": "Επανάληψη κωδικού πρόσβασης", + "@repeatPassword": {}, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { "type": "text", "placeholders": { - "username": {} + "displayname": {} } }, - "createNewGroup": "", - "@createNewGroup": { + "@callingPermissions": {}, + "@delete": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "", - "@crossSigningDisabled": { + "@newMessageInFluffyChat": { "type": "text", "placeholders": {} }, - "crossSigningEnabled": "", - "@crossSigningEnabled": { + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { "type": "text", "placeholders": {} }, - "currentlyActive": "", - "@currentlyActive": { + "@deviceId": { "type": "text", "placeholders": {} }, - "darkTheme": "", - "@darkTheme": { + "@register": { "type": "text", "placeholders": {} }, - "dateAndTimeOfDay": "", - "@dateAndTimeOfDay": { + "@unlockOldMessages": {}, + "@identity": { "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } + "placeholders": {} }, - "dateWithoutYear": "", - "@dateWithoutYear": { - "type": "text", + "@numChats": { + "type": "number", "placeholders": { - "month": {}, - "day": {} + "number": {} } }, - "dateWithYear": "", - "@dateWithYear": { + "@changedTheJoinRulesTo": { "type": "text", "placeholders": { - "year": {}, - "month": {}, - "day": {} + "username": {}, + "joinRules": {} } }, - "delete": "", - "@delete": { + "@ignore": { "type": "text", "placeholders": {} }, - "deleteMessage": "", - "@deleteMessage": { + "@recording": { "type": "text", "placeholders": {} }, - "deny": "", - "@deny": { + "@changedTheChatPermissions": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "device": "", - "@device": { + "@moderator": { "type": "text", "placeholders": {} }, - "devices": "", - "@devices": { + "@optionalRedactReason": {}, + "acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση", + "@acceptedTheInvitation": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "discardPicture": "", - "@discardPicture": { + "@waitingPartnerEmoji": { "type": "text", "placeholders": {} }, - "displaynameHasBeenChanged": "", - "@displaynameHasBeenChanged": { + "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "donate": "", - "@donate": { + "@tryToSendAgain": { "type": "text", "placeholders": {} }, - "downloadFile": "", - "@downloadFile": { + "@guestsCanJoin": { "type": "text", "placeholders": {} }, - "editDisplayname": "", - "@editDisplayname": { + "@ok": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "", - "@editJitsiInstance": { + "@copyToClipboard": { "type": "text", "placeholders": {} }, - "emoteExists": "", - "@emoteExists": { + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { "type": "text", "placeholders": {} }, - "emoteInvalid": "", - "@emoteInvalid": { + "@send": { "type": "text", "placeholders": {} }, - "emoteSettings": "", - "@emoteSettings": { + "@hasWithdrawnTheInvitationFor": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {}, + "targetName": {} + } }, - "emoteShortcode": "", - "@emoteShortcode": { + "@visibleForAllParticipants": { "type": "text", "placeholders": {} }, - "emoteWarnNeedToPick": "", - "@emoteWarnNeedToPick": { + "@noRoomsFound": { "type": "text", "placeholders": {} }, - "emptyChat": "", - "@emptyChat": { + "banned": "Απαγορευμένο", + "@banned": { "type": "text", "placeholders": {} }, - "enableEncryptionWarning": "", - "@enableEncryptionWarning": { + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { "type": "text", "placeholders": {} }, - "encryption": "", - "@encryption": { + "@archiveRoomDescription": {}, + "exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip", + "@exportEmotePack": {}, + "@changedTheChatNameTo": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {}, + "chatname": {} + } }, - "encryptionAlgorithm": "", - "@encryptionAlgorithm": { + "@sendSticker": { "type": "text", "placeholders": {} }, - "encryptionNotEnabled": "", - "@encryptionNotEnabled": { + "account": "Λογαριασμός", + "@account": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "", - "@end2endEncryptionSettings": { + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { "type": "text", "placeholders": {} }, - "enterAGroupName": "", - "@enterAGroupName": { + "@whyDoYouWantToReportThis": { "type": "text", "placeholders": {} }, - "enterAUsername": "", - "@enterAUsername": { + "@locationDisabledNotice": { "type": "text", "placeholders": {} }, - "enterYourHomeserver": "", - "@enterYourHomeserver": { + "@placeCall": {}, + "@removedBy": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "fileName": "", - "@fileName": { + "@changedTheRoomInvitationLink": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "fileSize": "", - "@fileSize": { + "@newChat": { "type": "text", "placeholders": {} }, - "fluffychat": "", - "@fluffychat": { + "@notifications": { "type": "text", "placeholders": {} }, - "forward": "", - "@forward": { + "@commandHint_plain": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /plain" }, - "friday": "", - "@friday": { + "@emoteSettings": { "type": "text", "placeholders": {} }, - "fromJoining": "", - "@fromJoining": { + "@experimentalVideoCalls": {}, + "@openCamera": { "type": "text", "placeholders": {} }, - "fromTheInvitation": "", - "@fromTheInvitation": { + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { "type": "text", "placeholders": {} }, - "group": "", - "@group": { + "@mention": { "type": "text", "placeholders": {} }, - "groupDescription": "", - "@groupDescription": { + "@openInMaps": { "type": "text", "placeholders": {} }, - "groupDescriptionHasBeenChanged": "", - "@groupDescriptionHasBeenChanged": { + "@withTheseAddressesRecoveryDescription": { "type": "text", "placeholders": {} }, - "groupIsPublic": "", - "@groupIsPublic": { + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { "type": "text", "placeholders": {} }, - "groupWith": "", - "@groupWith": { + "@redactedByBecause": { "type": "text", "placeholders": { - "displayname": {} + "username": {}, + "reason": {} } }, - "guestsAreForbidden": "", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "", - "@guestsCanJoin": { + "@isTyping": { "type": "text", "placeholders": {} }, - "hasWithdrawnTheInvitationFor": "", - "@hasWithdrawnTheInvitationFor": { - "type": "text", + "@youHaveWithdrawnTheInvitationFor": { "placeholders": { - "username": {}, - "targetName": {} + "user": {} } }, - "help": "", - "@help": { + "@chat": { "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "", - "@homeserverIsNotCompatible": { + "@group": { "type": "text", "placeholders": {} }, - "id": "", - "@id": { + "@leave": { "type": "text", "placeholders": {} }, - "identity": "", - "@identity": { + "@skip": { "type": "text", "placeholders": {} }, - "incorrectPassphraseOrKey": "", - "@incorrectPassphraseOrKey": { + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "inviteContact": "", - "@inviteContact": { + "@enterRoom": {}, + "@enableEmotesGlobally": { "type": "text", "placeholders": {} }, - "inviteContactToGroup": "", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "", - "@invited": { + "areYouSure": "Είσαι σίγουρος;", + "@areYouSure": { "type": "text", "placeholders": {} }, - "invitedUser": "", - "@invitedUser": { + "@pleaseChooseAPasscode": { "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } + "placeholders": {} }, - "invitedUsersOnly": "", - "@invitedUsersOnly": { + "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} }, - "inviteText": "", - "@inviteText": { + "@changedTheProfileAvatar": { "type": "text", "placeholders": { - "username": {}, - "link": {} + "username": {} } }, - "isDeviceKeyCorrect": "", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "", - "@isTyping": { + "allChats": "Όλες οι συνομιλίες", + "@allChats": { "type": "text", "placeholders": {} }, - "joinedTheChat": "", - "@joinedTheChat": { + "@reportUser": {}, + "@sharedTheLocation": { "type": "text", "placeholders": { "username": {} } }, - "keysCached": "", - "@keysCached": { + "@commandHint_send": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /send" }, - "keysMissing": "", - "@keysMissing": { + "@onlineKeyBackupEnabled": { "type": "text", "placeholders": {} }, - "kicked": "", - "@kicked": { + "@unbannedUser": { "type": "text", "placeholders": { "username": {}, "targetName": {} } }, - "kickedAndBanned": "", + "@confirmEventUnpin": {}, + "badServerVersionsException": "Ο homeserver υποστηρίζει τις εκδόσεις Spec:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο τις {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, "@kickedAndBanned": { "type": "text", "placeholders": { @@ -756,796 +1179,752 @@ "targetName": {} } }, - "kickFromChat": "", - "@kickFromChat": { + "@noConnectionToTheServer": { "type": "text", "placeholders": {} }, - "lastActiveAgo": "", - "@lastActiveAgo": { + "@fileHasBeenSavedAt": { "type": "text", "placeholders": { - "localizedTimeShort": {} + "path": {} } }, - "lastSeenIp": "", - "@lastSeenIp": { + "@license": { "type": "text", "placeholders": {} }, - "lastSeenLongTimeAgo": "", - "@lastSeenLongTimeAgo": { + "addToSpace": "Προσθήκη στο χώρο", + "@addToSpace": {}, + "@unbanFromChat": { "type": "text", "placeholders": {} }, - "leave": "", - "@leave": { + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { "type": "text", "placeholders": {} }, - "leftTheChat": "", - "@leftTheChat": { + "@recoveryKey": {}, + "@redactMessage": { "type": "text", "placeholders": {} }, - "license": "", - "@license": { + "@forward": { "type": "text", "placeholders": {} }, - "lightTheme": "", - "@lightTheme": { + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "about": "Σχετικά με το", + "@about": { "type": "text", "placeholders": {} }, - "loadCountMoreParticipants": "", - "@loadCountMoreParticipants": { + "@chooseAStrongPassword": { "type": "text", - "placeholders": { - "count": {} - } + "placeholders": {} }, - "loadingPleaseWait": "", - "@loadingPleaseWait": { + "@hideUnknownEvents": { "type": "text", "placeholders": {} }, - "loadMore": "", - "@loadMore": { + "@dehydrateTorLong": {}, + "@yourPublicKey": { "type": "text", "placeholders": {} }, - "login": "", - "@login": { + "@tooManyRequestsWarning": { "type": "text", "placeholders": {} }, - "logInTo": "", - "@logInTo": { + "@invitedUser": { "type": "text", "placeholders": { - "homeserver": {} + "username": {}, + "targetName": {} } }, - "logout": "", - "@logout": { + "@kickFromChat": { "type": "text", "placeholders": {} }, - "makeAModerator": "", - "@makeAModerator": { + "@commandHint_myroomnick": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /myroomnick" }, - "makeAnAdmin": "", - "@makeAnAdmin": { + "@offline": { "type": "text", "placeholders": {} }, - "makeSureTheIdentifierIsValid": "", - "@makeSureTheIdentifierIsValid": { + "@noPermission": { "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "", - "@messageWillBeRemovedWarning": { + "@doNotShowAgain": {}, + "activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε κρυπτογράφηση από άκρη σε άκρη", + "@activatedEndToEndEncryption": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "moderator": "", - "@moderator": { + "@report": {}, + "@status": { "type": "text", "placeholders": {} }, - "monday": "", - "@monday": { + "@compareNumbersMatch": { "type": "text", "placeholders": {} }, - "muteChat": "", - "@muteChat": { + "@groupIsPublic": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "", - "@needPantalaimonWarning": { + "@verifyStart": { "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "", - "@newMessageInFluffyChat": { + "@memberChanges": { "type": "text", "placeholders": {} }, - "newVerificationRequest": "", - "@newVerificationRequest": { + "@joinRoom": { "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "", - "@noCrossSignBootstrap": { + "@unverified": {}, + "@fluffychat": { "type": "text", "placeholders": {} }, - "noEmotesFound": "", - "@noEmotesFound": { + "@howOffensiveIsThisContent": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "", - "@noGoogleServicesWarning": { + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { "type": "text", - "placeholders": {} + "placeholders": { + "senderName": {} + } }, - "noMegolmBootstrap": "", - "@noMegolmBootstrap": { + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} σας στέλνει googly eyes", + "@googlyEyesContent": { "type": "text", - "placeholders": {} + "placeholders": { + "senderName": {} + } }, - "none": "", - "@none": { - "type": "text", - "placeholders": {} + "@youBannedUser": { + "placeholders": { + "user": {} + } }, - "noPermission": "", - "@noPermission": { + "@theyDontMatch": { "type": "text", "placeholders": {} }, - "noRoomsFound": "", - "@noRoomsFound": { + "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "notSupportedInWeb": "", - "@notSupportedInWeb": { + "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "numberSelected": "", - "@numberSelected": { + "addChatDescription": "Προσθέστε μια περιγραφή συνομιλίας...", + "@addChatDescription": {}, + "@sentAnAudio": { "type": "text", "placeholders": { - "number": {} + "username": {} } }, - "ok": "", - "@ok": { + "@editRoomAvatar": { "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "", - "@onlineKeyBackupDisabled": { + "@encrypted": { "type": "text", "placeholders": {} }, - "onlineKeyBackupEnabled": "", - "@onlineKeyBackupEnabled": { + "@commandHint_leave": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /leave" }, - "oopsSomethingWentWrong": "", - "@oopsSomethingWentWrong": { + "@commandHint_myroomavatar": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /myroomavatar" }, - "openAppToReadMessages": "", - "@openAppToReadMessages": { + "cancel": "Ακύρωση", + "@cancel": { "type": "text", "placeholders": {} }, - "openCamera": "", - "@openCamera": { + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "appLock": "Κλείδωμα εφαρμογών", + "@appLock": { "type": "text", "placeholders": {} }, - "optionalGroupName": "", - "@optionalGroupName": { + "@commandHint_react": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /react" }, - "participatingUserDevices": "", - "@participatingUserDevices": { + "@changedTheHistoryVisibility": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "passphraseOrKey": "", - "@passphraseOrKey": { + "@commandHint_me": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /me" }, - "password": "", - "@password": { + "@pleaseEnterYourUsername": { "type": "text", "placeholders": {} }, - "pickImage": "", - "@pickImage": { + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "play": "", - "@play": { + "@wrongPinEntered": { "type": "text", "placeholders": { - "fileName": {} + "seconds": {} } }, - "pleaseChooseAUsername": "", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "", - "@pleaseEnterAMatrixIdentifier": { + "sendTypingNotifications": "Αποστολή ειδοποιήσεων δακτυλογράφησης", + "@sendTypingNotifications": {}, + "@lightTheme": { "type": "text", "placeholders": {} }, - "pleaseEnterYourPassword": "", - "@pleaseEnterYourPassword": { + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { "type": "text", "placeholders": {} }, - "pleaseEnterYourUsername": "", - "@pleaseEnterYourUsername": { + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "publicRooms": "", - "@publicRooms": { + "@voiceCall": {}, + "@commandHint_kick": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /kick" }, - "recording": "", - "@recording": { + "@copiedToClipboard": { "type": "text", "placeholders": {} }, - "redactedAnEvent": "", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "", - "@reject": { + "@createNewSpace": { "type": "text", "placeholders": {} }, - "rejectedTheInvitation": "", - "@rejectedTheInvitation": { + "@commandHint_unban": { "type": "text", - "placeholders": { - "username": {} - } + "description": "Usage hint for the command /unban" }, - "rejoin": "", - "@rejoin": { + "@unknownEncryptionAlgorithm": { "type": "text", "placeholders": {} }, - "remove": "", - "@remove": { + "@commandHint_ban": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /ban" }, - "removeAllOtherDevices": "", - "@removeAllOtherDevices": { + "importEmojis": "Εισαγωγή Emojis", + "@importEmojis": {}, + "@confirm": { "type": "text", "placeholders": {} }, - "removedBy": "", - "@removedBy": { + "@wasDirectChatDisplayName": { "type": "text", "placeholders": { - "username": {} + "oldDisplayName": {} } }, - "removeDevice": "", - "@removeDevice": { + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { "type": "text", "placeholders": {} }, - "unbanFromChat": "", - "@unbanFromChat": { + "@removeFromBundle": {}, + "@numUsersTyping": { "type": "text", - "placeholders": {} + "placeholders": { + "count": {} + } }, - "removeMessage": "", - "@removeMessage": { + "@fontSize": { "type": "text", "placeholders": {} }, - "renderRichContent": "", - "@renderRichContent": { + "@whoCanPerformWhichAction": { "type": "text", "placeholders": {} }, - "reply": "", - "@reply": { + "confirmMatrixId": "Παρακαλούμε επιβεβαιώστε το Matrix ID σας για να διαγράψετε τον λογαριασμό σας.", + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { "type": "text", "placeholders": {} }, - "requestPermission": "", - "@requestPermission": { + "@you": { "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "", - "@requestToReadOlderMessages": { + "notAnImage": "Δεν είναι αρχείο εικόνας.", + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { "type": "text", "placeholders": {} }, - "revokeAllPermissions": "", - "@revokeAllPermissions": { + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { "type": "text", - "placeholders": {} + "placeholders": { + "date": {}, + "timeOfDay": {} + } }, - "roomHasBeenUpgraded": "", - "@roomHasBeenUpgraded": { + "@commandHint_op": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /op" }, - "saturday": "", - "@saturday": { + "@commandHint_join": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /join" }, - "searchForAChat": "", - "@searchForAChat": { + "@sourceCode": { "type": "text", "placeholders": {} }, - "seenByUser": "", - "@seenByUser": { + "@roomUpgradeDescription": {}, + "@commandHint_invite": { "type": "text", - "placeholders": { - "username": {} - } + "description": "Usage hint for the command /invite" }, - "seenByUserAndUser": "", - "@seenByUserAndUser": { + "@userSentUnknownEvent": { "type": "text", "placeholders": { "username": {}, - "username2": {} + "type": {} } }, - "send": "", - "@send": { + "@scanQrCode": {}, + "@logout": { "type": "text", "placeholders": {} }, - "sendAMessage": "", - "@sendAMessage": { + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "sendFile": "", - "@sendFile": { - "type": "text", - "placeholders": {} + "@youKicked": { + "placeholders": { + "user": {} + } }, - "sendImage": "", - "@sendImage": { + "areYouSureYouWantToLogout": "Σίγουρα θέλετε να αποσυνδεθείτε;", + "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "sentAFile": "", - "@sentAFile": { + "@changedTheJoinRules": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "", - "@sentAnAudio": { + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { "type": "text", "placeholders": { - "username": {} + "sender": {}, + "reaction": {} } }, - "sentAPicture": "", - "@sentAPicture": { + "bannedUser": "{username} banned {targetName}", + "@bannedUser": { "type": "text", "placeholders": { - "username": {} + "username": {}, + "targetName": {} } }, - "sentASticker": "", - "@sentASticker": { + "@sorryThatsNotPossible": {}, + "@videoWithSize": { "type": "text", "placeholders": { - "username": {} + "size": {} } }, - "sentAVideo": "", - "@sentAVideo": { + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { "type": "text", "placeholders": { - "username": {} + "count": {} } }, - "sessionVerified": "", - "@sessionVerified": { + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} σε αγκαλιάζει", + "@cuddleContent": { "type": "text", - "placeholders": {} + "placeholders": { + "senderName": {} + } }, - "setAProfilePicture": "", - "@setAProfilePicture": { + "askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};", + "@askVerificationRequest": { "type": "text", - "placeholders": {} + "placeholders": { + "username": {} + } }, - "setGroupDescription": "", - "@setGroupDescription": { + "@containsUserName": { "type": "text", "placeholders": {} }, - "setInvitationLink": "", - "@setInvitationLink": { + "@messages": { "type": "text", "placeholders": {} }, - "setStatus": "", - "@setStatus": { + "@login": { "type": "text", "placeholders": {} }, - "settings": "", - "@settings": { + "@deviceKeys": {}, + "@waitingPartnerNumbers": { "type": "text", "placeholders": {} }, - "share": "", - "@share": { + "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "sharedTheLocation": "", - "@sharedTheLocation": { + "@everythingReady": { "type": "text", - "placeholders": { - "username": {} - } + "placeholders": {} }, - "signUp": "", - "@signUp": { + "addEmail": "Προσθήκη email", + "@addEmail": { "type": "text", "placeholders": {} }, - "skip": "", - "@skip": { + "@emoteKeyboardNoRecents": { "type": "text", "placeholders": {} }, - "sourceCode": "", - "@sourceCode": { + "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "startYourFirstChat": "", - "@startYourFirstChat": { + "@startedACall": { "type": "text", - "placeholders": {} + "placeholders": { + "senderName": {} + } }, - "statusExampleMessage": "", - "@statusExampleMessage": { + "@emoteInvalid": { "type": "text", "placeholders": {} }, - "submit": "", - "@submit": { + "@systemTheme": { "type": "text", "placeholders": {} }, - "sunday": "", - "@sunday": { + "@notificationsEnabledForThisAccount": { "type": "text", "placeholders": {} }, - "systemTheme": "", - "@systemTheme": { + "@deleteMessage": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "", - "@tapToShowMenu": { + "@visibilityOfTheChatHistory": { "type": "text", "placeholders": {} }, - "theyDontMatch": "", - "@theyDontMatch": { + "@settings": { "type": "text", "placeholders": {} }, - "theyMatch": "", - "@theyMatch": { + "@setTheme": {}, + "@changeTheHomeserver": { "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "", - "@thisRoomHasBeenArchived": { + "@youJoinedTheChat": {}, + "@wallpaper": { "type": "text", "placeholders": {} }, - "thursday": "", - "@thursday": { + "@openVideoCamera": { "type": "text", "placeholders": {} }, - "timeOfDay": "", - "@timeOfDay": { + "@play": { "type": "text", "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} + "fileName": {} } }, - "title": "", - "@title": { - "description": "Title for the application", + "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "tryToSendAgain": "", - "@tryToSendAgain": { + "@changeDeviceName": { "type": "text", "placeholders": {} }, - "tuesday": "", - "@tuesday": { + "@passwordForgotten": { "type": "text", "placeholders": {} }, - "unbannedUser": "", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "", - "@unblockDevice": { + "@statusExampleMessage": { "type": "text", "placeholders": {} }, - "unknownDevice": "", - "@unknownDevice": { + "@security": { "type": "text", "placeholders": {} }, - "unknownEncryptionAlgorithm": "", - "@unknownEncryptionAlgorithm": { + "@markAsRead": {}, + "@sendAudio": { "type": "text", "placeholders": {} }, - "unknownEvent": "", - "@unknownEvent": { + "@widgetName": {}, + "@sentASticker": { "type": "text", "placeholders": { - "type": {} + "username": {} } }, - "unknownSessionVerify": "", - "@unknownSessionVerify": { + "@errorAddingWidget": {}, + "@commandHint_dm": { "type": "text", - "placeholders": {} + "description": "Usage hint for the command /dm" }, - "unmuteChat": "", - "@unmuteChat": { + "commandHint_hug": "Στείλτε μια αγκαλιά", + "@commandHint_hug": {}, + "replace": "Αντικαταστήστε το", + "@replace": {}, + "@reject": { "type": "text", "placeholders": {} }, - "useAmoledTheme": "", - "@useAmoledTheme": { + "@extremeOffensive": { "type": "text", "placeholders": {} }, - "userAndOthersAreTyping": "", - "@userAndOthersAreTyping": { + "@editBlockedServers": { "type": "text", - "placeholders": { - "username": {}, - "count": {} - } + "placeholders": {} }, - "userAndUserAreTyping": "", - "@userAndUserAreTyping": { + "@oopsPushError": { "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } + "placeholders": {} }, - "userIsTyping": "", - "@userIsTyping": { - "type": "text", + "@youUnbannedUser": { "placeholders": { - "username": {} + "user": {} } }, - "userLeftTheChat": "", - "@userLeftTheChat": { + "@deactivateAccountWarning": { "type": "text", - "placeholders": { - "username": {} - } + "placeholders": {} }, - "username": "", - "@username": { + "archive": "Αρχείο", + "@archive": { "type": "text", "placeholders": {} }, - "userSentUnknownEvent": "", - "@userSentUnknownEvent": { + "@joinedTheChat": { "type": "text", "placeholders": { - "username": {}, - "type": {} + "username": {} } }, - "verifiedSession": "", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "", - "@verifyManual": { + "@visibleForEveryone": { "type": "text", "placeholders": {} }, - "verifyStart": "", - "@verifyStart": { + "@pleaseEnter4Digits": { "type": "text", "placeholders": {} }, - "verifySuccess": "", - "@verifySuccess": { + "@newSpace": {}, + "@changePassword": { "type": "text", "placeholders": {} }, - "verifyTitle": "", - "@verifyTitle": { + "@devices": { "type": "text", "placeholders": {} }, - "verifyUser": "", - "@verifyUser": { + "accept": "Αποδοχή", + "@accept": { "type": "text", "placeholders": {} }, - "videoCall": "", - "@videoCall": { + "@unknownEvent": { "type": "text", - "placeholders": {} + "placeholders": { + "type": {} + } }, - "visibilityOfTheChatHistory": "", - "@visibilityOfTheChatHistory": { + "@emojis": {}, + "@pleaseEnterYourPin": { "type": "text", "placeholders": {} }, - "visibleForAllParticipants": "", - "@visibleForAllParticipants": { + "@pleaseChoose": { "type": "text", "placeholders": {} }, - "visibleForEveryone": "", - "@visibleForEveryone": { + "@share": { "type": "text", "placeholders": {} }, - "voiceMessage": "", - "@voiceMessage": { + "commandHint_googly": "Στείλτε μερικά μάτια", + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { "type": "text", "placeholders": {} }, - "waitingPartnerAcceptRequest": "", - "@waitingPartnerAcceptRequest": { + "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "waitingPartnerEmoji": "", - "@waitingPartnerEmoji": { + "@sendImage": { "type": "text", "placeholders": {} }, - "waitingPartnerNumbers": "", - "@waitingPartnerNumbers": { + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { "type": "text", "placeholders": {} }, - "wallpaper": "", - "@wallpaper": { + "botMessages": "Μηνύματα bot", + "@botMessages": { "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "", - "@warningEncryptionInBeta": { + "@contentHasBeenReported": { "type": "text", "placeholders": {} }, - "wednesday": "", - "@wednesday": { + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { "type": "text", "placeholders": {} }, - "welcomeText": "", - "@welcomeText": { + "@verify": { "type": "text", "placeholders": {} }, - "whoIsAllowedToJoinThisGroup": "", - "@whoIsAllowedToJoinThisGroup": { + "@sendVideo": { "type": "text", "placeholders": {} }, - "writeAMessage": "", - "@writeAMessage": { + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { "type": "text", "placeholders": {} }, - "yes": "", - "@yes": { + "@pin": { "type": "text", "placeholders": {} }, - "you": "", - "@you": { + "importNow": "Εισαγωγή τώρα", + "@importNow": {}, + "@deleteAccount": { "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "", - "@youAreInvitedToThisChat": { + "@setInvitationLink": { "type": "text", "placeholders": {} }, - "youAreNoLongerParticipatingInThisChat": "", - "@youAreNoLongerParticipatingInThisChat": { + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "", - "@youCannotInviteYourself": { + "@invite": {}, + "@enableMultiAccounts": {}, + "anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει", + "@anyoneCanJoin": { "type": "text", "placeholders": {} }, - "youHaveBeenBannedFromThisChat": "", - "@youHaveBeenBannedFromThisChat": { + "@emotePacks": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "", - "@yourOwnUsername": { + "@indexedDbErrorTitle": {}, + "@endedTheCall": { "type": "text", - "placeholders": {} + "placeholders": { + "senderName": {} + } } -} \ No newline at end of file +} diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 8474b178f8..440f5d15ec 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -1,30 +1,43 @@ { "@@locale": "en", "@@last_modified": "2021-08-14 12:38:37.885451", - "passwordsDoNotMatch": "Passwords do not match!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Please enter a valid email address.", - "@pleaseEnterValidEmail": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, "repeatPassword": "Repeat password", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Please choose at least {min} characters.", - "@pleaseChooseAtLeastChars": { + "notAnImage": "Not an image file.", + "@notAnImage": {}, + "remove": "Remove", + "@remove": { "type": "text", - "placeholders": { - "min": {} - } + "placeholders": {} }, + "importNow": "Import now", + "@importNow": {}, + "importEmojis": "Import Emojis", + "@importEmojis": {}, + "importFromZipFile": "Import from .zip file", + "@importFromZipFile": {}, + "exportEmotePack": "Export Emote pack as .zip", + "@exportEmotePack": {}, + "replace": "Replace", + "@replace": {}, "about": "About", - "@about": { + "aboutHomeserver": "About {homeserver}", + "@aboutHomeserver": { "type": "text", - "placeholders": {} + "placeholders": { + "homeserver": {} + } }, "accept": "Accept", "@accept": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} accepted the invitation", + "acceptedTheInvitation": "👍 {username} accepted the invitation", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -36,12 +49,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Account information", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} activated end to end encryption", + "activatedEndToEndEncryption": "🔐 {username} activated end to end encryption", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -53,16 +61,17 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Add a group description", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Add new friend", - "@addNewFriend": { + "confirmMatrixId": "Please confirm your Matrix ID in order to delete your account.", + "@confirmMatrixId": {}, + "supposedMxid": "This should be {mxid}", + "@supposedMxid": { "type": "text", - "placeholders": {} + "placeholders": { + "mxid": {} + } }, + "addChatDescription": "Add a chat description...", + "@addChatDescription": {}, "addToSpace": "Add to space", "@addToSpace": {}, "admin": "Admin", @@ -85,10 +94,32 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Already have an account?", - "@alreadyHaveAnAccount": { + "commandHint_googly": "Send some googly eyes", + "@commandHint_googly": {}, + "commandHint_cuddle": "Send a cuddle", + "@commandHint_cuddle": {}, + "commandHint_hug": "Send a hug", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} sends you googly eyes", + "@googlyEyesContent": { "type": "text", - "placeholders": {} + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} cuddles you", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} hugs you", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } }, "answeredTheCall": "{senderName} answered the call", "@answeredTheCall": { @@ -107,16 +138,13 @@ "type": "text", "placeholders": {} }, + "appLockDescription": "Lock the app when not using with a pin code", + "@appLockDescription": {}, "archive": "Archive", "@archive": { "type": "text", "placeholders": {} }, - "archivedRoom": "Archived Room", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Are guest users allowed to join", "@areGuestsAllowedToJoin": { "type": "text", @@ -137,11 +165,6 @@ "type": "text", "placeholders": {} }, - "askSSSSVerify": "Please enter your secure store passphrase or recovery key to verify your session.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Accept this verification request from {username}?", "@askVerificationRequest": { "type": "text", @@ -149,31 +172,11 @@ "username": {} } }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Play", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authentication", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Automatically play animated stickers and emotes", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar changed", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -182,6 +185,10 @@ "supportedVersions": {} } }, + "sendTypingNotifications": "Send typing notifications", + "@sendTypingNotifications": {}, + "swipeRightToLeftToReply": "Swipe right to left to reply", + "@swipeRightToLeftToReply": {}, "sendOnEnter": "Send on enter", "@sendOnEnter": {}, "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", @@ -192,6 +199,20 @@ "supportedVersions": {} } }, + "countChatsAndCountParticipants": "{chats} chats and {participants} participants", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "No more chats found...", + "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", + "joinedChats": "Joined chats", + "unread": "Unread", + "space": "Space", + "spaces": "Spaces", "banFromChat": "Ban from chat", "@banFromChat": { "type": "text", @@ -225,16 +246,6 @@ "type": "text", "placeholders": {} }, - "bubbleSize": "Bubble size", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Keys cached", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancel", "@cancel": { "type": "text", @@ -356,21 +367,11 @@ "username": {} } }, - "changelog": "Changelog", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Change password", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Changes have been saved", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Change the homeserver", "@changeTheHomeserver": { "type": "text", @@ -386,16 +387,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Change the server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Change wallpaper", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Change your avatar", "@changeYourAvatar": { "type": "text", @@ -411,10 +402,6 @@ "type": "text", "placeholders": {} }, - "yourUserId": "Your user ID:", - "@yourUserId": {}, - "iWroteDownTheKey": "I wrote down the key", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Your chat backup has been set up.", "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "Chat backup", @@ -422,8 +409,6 @@ "type": "text", "placeholders": {} }, - "setupChatBackupDescription": "To protect your messages, we have generated a recovery key for you.\nPlease keep this in a safe place, such as a password manager.", - "@setupChatBackupDescription": {}, "chatBackupDescription": "Your old messages are secured with a recovery key. Please make sure you don't lose it.", "@chatBackupDescription": { "type": "text", @@ -436,11 +421,6 @@ }, "chatHasBeenAddedToThisSpace": "Chat has been added to this space", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Chat has been removed from this space", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "Chats", "@chats": { "type": "text", @@ -451,23 +431,17 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Choose a username", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Clear archive", "@clearArchive": {}, - "clearText": "Clear text", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Close", "@close": { "type": "text", "placeholders": {} }, + "commandHint_markasdm": "Mark as direct message room for the giving Matrix ID", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Mark as group", + "@commandHint_markasgroup": {}, "commandHint_ban": "Ban the given user from this room", "@commandHint_ban": { "type": "text", @@ -570,12 +544,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Compare and make sure the following emoji match those of the other device:", + "compareEmojiMatch": "Please compare the emojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Compare and make sure the following numbers match those of the other device:", + "compareNumbersMatch": "Please compare the numbers", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -595,11 +569,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Connection attempt failed", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -620,11 +589,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Content viewer", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copied to clipboard", "@copiedToClipboard": { "type": "text", @@ -647,16 +611,6 @@ "error": {} } }, - "couldNotSetAvatar": "Could not set avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Could not set displayname", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participants", "@countParticipants": { "type": "text", @@ -669,38 +623,20 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Create account now", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} created the chat", + "createdTheChat": "💬 {username} created the chat", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Create new group", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, + "createGroup": "Create group", + "@createGroup": {}, "createNewSpace": "New space", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Cross-signing off", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Cross-signing on", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Currently active", "@currentlyActive": { "type": "text", @@ -741,7 +677,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Default permission level", + "defaultPermissionLevel": "Default permission level for new users", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -761,11 +697,6 @@ "type": "text", "placeholders": {} }, - "deny": "Deny", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Device", "@device": { "type": "text", @@ -781,28 +712,13 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "The encryption is only secure when all devices have been verified.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Direct Chats", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Discard picture", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Discover", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Discover groups", - "@discoverGroups": { + "allRooms": "All Group Chats", + "@allRooms": { "type": "text", "placeholders": {} }, @@ -811,16 +727,6 @@ "type": "text", "placeholders": {} }, - "donate": "Donate", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancel and don't ask again", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Download file", "@downloadFile": { "type": "text", @@ -836,21 +742,13 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Edit chat permissions", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, + "chatPermissions": "Chat permissions", + "@chatPermissions": {}, "editDisplayname": "Edit displayname", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Edit Jitsi instance", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Edit room aliases", "@editRoomAliases": { "type": "text", @@ -871,6 +769,11 @@ "type": "text", "placeholders": {} }, + "emoteKeyboardNoRecents": "Recently-used emotes will appear here...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, "emotePacks": "Emote packs for room", "@emotePacks": { "type": "text", @@ -881,6 +784,18 @@ "type": "text", "placeholders": {} }, + "globalChatId": "Global chat ID", + "@globalChatId": {}, + "accessAndVisibility": "Access and visibility", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Who is allowed to join this chat and how the chat can be discovered.", + "@accessAndVisibilityDescription": {}, + "calls": "Calls", + "@calls": {}, + "customEmojisAndStickers": "Custom emojis and stickers", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.", + "@customEmojisAndStickersBody": {}, "emoteShortcode": "Emote shortcode", "@emoteShortcode": { "type": "text", @@ -896,11 +811,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Enable the chat backup to never lose access to your chats.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Enable emote pack globally", "@enableEmotesGlobally": { "type": "text", @@ -926,21 +836,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Encryption algorithm", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Encryption is not enabled", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "End-to-end encryption settings", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} ended the call", "@endedTheCall": { "type": "text", @@ -948,23 +848,11 @@ "senderName": {} } }, - "enterAGroupName": "Enter a group name", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Enter an email address", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Enter a space name", - "@enterASpacepName": {}, - "enterAUsername": "Enter a username", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "homeserver": "Homeserver", "@homeserver": {}, "enterYourHomeserver": "Enter your homeserver", @@ -994,11 +882,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "File size", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -1014,16 +897,6 @@ "type": "text", "placeholders": {} }, - "friday": "Friday", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Friends", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "From joining", "@fromJoining": { "type": "text", @@ -1044,16 +917,10 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Group description", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Group description changed", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, + "chatDescription": "Chat description", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Chat description changed", + "@chatDescriptionHasBeenChanged": {}, "groupIsPublic": "Group is public", "@groupIsPublic": { "type": "text", @@ -1099,16 +966,12 @@ "type": "text", "placeholders": {} }, - "hideUnknownEvents": "Hide unknown events", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver is not compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, + "hideRedactedMessages": "Hide redacted messages", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "If someone redacts a message, this message won't be visible in the chat anymore.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Hide invalid or unknown message formats", + "@hideInvalidOrUnknownMessageFormats": {}, "howOffensiveIsThisContent": "How offensive is this content?", "@howOffensiveIsThisContent": { "type": "text", @@ -1124,26 +987,14 @@ "type": "text", "placeholders": {} }, - "ignore": "Ignore", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignored users", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "You can ignore users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal ignore list.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignore username", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, + "block": "Block", + "@block": {}, + "blockedUsers": "Blocked users", + "@blockedUsers": {}, + "blockListDescription": "You can block users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal block list.", + "@blockListDescription": {}, + "blockUsername": "Ignore username", + "@blockUsername": {}, "iHaveClickedOnLink": "I have clicked on the link", "@iHaveClickedOnLink": { "type": "text", @@ -1159,16 +1010,13 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Invalid email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Invite contact", "@inviteContact": { "type": "text", "placeholders": {} }, + "inviteContactToGroupQuestion": "Do you want to invite {contact} to the chat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, "inviteContactToGroup": "Invite contact to {groupName}", "@inviteContactToGroup": { "type": "text", @@ -1176,12 +1024,22 @@ "groupName": {} } }, + "noChatDescriptionYet": "No chat description created yet.", + "@noChatDescriptionYet": {}, + "tryAgain": "Try again", + "@tryAgain": {}, + "invalidServerName": "Invalid server name", + "@invalidServerName": {}, "invited": "Invited", "@invited": { "type": "text", "placeholders": {} }, - "invitedUser": "{username} invited {targetName}", + "redactMessageDescription": "The message will be redacted for all participants in this conversation. This cannot be undone.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(Optional) Reason for redacting this message...", + "@optionalRedactReason": {}, + "invitedUser": "📩 {username} invited {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1199,7 +1057,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} invited you to FluffyChat. \n1. Install FluffyChat: https://fluffychat.im \n2. Sign up or sign in \n3. Open the invite link: {link}", + "inviteText": "{username} invited you to FluffyChat.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1207,17 +1065,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Is the following device key correct?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "is typing…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} joined the chat", + "joinedTheChat": "👋 {username} joined the chat", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1229,17 +1082,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Keys are cached", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Keys are missing", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} kicked {targetName}", + "kicked": "👞 {username} kicked {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1247,7 +1090,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} kicked and banned {targetName}", + "kickedAndBanned": "🙅 {username} kicked and banned {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1267,16 +1110,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Last seen IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Seen a long time ago", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Leave", "@leave": { "type": "text", @@ -1304,13 +1137,25 @@ "count": {} } }, + "dehydrate": "Export session and wipe device", + "@dehydrate": {}, + "dehydrateWarning": "This action cannot be undone. Ensure you safely store the backup file.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR Users: Export session", + "@dehydrateTor": {}, + "dehydrateTorLong": "For TOR users, it is recommended to export the session before closing the window.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR Users: Import session export", + "@hydrateTor": {}, + "hydrateTorLong": "Did you export your session last time on TOR? Quickly import it and continue chatting.", + "@hydrateTorLong": {}, + "hydrate": "Restore from backup file", + "@hydrate": {}, "loadingPleaseWait": "Loading… Please wait.", "@loadingPleaseWait": { "type": "text", "placeholders": {} }, - "showSpaces": "Show spaces list", - "@showSpaces": {}, "loadMore": "Load more…", "@loadMore": { "type": "text", @@ -1338,28 +1183,11 @@ "homeserver": {} } }, - "loginWithOneClick": "Sign in with one click", - "@loginWithOneClick": {}, "logout": "Logout", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Make a moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Make an admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Make sure the identifier is valid", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Member changes", "@memberChanges": { "type": "text", @@ -1375,28 +1203,13 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Message will be removed for all participants", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, + "messagesStyle": "Messages:", + "@messagesStyle": {}, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Monday", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 more event} other{{count} more events}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Mute chat", "@muteChat": { "type": "text", @@ -1412,7 +1225,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "New message in FluffyChat", + "newMessageInFluffyChat": "💬 New message in FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1437,16 +1250,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat currently does not support enabling Cross-Signing. Please enable it from within Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "No description", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "No emotes found. 😕", "@noEmotesFound": { "type": "text", @@ -1457,7 +1260,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "It seems that you have no google services on your phone. That's a good decision for your privacy! To receive push notifications in FluffyChat we recommend using https://microg.org/ or https://unifiedpush.org/.", + "noGoogleServicesWarning": "Firebase Cloud Messaging doesn't appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1470,28 +1273,15 @@ "server2": {} } }, - "createNewChatExplaination": "Just scan the QR code or share your invite link if you are not next to each other.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Share your invite link", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Type in invite link manually...", - "@typeInInviteLinkManually": {}, + "shareInviteLink": "Share invite link", + "@shareInviteLink": {}, "scanQrCode": "Scan QR code", "@scanQrCode": {}, - "noMegolmBootstrap": "Please turn on online key backup from within Element instead.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "None", "@none": { "type": "text", "placeholders": {} }, - "newPasswordDescription": "In order to be able to recover your password, you should later add an email address to your account.", - "@newPasswordDescription": {}, - "newUsernameDescription": "Your user ID will then have the format @username:servername", - "@newUsernameDescription": {}, "noPasswordRecoveryDescription": "You have not added a way to recover your password yet.", "@noPasswordRecoveryDescription": { "type": "text", @@ -1502,21 +1292,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "No public rooms found…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "No rooms found…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "No statuses found so far.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notifications", "@notifications": { "type": "text", @@ -1527,18 +1307,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Not supported in web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selected", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} users are typing…", "@numUsersTyping": { "type": "text", @@ -1571,11 +1339,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Online Key Backup is disabled", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Online Key Backup is enabled", "@onlineKeyBackupEnabled": { "type": "text", @@ -1629,11 +1392,6 @@ "@link": {}, "serverRequiresEmail": "This server needs to validate your email address for registration.", "@serverRequiresEmail": {}, - "optionalGroupName": "(Optional) Group name", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Or", "@or": { "type": "text", @@ -1644,11 +1402,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Participating user devices", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "passphrase or recovery key", "@passphraseOrKey": { "type": "text", @@ -1669,6 +1422,16 @@ "type": "text", "placeholders": {} }, + "hideMemberChangesInPublicChats": "Hide member changes in public chats", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Overview", + "@overview": {}, + "notifyMeFor": "Notify me for", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Password recovery settings", + "@passwordRecoverySettings": {}, "passwordRecovery": "Password recovery", "@passwordRecovery": { "type": "text", @@ -1706,13 +1469,8 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Please choose a username", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Please click on the link in the email and then proceed.", - "@pleaseClickOnLink": { + "pleaseClickOnLink": "Please click on the link in the email and then proceed.", + "@pleaseClickOnLink": { "type": "text", "placeholders": {} }, @@ -1721,11 +1479,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Please enter a Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseEnterRecoveryKey": "Please enter your recovery key:", "@pleaseEnterRecoveryKey": {}, "pleaseEnterYourPassword": "Please enter your password", @@ -1753,26 +1506,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Public Groups", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Public Key", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Public Rooms", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Public space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Push rules", "@pushRules": { "type": "text", @@ -1788,6 +1526,23 @@ "type": "text", "placeholders": {} }, + "redactedBy": "Redacted by {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "Direct chat", + "@directChat": {}, + "redactedByBecause": "Redacted by {username} because: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, "redactedAnEvent": "{username} redacted an event", "@redactedAnEvent": { "type": "text", @@ -1822,11 +1577,6 @@ "type": "text", "placeholders": {} }, - "remove": "Remove", - "@remove": { - "type": "text", - "placeholders": {} - }, "removeAllOtherDevices": "Remove all other devices", "@removeAllOtherDevices": { "type": "text", @@ -1849,21 +1599,11 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Remove message", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Remove your avatar", "@removeYourAvatar": { "type": "text", "placeholders": {} }, - "renderRichContent": "Render rich message content", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, "replaceRoomWithNewerVersion": "Replace room with newer version", "@replaceRoomWithNewerVersion": { "type": "text", @@ -1884,16 +1624,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Request to read older messages", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revoke all permissions", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Room has been upgraded", "@roomHasBeenUpgraded": { "type": "text", @@ -1904,38 +1634,16 @@ "type": "text", "placeholders": {} }, - "saturday": "Saturday", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Saved file as {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Save file", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Save file to this folder", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Search", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Search for a chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Security", "@security": { "type": "text", @@ -1952,22 +1660,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Seen by {username} and {count} others}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Seen by {username} and {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Send", "@send": { "type": "text", @@ -1987,11 +1679,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Allow sending bug reports with sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Send file", "@sendFile": { "type": "text", @@ -2002,6 +1689,13 @@ "type": "text", "placeholders": {} }, + "sendImages": "Send {count} image", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, "sendMessages": "Send messages", "@sendMessages": { "type": "text", @@ -2022,35 +1716,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} sent a file", + "sentAFile": "📁 {username} sent a file", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} sent an audio", + "sentAnAudio": "🎤 {username} sent an audio", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} sent a picture", + "sentAPicture": "🖼️ {username} sent a picture", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} sent a sticker", + "sentASticker": "😊 {username} sent a sticker", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} sent a video", + "sentAVideo": "🎥 {username} sent a video", "@sentAVideo": { "type": "text", "placeholders": { @@ -2064,26 +1758,11 @@ "senderName": {} } }, - "sentryInfo": "Information about your privacy: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Session is verified", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "separateChatTypes": "Separate Direct Chats, Groups, and Spaces", + "separateChatTypes": "Separate Direct Chats and Groups", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "setAProfilePicture": "Set a profile picture", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Set as main alias", "@setAsCanonicalAlias": { "type": "text", @@ -2094,11 +1773,8 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Set group description", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, + "setChatDescription": "Set chat description", + "@setChatDescription": {}, "setInvitationLink": "Set invitation link", "@setInvitationLink": { "type": "text", @@ -2136,18 +1812,18 @@ "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Show related Direct Chats in Spaces", - "@showDirectChatsInSpaces": { + "showPassword": "Show password", + "@showPassword": { "type": "text", "placeholders": {} }, - "showPassword": "Show password", - "@showPassword": { + "presenceStyle": "Presence:", + "@presenceStyle": { "type": "text", "placeholders": {} }, - "signUp": "Sign up", - "@signUp": { + "presencesToggle": "Show status messages from other users", + "@presencesToggle": { "type": "text", "placeholders": {} }, @@ -2161,11 +1837,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Sound, vibration LED-color", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Source code", "@sourceCode": { "type": "text", @@ -2188,11 +1859,8 @@ "senderName": {} } }, - "startYourFirstChat": "Start your first chat right now! 🙂\n- Tap on 'New chat'\n- Scan the QR code of a friend\n- Have fun chatting", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, + "startFirstChat": "Start your first chat", + "@startFirstChat": {}, "status": "Status", "@status": { "type": "text", @@ -2208,11 +1876,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Sunday", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Synchronizing… Please wait.", "@synchronizingPleaseWait": { "type": "text", @@ -2223,21 +1886,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Tap on a device to verifiy", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tap to show image", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tap to show menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "They Don't Match", "@theyDontMatch": { "type": "text", @@ -2248,26 +1896,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "This room has been archived.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Thursday", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2304,11 +1932,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Tuesday", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Unavailable", "@unavailable": { "type": "text", @@ -2344,16 +1967,6 @@ "type": {} } }, - "unknownSessionVerify": "Unknown session, please verify", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Unlock chat backup", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Unmute chat", "@unmuteChat": { "type": "text", @@ -2371,18 +1984,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} unread messages}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Use AMOLED compatible colors?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} and {count} others are typing…", "@userAndOthersAreTyping": { "type": "text", @@ -2406,7 +2007,7 @@ "username": {} } }, - "userLeftTheChat": "{username} left the chat", + "userLeftTheChat": "🚪 {username} left the chat", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2418,11 +2019,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "User is not verified", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} sent a {type} event", "@userSentUnknownEvent": { "type": "text", @@ -2431,16 +2027,6 @@ "type": {} } }, - "userUnknownVerification": "User has an unknown verification status", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "User is verified", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "unverified": "Unverified", "@unverified": {}, "verified": "Verified", @@ -2448,21 +2034,11 @@ "type": "text", "placeholders": {} }, - "verifiedSession": "Successfully verified session!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verify", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verify Manually", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Start Verification", "@verifyStart": { "type": "text", @@ -2478,11 +2054,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verify User", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Video call", "@videoCall": { "type": "text", @@ -2523,7 +2094,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Wallpaper", + "wallpaper": "Wallpaper:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2533,21 +2104,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "End to end encryption is currently in Beta! Use at your own risk!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Wednesday", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Welcome to the cutest instant messenger in the Matrix network.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "We sent you an email", "@weSentYouAnEmail": { "type": "text", @@ -2593,58 +2149,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "You are invited to this chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "You are no longer participating in this chat", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "You cannot invite yourself", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "You have been banned from this chat", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Your chats are being synced…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Your own username", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Your public key", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "You will be connected to {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Zoom in", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Zoom out", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "messageInfo": "Message info", "@messageInfo": {}, "time": "Time", @@ -2657,32 +2176,14 @@ "@openGallery": {}, "removeFromSpace": "Remove from space", "@removeFromSpace": {}, - "removeFromSpaceDescription": "This removes this chat from the current space. It will then still be visible under \"All chats\".", - "@removeFromSpaceDescription": {}, "addToSpaceDescription": "Select a space to add this chat to it.", "@addToSpaceDescription": {}, "start": "Start", "@start": {}, - "setupChatBackupNow": "Set up your chat backup now", - "@setupChatBackupNow": {}, "pleaseEnterRecoveryKeyDescription": "To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.", "@pleaseEnterRecoveryKeyDescription": {}, - "saveTheRecoveryKeyNow": "Save the recovery key now", - "@saveTheRecoveryKeyNow": {}, - "addToStory": "Add to story", - "@addToStory": {}, "publish": "Publish", "@publish": {}, - "whoCanSeeMyStories": "Who can see my stories?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Unsubscribe stories", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "This user has not posted anything in their story yet", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Your story", - "@yourStory": {}, - "replyHasBeenSent": "Reply has been sent", - "@replyHasBeenSent": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2690,24 +2191,6 @@ "size": {} } }, - "storyFrom": "Story from {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Please note that people can see and contact each other in your story.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "What is going on?", - "@whatIsGoingOn": {}, - "addDescription": "Add description", - "@addDescription": {}, - "storyPrivacyWarning": "Please note that people can see and contact each other in your story. Your stories will be visible for 24 hours but there is no guarantee that they will be deleted from all devices and servers.", - "@storyPrivacyWarning": {}, - "iUnderstand": "I understand", - "@iUnderstand": {}, "openChat": "Open Chat", "@openChat": {}, "markAsRead": "Mark as read", @@ -2716,12 +2199,6 @@ "@reportUser": {}, "dismiss": "Dismiss", "@dismiss": {}, - "matrixWidgets": "Matrix Widgets", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Editing widgets and integrations is not possible yet.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Edit widgets and integrations", - "@editIntegrations": {}, "reactedWith": "{sender} reacted with {reaction}", "@reactedWith": { "type": "text", @@ -2732,8 +2209,6 @@ }, "pinMessage": "Pin to room", "@pinMessage": {}, - "pinnedEventsError": "Error loading pinned messages", - "@pinnedEventsError": {}, "confirmEventUnpin": "Are you sure to permanently unpin the event?", "@confirmEventUnpin": {}, "emojis": "Emojis", @@ -2752,6 +2227,10 @@ "@experimentalVideoCalls": {}, "emailOrUsername": "Email or username", "@emailOrUsername": {}, + "indexedDbErrorTitle": "Private mode issues", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run FluffyChat.", + "@indexedDbErrorLong": {}, "switchToAccount": "Switch to account {number}", "@switchToAccount": { "type": "number", @@ -2763,8 +2242,6 @@ "@nextAccount": {}, "previousAccount": "Previous account", "@previousAccount": {}, - "editWidgets": "Edit widgets", - "@editWidgets": {}, "addWidget": "Add widget", "@addWidget": {}, "widgetVideo": "Video", @@ -2787,7 +2264,7 @@ "@youRejectedTheInvitation": {}, "youJoinedTheChat": "You joined the chat", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "You accepted the invitation", + "youAcceptedTheInvitation": "👍 You accepted the invitation", "@youAcceptedTheInvitation": {}, "youBannedUser": "You banned {user}", "@youBannedUser": { @@ -2801,25 +2278,37 @@ "user": {} } }, - "youInvitedBy": "You have been invited by {user}", + "youInvitedToBy": "📩 You have been invited via link to:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "youInvitedBy": "📩 You have been invited by {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "You invited {user}", + "invitedBy": "📩 Invited by {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "youInvitedUser": "📩 You invited {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "You kicked {user}", + "youKicked": "👞 You kicked {user}", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "You kicked and banned {user}", + "youKickedAndBanned": "🙅 You kicked and banned {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2831,14 +2320,28 @@ "user": {} } }, - "noEmailWarning": "Please enter a valid email address. Otherwise you won't be able to reset your password. If you don't want to, tap again on the button to continue.", - "@noEmailWarning": {}, - "stories": "Stories", - "@stories": {}, + "hasKnocked": "🚪 {user} has knocked", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "usersMustKnock": "Users must knock", + "@usersMustKnock": {}, + "noOneCanJoin": "No one can join", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} would like to join the chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "No public link has been created yet", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Knock", + "@knock": {}, "users": "Users", "@users": {}, - "enableAutoBackups": "Enable auto backups", - "@enableAutoBackups": {}, "unlockOldMessages": "Unlock old messages", "@unlockOldMessages": {}, "storeInSecureStorageDescription": "Store the recovery key in the secure storage of this device.", @@ -2850,5 +2353,472 @@ "storeInAppleKeyChain": "Store in Apple KeyChain", "@storeInAppleKeyChain": {}, "storeSecurlyOnThisDevice": "Store securely on this device", - "@storeSecurlyOnThisDevice": {} + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "user": "User", + "@user": {}, + "custom": "Custom", + "@custom": {}, + "foregroundServiceRunning": "This notification appears when the foreground service is running.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "screen sharing", + "@screenSharingTitle": {}, + "screenSharingDetail": "You are sharing your screen in FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Calling permissions", + "@callingPermissions": {}, + "callingAccount": "Calling account", + "@callingAccount": {}, + "callingAccountDetails": "Allows FluffyChat to use the native android dialer app.", + "@callingAccountDetails": {}, + "appearOnTop": "Appear on top", + "@appearOnTop": {}, + "appearOnTopDetails": "Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microphone, camera and other FluffyChat permissions", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Why is this message unreadable?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.", + "@noKeyForThisMessage": {}, + "newGroup": "New group", + "@newGroup": {}, + "newSpace": "New space", + "@newSpace": {}, + "enterSpace": "Enter space", + "@enterSpace": {}, + "enterRoom": "Enter room", + "@enterRoom": {}, + "allSpaces": "All spaces", + "@allSpaces": {}, + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Hide unimportant state events", + "@hideUnimportantStateEvents": {}, + "hidePresences": "Hide Status List?", + "@hidePresences": {}, + "doNotShowAgain": "Do not show again", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Empty chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities.", + "@newSpaceDescription": {}, + "encryptThisChat": "Encrypt this chat", + "@encryptThisChat": {}, + "disableEncryptionWarning": "For security reasons you can not disable encryption in a chat, where it has been enabled before.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Sorry... that is not possible", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Device keys:", + "@deviceKeys": {}, + "reopenChat": "Reopen chat", + "@reopenChat": {}, + "noBackupWarning": "Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "No other devices found", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Unable to send! The server only supports attachments up to {max}.", + "@fileIsTooBigForServer": { + "type": "text", + "placeholders": { + "max": {} + } + }, + "fileHasBeenSavedAt": "File has been saved at {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Jump to last read message", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Read up to here", + "@readUpToHere": {}, + "jump": "Jump", + "@jump": {}, + "openLinkInBrowser": "Open link in browser", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.", + "@reportErrorDescription": {}, + "report": "report", + "@report": {}, + "signInWithPassword": "Sign in with password", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Please try again later or choose a different server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Sign in with {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "profileNotFound": "The user could not be found on the server. Maybe there is a connection problem or the user doesn't exist.", + "@profileNotFound": {}, + "setTheme": "Set theme:", + "@setTheme": {}, + "setColorTheme": "Set color theme:", + "@setColorTheme": {}, + "invite": "Invite", + "@invite": {}, + "inviteGroupChat": "📨 Invite group chat", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Invite private chat", + "@invitePrivateChat": {}, + "invalidInput": "Invalid input!", + "@invalidInput": {}, + "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "pleaseEnterANumber": "Please enter a number greater than 0", + "@pleaseEnterANumber": {}, + "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", + "@archiveRoomDescription": {}, + "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "removeDevicesDescription": "You will be logged out of this device and will no longer be able to receive messages.", + "@removeDevicesDescription": {}, + "banUserDescription": "The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.", + "@banUserDescription": {}, + "unbanUserDescription": "The user will be able to enter the chat again if they try.", + "@unbanUserDescription": {}, + "kickUserDescription": "The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.", + "@kickUserDescription": {}, + "makeAdminDescription": "Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.", + "@makeAdminDescription": {}, + "pushNotificationsNotAvailable": "Push notifications not available", + "@pushNotificationsNotAvailable": {}, + "learnMore": "Learn more", + "@learnMore": {}, + "yourGlobalUserIdIs": "Your global user-ID is: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "Unfortunately no user could be found with \"{query}\". Please check whether you made a typo.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "knocking": "Knocking", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Chat can be discovered via the search on {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "searchChatsRooms": "Search for #chats, @users...", + "@searchChatsRooms": {}, + "nothingFound": "Nothing found...", + "@nothingFound": {}, + "groupName": "Group name", + "@groupName": {}, + "createGroupAndInviteUsers": "Create a group and invite users", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Group can be found via search", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Sorry... this does not seem to be the correct recovery key.", + "@wrongRecoveryKey": {}, + "startConversation": "Start conversation", + "@startConversation": {}, + "commandHint_sendraw": "Send raw json", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "Database is optimized", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Please wait. This may take a moment.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Leave empty to clear your status.", + "@leaveEmptyToClearStatus": {}, + "select": "Select", + "@select": {}, + "searchForUsers": "Search for @users...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Please enter your current password", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "New password", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Please choose a strong password", + "@pleaseChooseAStrongPassword": {}, + "passwordsDoNotMatch": "Passwords do not match", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Your entered password is wrong", + "@passwordIsWrong": {}, + "publicLink": "Public link", + "@publicLink": {}, + "publicChatAddresses": "Public chat addresses", + "@publicChatAddresses": {}, + "createNewAddress": "Create new address", + "@createNewAddress": {}, + "joinSpace": "Join space", + "@joinSpace": {}, + "publicSpaces": "Public spaces", + "@publicSpaces": {}, + "addChatOrSubSpace": "Add chat or sub space", + "@addChatOrSubSpace": {}, + "subspace": "Subspace", + "@subspace": {}, + "decline": "Decline", + "@decline": {}, + "thisDevice": "This device:", + "@thisDevice": {}, + "initAppError": "An error occured while init the app", + "@initAppError": {}, + "userRole": "User role", + "@userRole": {}, + "minimumPowerLevel": "{level} is the minimum power level.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchIn": "Search in chat \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Search more...", + "@searchMore": {}, + "gallery": "Gallery", + "@gallery": {}, + "files": "Files", + "@files": {}, + "databaseBuildErrorBody": "Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sessionLostBody": "Your session is lost. Please report this error to the developers at {url}. The error message is: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "The app now tries to restore your session from the backup. Please report this error to the developers at {url}. The error message is: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "forwardMessageTo": "Forward message to {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceipts": "Send read receipts", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Formatted messages", + "@formattedMessages": {}, + "formattedMessagesDescription": "Display rich message content like bold text using markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verify other user", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDevice": "🔐 Verify other device", + "@verifyOtherDevice": {}, + "verifyOtherDeviceDescription": "When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It's best to have both devices handy before you start the verification. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} accepted key verification", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} canceled key verification", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} completed key verification", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} is ready for key verification", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} requested key verification", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} started key verification", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Transparent", + "@transparent": {}, + "incomingMessages": "Incoming messages", + "@incomingMessages": {}, + "stickers": "Stickers", + "@stickers": {}, + "discover": "Discover", + "@discover": {}, + "commandHint_ignore": "Ignore the given matrix ID", + "@commandHint_ignore": {}, + "commandHint_unignore": "Unignore the given matrix ID", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} unread chats", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "Database encryption is not supported on this platform", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Right now there are {count} users blocked.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "restricted": "Restricted", + "@restricted": {}, + "knockRestricted": "Knock restricted", + "@knockRestricted": {}, + "goToSpace": "Go to space: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Mark as unread", + "userLevel": "{level} - User", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Change general chat settings", + "inviteOtherUsers": "Invite other users to this chat", + "changeTheChatPermissions": "Change the chat permissions", + "changeTheVisibilityOfChatHistory": "Change the visibility of the chat history", + "changeTheCanonicalRoomAlias": "Change the main public chat address", + "sendRoomNotifications": "Send a @room notifications", + "changeTheDescriptionOfTheGroup": "Change the description of the chat", + "chatPermissionsDescription": "Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.", + "updateInstalled": "🎉 Update {version} installed!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Changelog", + "sendCanceled": "Sending canceled", + "loginWithMatrixId": "Login with Matrix-ID", + "discoverHomeservers": "Discover homeservers", + "whatIsAHomeserver": "What is a homeserver?", + "homeserverDescription": "All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "Doesn't seem to be a compatible homeserver. Wrong URL?", + "calculatingFileSize": "Calculating file size...", + "prepareSendingAttachment": "Prepare sending attachment...", + "sendingAttachment": "Sending attachment...", + "generatingVideoThumbnail": "Generating video thumbnail...", + "compressVideo": "Compressing video...", + "sendingAttachmentCountOfCount": "Sending attachment {index} of {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "Server limit reached! Waiting {seconds} seconds...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "One of your devices is not verified", + "noticeChatBackupDeviceVerification": "Note: When you connect all your devices to the chat backup, they are automatically verified.", + "continueText": "Continue", + "welcomeText": "Hey Hey 👋 This is FluffyChat. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It's a huge decentralized messaging network!", + "blur": "Blur:", + "opacity": "Opacity:", + "setWallpaper": "Set wallpaper", + "manageAccount": "Manage account", + "noContactInformationProvided": "Server does not provide any valid contact information", + "contactServerAdmin": "Contact server admin", + "contactServerSecurity": "Contact server security", + "supportPage": "Support page", + "serverInformation": "Server information:", + "name": "Name", + "version": "Version", + "website": "Website", + "compress": "Compress", + "boldText": "Bold text", + "italicText": "Italic text", + "strikeThrough": "Strikethrough", + "pleaseFillOut": "Please fill out", + "invalidUrl": "Invalid url", + "addLink": "Add link", + "unableToJoinChat": "Unable to join chat. Maybe the other party has already closed the conversation." } diff --git a/assets/l10n/intl_eo.arb b/assets/l10n/intl_eo.arb index eb14f24401..872e72ec03 100644 --- a/assets/l10n/intl_eo.arb +++ b/assets/l10n/intl_eo.arb @@ -22,11 +22,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informoj pri konto", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} aktivigis tutvojan ĉifradon", "@activatedEndToEndEncryption": { "type": "text", @@ -39,16 +34,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Aldoni priskribon de grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Aldoni novan amikon", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Administranto", "@admin": { "type": "text", @@ -69,11 +54,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Ĉu vi jam havas konton?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} respondis la vokon", "@answeredTheCall": { "type": "text", @@ -96,11 +76,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arĥivita ĉambro", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Ĉu gastoj rajtas aliĝi", "@areGuestsAllowedToJoin": { "type": "text", @@ -116,21 +91,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Bonvolu enigi pasfrazon de via sekura deponejo aŭ rehavan ŝlosilon por kaŝmemori la ŝlosilojn.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Por ke vi povu kontroli (subskribi) la alian personon, bonvolu enigi pasfrazon de via sekreta deponejo aŭ vian rehavan ŝlosilon.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Bonvolu enigi pasfrazon de via sekura deponejo aŭ vian rehavan ŝlosilon por kontroli vian salutaĵon.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Ĉu akcepti ĉi tiun kontrolpeton de {username}?", "@askVerificationRequest": { "type": "text", @@ -138,26 +103,6 @@ "username": {} } }, - "audioPlayerPause": "Paŭzigi", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Ludi", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Aŭtentikigo", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Profilbildo ŝanĝiĝis", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "La hejmservilo subtenas la jenajn specojn de salutoj:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -207,11 +152,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Kaŝmemoris ŝlosilojn", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Nuligi", "@cancel": { "type": "text", @@ -333,21 +273,11 @@ "username": {} } }, - "changelog": "Protokolo de ŝanĝoj", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Ŝanĝi pasvorton", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Ŝanĝoj konserviĝis", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Ŝanĝi hejmservilon", "@changeTheHomeserver": { "type": "text", @@ -363,16 +293,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Ŝanĝi la servilon", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Ŝanĝi fonbildon", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Ŝanĝi vian profilbildon", "@changeYourAvatar": { "type": "text", @@ -413,18 +333,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Elektu uzantonomon", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Vakigi arĥivon", "@clearArchive": {}, - "clearText": "Forigi tekston", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Fermi", "@close": { "type": "text", @@ -532,11 +442,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Malsukcesis provo konektiĝi", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakto invitiĝis al la grupo", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -557,11 +462,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Vidilo de enhavo", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Kopiite al tondujo", "@copiedToClipboard": { "type": "text", @@ -584,16 +484,6 @@ "error": {} } }, - "couldNotSetAvatar": "Ne povis agordi profilbildon", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Ne povis agordi prezentan nomon", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} partoprenantoj", "@countParticipants": { "type": "text", @@ -606,11 +496,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Krei konton nun", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} kreis la babilon", "@createdTheChat": { "type": "text", @@ -618,26 +503,11 @@ "username": {} } }, - "createNewGroup": "Krei novan grupon", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Nova aro", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Delegaj subskriboj estas malŝaltitaj", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Delegaj subskriboj estas ŝaltitaj", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Nun aktiva", "@currentlyActive": { "type": "text", @@ -698,11 +568,6 @@ "type": "text", "placeholders": {} }, - "deny": "Malakcepti", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Aparato", "@device": { "type": "text", @@ -718,46 +583,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Ĉifrado nur sekuras kiam ĉiuj aparatoj kontroliĝis.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Rektaj babiloj", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Forĵeti bildon", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Trovi", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Trovu grupojn", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Prezenta nomo ŝanĝiĝis", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Donaci", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Nuligi kaj ne redemandi", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Elŝuti dosieron", "@downloadFile": { "type": "text", @@ -773,21 +608,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Redakti permesojn de babilo", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Redakti prezentan nomon", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Redakti provizanton de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Ŝanĝi kromnomojn de ĉambro", "@editRoomAliases": { "type": "text", @@ -833,11 +658,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Ŝaltu savkopiadon de babiloj por neniam ree perdi aliron al viaj babiloj.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Ŝalti mienetaron ĉie", "@enableEmotesGlobally": { "type": "text", @@ -863,21 +683,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Ĉifra algoritmo", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Ĉifrado ne estas ŝaltita", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Agordoj pri tutvoja ĉifrado", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} finis la vokon", "@endedTheCall": { "type": "text", @@ -885,23 +695,11 @@ "senderName": {} } }, - "enterAGroupName": "Enigu nomon de grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Enigu retpoŝtadreson", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Enigi nomon de aro", - "@enterASpacepName": {}, - "enterAUsername": "Enigu uzantonomon", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Enigu vian hejmservilon", "@enterYourHomeserver": { "type": "text", @@ -929,11 +727,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Grandeco de dosiero", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -949,16 +742,6 @@ "type": "text", "placeholders": {} }, - "friday": "Vendredo", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amikoj", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Ekde aliĝo", "@fromJoining": { "type": "text", @@ -979,16 +762,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Priskribo de grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Priskribo de grupo ŝanĝiĝis", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Grupo estas publika", "@groupIsPublic": { "type": "text", @@ -1039,11 +812,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Hejmservilo ne estas interkonforma", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Kiel ofenda estas ĉi tiu enhavo?", "@howOffensiveIsThisContent": { "type": "text", @@ -1069,16 +837,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Vi povas malatenti uzantojn, kiuj vin ĝenas. Vi ne povos ricevi mesaĝojn nek invitojn al ĉambroj de la uzantoj sur via listo de malatentatoj.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Malatenti uzantonomon", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Mi klakis la ligilon", "@iHaveClickedOnLink": { "type": "text", @@ -1094,11 +852,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Nevalida retpoŝtadreso", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Inviti kontakton", "@inviteContact": { "type": "text", @@ -1142,11 +895,6 @@ "link": {} } }, - "isDeviceKeyCorrect": "Ĉu la jena identigilo de aparato estas ĝusta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "tajpas…", "@isTyping": { "type": "text", @@ -1164,16 +912,6 @@ "type": "text", "placeholders": {} }, - "keysCached": "Ŝlosiloj estas kaŝmemoritaj", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Ŝlosiloj mankas", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, "kicked": "{username} forpelis uzanton {targetName}", "@kicked": { "type": "text", @@ -1202,16 +940,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Lastafoje vidita IP-adreso", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vidita antaŭ longe", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Foriri", "@leave": { "type": "text", @@ -1261,33 +989,11 @@ "homeserver": {} } }, - "loginWith": "Saluti per {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Adiaŭi", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Igi reguligisto", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Igi administranto", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Certigu, ke la identigilo estas valida", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Ŝanĝoj de anoj", "@memberChanges": { "type": "text", @@ -1303,28 +1009,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Mesaĝo foriĝos por ĉiuj partoprenantoj", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Reguligisto", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Lundo", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 plia evento} other{{count} pliaj eventoj}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Silentigi babilon", "@muteChat": { "type": "text", @@ -1365,16 +1054,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat ankoraŭ ne subtenas ŝaltadon de delegaj subskriboj. Bonvolu ŝalti ilin per Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sen priskribo", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Neniuj mienetoj troviĝis. 😕", "@noEmotesFound": { "type": "text", @@ -1390,11 +1069,6 @@ "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "FluffyChat ankoraŭ ne subtenas ŝaltadon de enreta savkopiado de ŝlosiloj. Bonvolu ŝalti ĝin per Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Neniu", "@none": { "type": "text", @@ -1410,21 +1084,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Neniuj publikaj ĉambroj troviĝis…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Neniuj ĉambroj troviĝis…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Neniuj statoj troviĝis ankoraŭ.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Sciigoj", "@notifications": { "type": "text", @@ -1435,18 +1099,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Nesubtenata de la TTT-versio", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} elektitaj", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} uzantoj tajpas…", "@numUsersTyping": { "type": "text", @@ -1479,11 +1131,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Enreta savkopiado de ŝlosiloj estas malŝaltita", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Enreta savkopiado de ŝlosiloj estas ŝaltita", "@onlineKeyBackupEnabled": { "type": "text", @@ -1509,16 +1156,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Malnepre) Via retpoŝtadreso", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Malnepra) Nomo de grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Aŭ", "@or": { "type": "text", @@ -1529,11 +1166,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Partoprenantaj aparatoj de uzanto", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "pasfrazo aŭ rehava ŝlosilo", "@passphraseOrKey": { "type": "text", @@ -1591,11 +1223,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Bonvolu elekti uzantonomon", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Bonvolu klaki la ligilon en la retletero kaj pluiĝi.", "@pleaseClickOnLink": { "type": "text", @@ -1606,16 +1233,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Bonvolu enigi identigilon de Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Bonvolu enigi vian sekurecan ŝlosilon:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Bonvolu enigi vian pasvorton", "@pleaseEnterYourPassword": { "type": "text", @@ -1641,26 +1258,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Publikaj grupoj", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Publika ŝlosilo", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Publikaj ĉambroj", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Publika aro", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Reguloj de pasivaj sciigoj", "@pushRules": { "type": "text", @@ -1737,11 +1339,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Forigi mesaĝon", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Forigi vian profilbildon", "@removeYourAvatar": { "type": "text", @@ -1772,16 +1369,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Peti legi pli malnovajn mesaĝojn", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Nuligi ĉiujn permesojn", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Ĉambro gradaltiĝis", "@roomHasBeenUpgraded": { "type": "text", @@ -1792,53 +1379,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Sabato", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Konservi dosieron kun la nomo: {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Konservi dosieron", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Konservi dosieron al tiu ĉi dosierujo", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Serĉi", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Serĉi babilon", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Sekureco", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Sekureca ŝlosilo", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ĉu vi perdis sekurecan ŝlosilon?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Vidita de {username}", "@seenByUser": { "type": "text", @@ -1846,22 +1401,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Vidita de {username} kaj {count} aliaj}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Vidita de {username} kaj {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Sendi", "@send": { "type": "text", @@ -1877,11 +1416,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Permesi raportadon de eraroj per sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Sendi dosieron", "@sendFile": { "type": "text", @@ -1954,21 +1488,6 @@ "senderName": {} } }, - "sentryInfo": "Informoj pri via privateco: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Salutaĵo estas kontrolita", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Agordi profilbildon", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Agordi kiel ĉefan kromnomon", "@setAsCanonicalAlias": { "type": "text", @@ -1979,11 +1498,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Agordi priskribon de grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Agordi invitan ligilon", "@setInvitationLink": { "type": "text", @@ -2026,11 +1540,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Registriĝi", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Ununura saluto", "@singlesignon": { "type": "text", @@ -2041,11 +1550,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Sono, LED-koloro de vibrado", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Fontkodo", "@sourceCode": { "type": "text", @@ -2068,11 +1572,6 @@ "senderName": {} } }, - "startYourFirstChat": "Komencu nun vian unuan babilon! 🙂\n• Tuŝetu al la butono de mesaĝo\n• Enigu la uzantonomon de amiko\n• Ĝuu babiladon", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Stato", "@status": { "type": "text", @@ -2088,11 +1587,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Dimanĉo", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Spegulante… Bonvolu atendi.", "@synchronizingPleaseWait": { "type": "text", @@ -2103,21 +1597,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Tuŝetu aparaton por kontroli", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tuŝetu por montri bildon", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tuŝetu por montri menuon", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Ili ne akordas", "@theyDontMatch": { "type": "text", @@ -2128,26 +1607,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Ĉi tiu ĉambro arĥiviĝis.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Ĵaŭdo", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2184,11 +1643,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Mardo", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Nedisponeble", "@unavailable": { "type": "text", @@ -2224,16 +1678,6 @@ "type": {} } }, - "unknownSessionVerify": "Nekonata salutaĵo; bonvolu kontroli", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Malŝlosi savkopion de babilo", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Malsilentigi babilon", "@unmuteChat": { "type": "text", @@ -2251,18 +1695,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 nelegita mesaĝo} other{{unreadEvents} nelegitaj mesaĝoj}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Ĉu uzi kolorojn adaptitajn por AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} kaj {count} aliaj tajpas…", "@userAndOthersAreTyping": { "type": "text", @@ -2298,11 +1730,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Uzanto ne kontroliĝis", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} sendis eventon de speco {type}", "@userSentUnknownEvent": { "type": "text", @@ -2311,36 +1738,16 @@ "type": {} } }, - "userUnknownVerification": "Uzanto havas nekonatan staton de kontrolo", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Uzanto kontroliĝis", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Kontrolita", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sukcese kontrolis salutaĵon!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Kontroli", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Kontroli permane", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Komenci kontrolon", "@verifyStart": { "type": "text", @@ -2356,11 +1763,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Kontroli uzanton", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Vidvoko", "@videoCall": { "type": "text", @@ -2411,21 +1813,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Tutvoja ĉifrado estas ankoraŭ beta-versia! Uzu je via propra risko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Merkredo", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bonvenu al la plej ĉarma tujmesaĝilo en la reto de Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Ni sendis retleteron al vi", "@weSentYouAnEmail": { "type": "text", @@ -2471,58 +1858,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Vi estas invitita al ĉi tiu babilo", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Vi ne plu partoprenas ĉi tiun babilon", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Vi ne povas inviti vin mem", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Vi estas forbarita de ĉi tiu babilo", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Viaj babiloj estas spegulataj…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Via propra uzantonomo", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Via publika ŝlosilo", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Vi konektiĝos al {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Zomi", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Malzomi", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "sendAsText": "Sendi kiel tekston", "@sendAsText": { "type": "text" @@ -2540,11 +1890,6 @@ "type": "text", "description": "Usage hint for the command /send" }, - "chatHasBeenRemovedFromThisSpace": "Babilo foriĝis de ĉi tiu aro", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Babilo aldoniĝis al ĉi tiu aro", "@chatHasBeenAddedToThisSpace": {}, "autoplayImages": "Memage ludi movbildajn glumarkojn kaj mienetojn", diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb index 9c15f60d19..31f25dff35 100644 --- a/assets/l10n/intl_es.arb +++ b/assets/l10n/intl_es.arb @@ -23,11 +23,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Información de la cuenta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} activó el cifrado de extremo a extremo", "@activatedEndToEndEncryption": { "type": "text", @@ -40,11 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Agregar una descripción al grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Administrador", "@admin": { "type": "text", @@ -55,11 +45,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "¿Ya tienes una cuenta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} respondió a la llamada", "@answeredTheCall": { "type": "text", @@ -77,11 +62,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Sala archivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "¿Pueden unirse los usuarios visitantes?", "@areGuestsAllowedToJoin": { "type": "text", @@ -97,21 +77,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Ingrese su contraseña de almacenamiento segura (SSSS) o la clave de recuperación para almacenar en caché las claves.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Para poder confirmar a la otra persona, ingrese su contraseña de almacenamiento segura o la clave de recuperación.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Por favor, ingrese su contraseña de almacenamiento seguro (SSSS) o la clave de recuperación para verificar su sesión.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "¿Aceptar esta solicitud de verificación de {username}?", "@askVerificationRequest": { "type": "text", @@ -119,16 +89,6 @@ "username": {} } }, - "authentication": "Autenticación", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Imagen de perfil modificada", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "El servidor soporta los siguientes mecanismos para autenticación:\n{serverVersions}\npero esta aplicación sólo soporta:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -173,11 +133,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Claves almacenadas en caché", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "text", @@ -292,21 +247,11 @@ "username": {} } }, - "changelog": "Registro de cambios", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Cambiar la contraseña", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Los cambios se han guardado", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Cambiar el servidor", "@changeTheHomeserver": { "type": "text", @@ -322,16 +267,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Cambiar el servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Cambiar el fondo de pantalla", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "El cifrado se ha corrompido", "@channelCorruptedDecryptError": { "type": "text", @@ -347,7 +282,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "La copia de respaldo del chat está protegida por una clave de seguridad. Procure no perderla.", + "chatBackupDescription": "La copia de respaldo del chat está protegida por una llave de seguridad. Procure no perderla.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -367,11 +302,6 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Elija un nombre de usuario", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Borrar archivo", "@clearArchive": {}, "close": "Cerrar", @@ -379,12 +309,12 @@ "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Compare y asegúrese de que los siguientes emoji coincidan con los del otro dispositivo:", + "compareEmojiMatch": "Por favor compare los emojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Compare y asegúrese de que los siguientes números coincidan con los del otro dispositivo:", + "compareNumbersMatch": "Por favor compare los números", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -399,21 +329,11 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Falló el intento de conexión", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "El contacto ha sido invitado al grupo", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "contentViewer": "Visor de contenido", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copiado al portapapeles", "@copiedToClipboard": { "type": "text", @@ -436,16 +356,6 @@ "error": {} } }, - "couldNotSetAvatar": "No se pudo establecer la imagen de perfil", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "No se pudo establecer el nombre visible", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participantes", "@countParticipants": { "type": "text", @@ -458,33 +368,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Crear cuenta ahora", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} creó el chat", + "createdTheChat": "💬{username} creó el chat", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Crear grupo nuevo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "La confirmación cruzada está deshabilitada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "La confirmación cruzada está habilitada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Actualmente activo", "@currentlyActive": { "type": "text", @@ -540,11 +430,6 @@ "type": "text", "placeholders": {} }, - "deny": "Rechazar", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Dispositivo", "@device": { "type": "text", @@ -555,26 +440,11 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "El cifrado solo es seguro cuando se han verificado todos los dispositivos.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Descartar imagen", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "El nombre visible ha cambiado", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Donar", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Descargar archivo", "@downloadFile": { "type": "text", @@ -585,11 +455,6 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "Cambiar la instancia de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Editar alias de la sala", "@editRoomAliases": { "type": "text", @@ -645,21 +510,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritmo de cifrado", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "El cifrado no está habilitado", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Configuración del cifrado de extremo a extremo", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} terminó la llamada", "@endedTheCall": { "type": "text", @@ -667,21 +522,11 @@ "senderName": {} } }, - "enterAGroupName": "Ingrese un nombre de grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Introducir una dirección de correo electrónico", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Ingrese un nombre de usuario", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Ingrese su servidor", "@enterYourHomeserver": { "type": "text", @@ -697,11 +542,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Tamaño del archivo", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -712,11 +552,6 @@ "type": "text", "placeholders": {} }, - "friday": "Viernes", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Desde que se unió", "@fromJoining": { "type": "text", @@ -732,16 +567,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Descripción del grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "La descripción del grupo ha sido cambiada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "El grupo es público", "@groupIsPublic": { "type": "text", @@ -787,11 +612,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "El servidor no es compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "id": "Identificación", "@id": { "type": "text", @@ -807,16 +627,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Puede ignorar a los usuarios que le molesten. No podrá recibir mensajes ni invitaciones a salas de los usuarios de su lista personal de ignorados.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorar nombre de usuario", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "incorrectPassphraseOrKey": "Frase de contraseña o clave de recuperación incorrecta", "@incorrectPassphraseOrKey": { "type": "text", @@ -839,7 +649,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} invitó a {targetName}", + "invitedUser": "📩{username} invitó a {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -852,7 +662,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} te invitó a FluffyChat.\n1. Instale FluffyChat: https://fluffychat.im\n2. Regístrate o inicia sesión \n3. Abra el enlace de invitación: {link}", + "inviteText": "{username} te invitó a FluffyChat.\n1.Visita fluffychat.im e instala la app\n2. Regístrate o inicia sesión\n3. Abre el enlace de invitación:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -860,17 +670,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "¿Es correcta la siguiente clave de dispositivo?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "está escribiendo…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} se unió al chat", + "joinedTheChat": "👋{username} se unió al chat", "@joinedTheChat": { "type": "text", "placeholders": { @@ -882,17 +687,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Las claves están en caché", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Faltan las claves", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} echó a {targetName}", + "kicked": "👞{username} echó a {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -900,7 +695,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} echó y vetó a {targetName}", + "kickedAndBanned": "🙅{username} echó y vetó a {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -920,16 +715,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Última dirección IP vista", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto hace mucho tiempo", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Abandonar", "@leave": { "type": "text", @@ -984,48 +769,16 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Hacer un moderador/a", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Hacer un administrador/a", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Asegúrese de que el identificador es válido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "mention": "Mencionar", "@mention": { "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "El mensaje será eliminado para todos los participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderador", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Lunes", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 evento más} other{{count} más eventos}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Silenciar chat", "@muteChat": { "type": "text", @@ -1056,11 +809,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat actualmente no soporta la activación de Cross-Signing. Por favor, actívelo dentro de Riot.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Ningún emote encontrado. 😕", "@noEmotesFound": { "type": "text", @@ -1076,11 +824,6 @@ "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Fluffychat actualmente no soporta la activación de Online Key Backup. Por favor, actívalo dentro de Riot.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ninguno", "@none": { "type": "text", @@ -1091,28 +834,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Sin salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Ninguna sala encontrada…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "notSupportedInWeb": "No es compatible con la versión web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seleccionado(s)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "offline": "Desconectado", "@offline": { "type": "text", @@ -1128,11 +854,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "La copia de seguridad de la clave en línea está deshabilitada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "La copia de seguridad de la clave en línea está habilitada", "@onlineKeyBackupEnabled": { "type": "text", @@ -1153,16 +874,6 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Opcional) Nombre del grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositivos de usuario participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "contraseña o clave de recuperación", "@passphraseOrKey": { "type": "text", @@ -1200,26 +911,11 @@ "fileName": {} } }, - "pleaseChooseAUsername": "Por favor, elija un nombre de usuario", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Haga clic en el enlace del correo electrónico y luego continúe.", "@pleaseClickOnLink": { "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Por favor, ingrese un identificador Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Por favor, introduzca su clave de seguridad:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Por favor ingrese su contraseña", "@pleaseEnterYourPassword": { "type": "text", @@ -1240,11 +936,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Grupos públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Salas públicas", "@publicRooms": { "type": "text", @@ -1306,11 +997,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Eliminar mensaje", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Mostrar el contenido con mensajes enriquecidos", "@renderRichContent": { "type": "text", @@ -1326,16 +1012,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Solicitar poder leer mensajes antiguos", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revocar todos los permisos", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "La sala ha subido de categoría", "@roomHasBeenUpgraded": { "type": "text", @@ -1346,26 +1022,6 @@ "type": "text", "placeholders": {} }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Buscar un chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Clave de seguridad", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "¿Perdiste tu llave de seguridad?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Visto por {username}", "@seenByUser": { "type": "text", @@ -1373,22 +1029,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Visto por {username} y {count} más}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto por {username} y {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Enviar", "@send": { "type": "text", @@ -1404,11 +1044,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Permite el envió de informes de errores con sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Enviar un archivo", "@sendFile": { "type": "text", @@ -1471,31 +1106,11 @@ "senderName": {} } }, - "sentryInfo": "Información sobre tu privacidad: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "La sesión está verificada", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Establecer una foto de perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Fijar alias principal", "@setAsCanonicalAlias": { "type": "text", "placeholders": {} }, - "setGroupDescription": "Establecer descripción del grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Establecer enlace de invitación", "@setInvitationLink": { "type": "text", @@ -1528,11 +1143,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Registrarse", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Omitir", "@skip": { "type": "text", @@ -1550,11 +1160,6 @@ "senderName": {} } }, - "startYourFirstChat": "¡Inicie su primer chat ahora mismo! 🙂\n- Toque el botón de \"Nueva conversación\"\n- Escaneé el código QR de un amigo \n- Diviértanse chateando", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "¿Cómo estás hoy?", "@statusExampleMessage": { "type": "text", @@ -1565,26 +1170,11 @@ "type": "text", "placeholders": {} }, - "sunday": "Domingo", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Sistema", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Toque en otro dispositivo para verificar", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toca para mostrar el menú", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "No coinciden", "@theyDontMatch": { "type": "text", @@ -1595,26 +1185,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Esta sala ha sido archivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Jueves", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1631,11 +1201,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Martes", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Indisponible", "@unavailable": { "type": "text", @@ -1671,11 +1236,6 @@ "type": {} } }, - "unknownSessionVerify": "Sesión desconocida, por favor verifíquela", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Dejar de silenciar el chat", "@unmuteChat": { "type": "text", @@ -1693,18 +1253,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 mensaje no leído} other{{unreadEvents} mensajes no leídos}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "¿Usar colores compatibles con AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} y {count} más están escribiendo…", "@userAndOthersAreTyping": { "type": "text", @@ -1753,21 +1301,11 @@ "type": "text", "placeholders": {} }, - "verifiedSession": "¡Sesión verificada exitosamente!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verificar", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verificar manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Comenzar verificación", "@verifyStart": { "type": "text", @@ -1783,11 +1321,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verificar usuario", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Video llamada", "@videoCall": { "type": "text", @@ -1828,7 +1361,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Fondo de pantalla", + "wallpaper": "Fondo de pantalla:", "@wallpaper": { "type": "text", "placeholders": {} @@ -1838,21 +1371,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "¡El cifrado de extremo a extremo está actualmente en período de prueba! ¡Úselo bajo su propio riesgo!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Miércoles", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bienvenidos al mensajero instantáneo más lindo de la red de Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Te enviamos un correo electrónico", "@weSentYouAnEmail": { "type": "text", @@ -1878,48 +1396,16 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Estás invitado a este chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Ya no estás participando en este chat", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "No puedes invitarte a tí mismo", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Has sido vetado de este chat", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Tu nombre de usuario", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Serás conectado a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Acercar zoom", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Alejar zoom", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Reproducir emoticonos y stickers animados automáticamente", "@autoplayImages": { "type": "text", @@ -1939,11 +1425,6 @@ "uri": {} } }, - "addNewFriend": "Agregar nuevo amigo", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "all": "Todo", "@all": { "type": "text", @@ -1954,16 +1435,6 @@ "type": "text", "placeholders": {} }, - "audioPlayerPause": "Pausa", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Encender", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, "botMessages": "Mensajes de bot", "@botMessages": { "type": "text", @@ -2014,26 +1485,11 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "El usuario no está verificado", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "El usuario está verificado", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "He hecho clic en el enlace", "@iHaveClickedOnLink": { "type": "text", "placeholders": {} }, - "clearText": "Borrar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, "directChats": "Chat directo", "@directChats": { "type": "text", @@ -2080,11 +1536,6 @@ }, "chatHasBeenAddedToThisSpace": "El chat se ha agregado a este espacio", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "El chat se ha eliminado de este espacio", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "commandInvalid": "Comando inválido", "@commandInvalid": { "type": "text" @@ -2094,13 +1545,6 @@ "type": "text", "placeholders": {} }, - "loginWith": "Iniciar sesión con {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "security": "Seguridad", "@security": { "type": "text", @@ -2111,11 +1555,6 @@ "type": "text", "placeholders": {} }, - "publicKey": "Clave pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "editBlockedServers": "Editar servidores bloqueado", "@editBlockedServers": { "type": "text", @@ -2126,11 +1565,6 @@ "type": "text", "placeholders": {} }, - "noDescription": "Sin descripción", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noConnectionToTheServer": "Sin conexión al servidor", "@noConnectionToTheServer": { "type": "text", @@ -2156,11 +1590,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Sonido, vibración LED de color", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Cambios de miembros", "@memberChanges": { "type": "text", @@ -2181,8 +1610,6 @@ "type": "text", "placeholders": {} }, - "enterASpacepName": "Ingrese nombre de espacio", - "@enterASpacepName": {}, "ignore": "Ignorar", "@ignore": { "type": "text", @@ -2230,13 +1657,6 @@ "type": "text", "placeholders": {} }, - "savedFileAs": "Archivo guardado como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "search": "Buscar", "@search": { "type": "text", @@ -2247,7 +1667,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Nivel de permiso predeterminado", + "defaultPermissionLevel": "Nivel de permiso predeterminado para nuevo usuarios", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2291,11 +1711,6 @@ "type": "text", "placeholders": {} }, - "saveFileToFolder": "Guardar archivo en esta carpeta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "commandHint_send": "Enviar texto", "@commandHint_send": { "type": "text", @@ -2311,11 +1726,6 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "Cancelar y no volver a preguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "oopsPushError": "¡UPS¡ Desafortunadamente, se produjo un error al configurar las notificaciones push.", "@oopsPushError": { "type": "text", @@ -2326,21 +1736,11 @@ "type": "text", "placeholders": {} }, - "discoverGroups": "Descubrir grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "enableEncryption": "Habilitar la encriptación", "@enableEncryption": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Tus chats se están sincronizando…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, "messages": "Mensajes", "@messages": { "type": "text", @@ -2369,34 +1769,8 @@ }, "description": "State that {command} is not a valid /command." }, - "discover": "Descubrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Editar permisos de chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "friends": "Amigos", - "@friends": { - "type": "text", - "placeholders": {} - }, - "createNewChatExplaination": "Simplemente escaneé el código QR o comparta su enlace de invitación si no están uno al lado del otro.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Compartir tu enlace de invitación", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Escriba el enlace de invitación manualmente...", - "@typeInInviteLinkManually": {}, "scanQrCode": "Escanear código QR", "@scanQrCode": {}, - "unlockChatBackup": "Desbloquear la copia de seguridad del chat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "homeserver": "Homeserver", "@homeserver": {}, "newChat": "Nuevo chat", @@ -2404,11 +1778,6 @@ "type": "text", "placeholders": {} }, - "publicSpace": "Espacio público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "commandHint_join": "Únete a la sala indicada", "@commandHint_join": { "type": "text", @@ -2476,11 +1845,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Habilitar la copia de seguridad del chat para no perder nunca el acceso a su chats.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "Editar avatar de sala", "@editRoomAvatar": { "type": "text", @@ -2509,20 +1873,6 @@ "server2": {} } }, - "invalidEmail": "Correo inválido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "Para poder recuperar su contraseña más tarde, debe agregar una dirección de correo electrónico", - "@newPasswordDescription": {}, - "newUsernameDescription": "Su ID de usuario tendrá el formato @username:servername", - "@newUsernameDescription": {}, - "noStatusesFound": "Hasta ahora no se han encontrado estados.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "openInMaps": "Abrir en maps", "@openInMaps": { "type": "text", @@ -2564,11 +1914,6 @@ "type": "text", "placeholders": {} }, - "tapToShowImage": "Toque para mostrar la imagen", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, "toggleFavorite": "Alternar favorito", "@toggleFavorite": { "type": "text", @@ -2579,11 +1924,6 @@ "type": "text", "placeholders": {} }, - "userUnknownVerification": "El usuario tiene un estado de verificación desconocido", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, "whoCanPerformWhichAction": "Quién puede realizar qué acción", "@whoCanPerformWhichAction": { "type": "text", @@ -2599,25 +1939,15 @@ "type": "text", "placeholders": {} }, - "iWroteDownTheKey": "He escrito la clave", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Se ha configurado la copia de respaldo del chat.", "@yourChatBackupHasBeenSetUp": {}, "unverified": "No verificado", "@unverified": {}, - "setupChatBackupDescription": "Para proteger sus mensajes, hemos generado una clave de seguridad.\nConsérvela en un sitio seguro, como un gestor de contraseñas.", - "@setupChatBackupDescription": {}, - "yourUserId": "Su id. de usuario:", - "@yourUserId": {}, - "setupChatBackup": "Configurar copia de respaldo de chat", - "@setupChatBackup": {}, "commandHint_clearcache": "Limpiar cache", "@commandHint_clearcache": { "type": "text", "description": "Usage hint for the command /clearcache" }, - "loginWithOneClick": "Iniciar sesión con un click", - "@loginWithOneClick": {}, "messageInfo": "Información del mensaje", "@messageInfo": {}, "time": "Tiempo", @@ -2627,19 +1957,8 @@ "type": "text", "placeholders": {} }, - "passwordsDoNotMatch": "¡Las contraseñas no coinciden!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Por favor ingrese un correo electrónico válido.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Repetir la contraseña", + "repeatPassword": "Repita la contraseña", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Por favor elegir al menos {min} carácteres", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "removeFromSpace": "Eliminar del espacio", "@removeFromSpace": {}, "addToSpaceDescription": "Elige un espacio para añadir este chat a el.", @@ -2648,14 +1967,6 @@ "@openGallery": {}, "start": "Iniciar", "@start": {}, - "saveTheSecurityKeyNow": "Guardar la clave de seguridad ahora", - "@saveTheSecurityKeyNow": {}, - "replyHasBeenSent": "La respuesta se ha enviado", - "@replyHasBeenSent": {}, - "whatIsGoingOn": "¿Qué está pasando?", - "@whatIsGoingOn": {}, - "addDescription": "Añadir descripción", - "@addDescription": {}, "commandHint_discardsession": "Descartar sesión", "@commandHint_discardsession": { "type": "text", @@ -2670,8 +1981,400 @@ "size": {} } }, - "pleaseEnterSecurityKeyDescription": "Para desbloquear el respaldo de tu chat, por favor ingresa tu clave de seguridad que ha sido generada en una sesión previa. Tu clave de seguridad NO es tu contraseña.", - "@pleaseEnterSecurityKeyDescription": {}, "publish": "Publicar", - "@publish": {} + "@publish": {}, + "newSpace": "Nuevo espacio", + "@newSpace": {}, + "allSpaces": "Todos los espacios", + "@allSpaces": {}, + "widgetUrlError": "Esta no es una URL válida.", + "@widgetUrlError": {}, + "commandHint_markasgroup": "Marcar como grupo", + "@commandHint_markasgroup": {}, + "nextAccount": "Siguiente cuenta", + "@nextAccount": {}, + "youRejectedTheInvitation": "Rechazaste la invitación", + "@youRejectedTheInvitation": {}, + "newGroup": "Nuevo grupo", + "@newGroup": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "previousAccount": "Cuenta anterior", + "@previousAccount": {}, + "users": "Usuarios", + "@users": {}, + "youInvitedBy": "📩 Has sido invitado por {user}", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youAcceptedTheInvitation": "👍 Aceptaste la invitación", + "@youAcceptedTheInvitation": {}, + "widgetEtherpad": "Nota de texto", + "@widgetEtherpad": {}, + "commandHint_cuddle": "Mandar una carantoña", + "@commandHint_cuddle": {}, + "supposedMxid": "Esto debería ser {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "importFromZipFile": "Importar de un archivo .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Exportar paquete de emotes como .zip", + "@exportEmotePack": {}, + "addChatDescription": "Añadir una descripción del chat", + "@addChatDescription": {}, + "sendTypingNotifications": "Enviar notificaciones \"está escribiendo\"", + "@sendTypingNotifications": {}, + "importEmojis": "Importar emojis", + "@importEmojis": {}, + "confirmMatrixId": "Por favor confirma tu Matrix ID para borrar tu cuenta.", + "@confirmMatrixId": {}, + "notAnImage": "El archivo no es una imagen.", + "@notAnImage": {}, + "commandHint_hug": "Mandar un abrazo", + "@commandHint_hug": {}, + "importNow": "Importar ahora", + "@importNow": {}, + "hugContent": "{senderName} te abraza", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "otherCallingPermissions": "Micrófono, cámara y otros permisos de FluffyChat", + "@otherCallingPermissions": {}, + "emailOrUsername": "Correo electrónico o nombre de usuario", + "@emailOrUsername": {}, + "countFiles": "{count} archivos", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "reportUser": "Reportar usuario", + "@reportUser": {}, + "voiceCall": "Llamada de voz", + "@voiceCall": {}, + "reactedWith": "{sender} reaccionó con {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "markAsRead": "Marcar como leído", + "@markAsRead": {}, + "widgetName": "Nombre", + "@widgetName": {}, + "replace": "Reemplazar", + "@replace": {}, + "unsupportedAndroidVersionLong": "Esta característica requiere una versión más reciente de Android. Por favor, compruebe las actualizaciones o la compatibilidad de LineageOS.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Almacenar de forma segura en este dispositivo", + "@storeSecurlyOnThisDevice": {}, + "openChat": "Abrir chat", + "@openChat": {}, + "screenSharingDetail": "Usted está compartiendo su pantalla en FluffyChat", + "@screenSharingDetail": {}, + "allRooms": "Todos los chats grupales", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "widgetVideo": "Vídeo", + "@widgetVideo": {}, + "dismiss": "Descartar", + "@dismiss": {}, + "unsupportedAndroidVersion": "Versión de Android no compatible", + "@unsupportedAndroidVersion": {}, + "indexedDbErrorLong": "El almacenamiento de mensajes, por desgracia, no está habilitado en el modo privado por defecto.\nPor favor, visite\n - about:config\n - Establezca dom.indexedDB.privateBrowsing.enabled a true\nDe otra forma, no es posible usar FluffyChat.", + "@indexedDbErrorLong": {}, + "startFirstChat": "Comience su primer chat", + "@startFirstChat": {}, + "commandHint_create": "Crear un chat grupal vacío\nUse --no-encryption para deshabilitar el cifrado", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "user": "Usuario", + "@user": {}, + "separateChatTypes": "Separar chats directos de grupos", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "tryAgain": "Inténtelo de nuevo", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Usted expulsó y prohibió el acceso a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "messagesStyle": "Mensajes:", + "@messagesStyle": {}, + "chatDescription": "Descripción del chat", + "@chatDescription": {}, + "callingAccountDetails": "Permite a FluffyChat utilizar la aplicación de llamadas nativa de Android.", + "@callingAccountDetails": {}, + "enterSpace": "Unirse al espacio", + "@enterSpace": {}, + "pleaseEnterRecoveryKey": "Por favor, introduzca su clave de recuperación:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "Por favor, introduzca un nombre a mostrar.", + "@widgetNameError": {}, + "addWidget": "Añadir widget", + "@addWidget": {}, + "hydrateTor": "TOR: Importar sesión exportada", + "@hydrateTor": {}, + "storeInAppleKeyChain": "Almacenar en la KeyChain de Apple", + "@storeInAppleKeyChain": {}, + "hydrate": "Restaurar desde fichero de copia de seguridad", + "@hydrate": {}, + "invalidServerName": "Nombre del servidor no válido", + "@invalidServerName": {}, + "chatPermissions": "Permisos del chat", + "@chatPermissions": {}, + "sender": "Remitente", + "@sender": {}, + "storeInAndroidKeystore": "Almacenar en la KeyStore de Android", + "@storeInAndroidKeystore": {}, + "saveKeyManuallyDescription": "Compartir esta clave manualmente usando el diálogo de compartir del sistema o el portapapeles.", + "@saveKeyManuallyDescription": {}, + "whyIsThisMessageEncrypted": "¿Por qué no se puede leer este mensaje?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Establecer descripción del chat", + "@setChatDescription": {}, + "dehydrateWarning": "Esta acción no se puede deshacer. Asegúrese de que ha almacenado de forma segura el fichero de copia de seguridad.", + "@dehydrateWarning": {}, + "redactedBy": "Censurado por {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "videoCallsBetaWarning": "Tenga en cuenta que las videollamadas están actualmente en fase beta. Es posible que no funcionen como se espera o que no funcionen de ninguna manera en algunas plataformas.", + "@videoCallsBetaWarning": {}, + "callingPermissions": "Permisos de llamadas", + "@callingPermissions": {}, + "unlockOldMessages": "Desbloquear mensajes viejos", + "@unlockOldMessages": {}, + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "optionalRedactReason": "(Opcional) Motivo para censurar este mensaje...", + "@optionalRedactReason": {}, + "dehydrate": "Exportar sesión y limpiar dispositivo", + "@dehydrate": {}, + "switchToAccount": "Cambiar a la cuenta {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "experimentalVideoCalls": "Videollamadas experimentales", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "Para desbloquear sus viejos mensajes, introduzca su clave de recuperación que se generó en una sesión anterior. Su clave de recuperación NO es su contraseña.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "¿Quieres invitar a {contact} al chat {groupName}?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Censurado por {username} porque: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "Usted retiró la invitación a {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "enterRoom": "Unirse a la sala", + "@enterRoom": {}, + "confirmEventUnpin": "¿Seguro que quiere desfijar permanentemente el evento?", + "@confirmEventUnpin": {}, + "youInvitedUser": "📩 Usted invitó a {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "redactMessageDescription": "El mensaje será censurado para todas las personas participantes en la conversación. Esto no se puede deshacer.", + "@redactMessageDescription": {}, + "recoveryKey": "Clave de recuperación", + "@recoveryKey": {}, + "dehydrateTorLong": "Si está usando TOR, es recomendable exportar la sesión antes de cerrar la ventana.", + "@dehydrateTorLong": {}, + "doNotShowAgain": "No mostrar de nuevo", + "@doNotShowAgain": {}, + "hideUnimportantStateEvents": "Ocultar eventos de estado no importantes", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "Compartir la pantalla", + "@screenSharingTitle": {}, + "widgetCustom": "Personalizado", + "@widgetCustom": {}, + "youBannedUser": "Usted prohibió el acceso a {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "directChat": "Chat directo", + "@directChat": {}, + "appearOnTop": "Aparecer en la cima", + "@appearOnTop": {}, + "foregroundServiceRunning": "Esta notificación aparece cuando el servicio en segundo plano se está ejecutando.", + "@foregroundServiceRunning": {}, + "wasDirectChatDisplayName": "Chat vacío (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "No se ha creado una descripción del chat aún.", + "@noChatDescriptionYet": {}, + "chatDescriptionHasBeenChanged": "Se ha cambiado la descripción del chat", + "@chatDescriptionHasBeenChanged": {}, + "dehydrateTor": "TOR: Exportar sesión", + "@dehydrateTor": {}, + "youKicked": "👞 Usted expulsó a {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "shareInviteLink": "Compartir enlace de invitación", + "@shareInviteLink": {}, + "commandHint_markasdm": "Marcar como sala de mensajes directos para el ID de Matrix", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "¿Perdió su clave de recuperación?", + "@recoveryKeyLost": {}, + "emoteKeyboardNoRecents": "Los emotes usados recientemente aparecerán aquí...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "youJoinedTheChat": "Usted se ha unido al chat", + "@youJoinedTheChat": {}, + "errorAddingWidget": "Fallo al añadir el widget.", + "@errorAddingWidget": {}, + "commandHint_dm": "Iniciar un chat directo\nUse --no-encryption para deshabilitar el cifrado", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "youUnbannedUser": "Usted volvió a permitir el acceso a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "emojis": "Emojis", + "@emojis": {}, + "createGroup": "Crear grupo", + "@createGroup": {}, + "hydrateTorLong": "¿Exportó su sesión la última vez que estuvo en TOR? Impórtela rápidamente y continúe chateando.", + "@hydrateTorLong": {}, + "custom": "Personalizado", + "@custom": {}, + "storeInSecureStorageDescription": "Almacenar la clave de recuperación en el almacenamiento seguro de este dispositivo.", + "@storeInSecureStorageDescription": {}, + "pinMessage": "Anclar a la sala", + "@pinMessage": {}, + "indexedDbErrorTitle": "Problemas con el modo privado", + "@indexedDbErrorTitle": {}, + "googlyEyesContent": "{senderName} te manda ojos saltones", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} se acurruca contigo", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "Enviar unos ojos saltones", + "@commandHint_googly": {}, + "noChatsFoundHere": "No se han encontrado chats. Inicia un nuevo chat usando el botón de abajo. ⤵️", + "@noChatsFoundHere": {}, + "joinedChats": "Chats Unidos", + "@joinedChats": {}, + "space": "Espacio", + "@space": {}, + "spaces": "Espacios", + "@spaces": {}, + "block": "Bloquear", + "@block": {}, + "blockListDescription": "Puedes bloquear usuarios que te estén molestando. No podrás recibir mensajes ni invitaciones de chat de los usuarios de tu lista de bloqueo.", + "@blockListDescription": {}, + "aboutHomeserver": "Acerca de {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "unread": "No leídos", + "@unread": {}, + "swipeRightToLeftToReply": "Desliza a la izquierda para responder", + "@swipeRightToLeftToReply": {}, + "hideRedactedMessagesBody": "Si alguien elimina un mensaje, este mensaje ya no será visible en el chat.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Esconde formatos de mensajes inválidos o desconocidos", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideRedactedMessages": "Esconde mensajes eliminados", + "@hideRedactedMessages": {}, + "appLockDescription": "Bloquear la aplicación cuando no se use con código pin", + "@appLockDescription": {}, + "alwaysUse24HourFormat": "Falso", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "accessAndVisibility": "Acceso y visibilidad", + "@accessAndVisibility": {}, + "globalChatId": "ID de chat Global", + "@globalChatId": {}, + "accessAndVisibilityDescription": "A quién se le permite unirse a este chat y cómo se puede descubrir el chat.", + "@accessAndVisibilityDescription": {}, + "calls": "Llamadas", + "@calls": {}, + "customEmojisAndStickers": "Emojis y stickers personalizados", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Agrega o comparte emojis y stickers personalizados que se pueden utilizar en cualquier chat.", + "@customEmojisAndStickersBody": {}, + "blockedUsers": "Usuarios bloqueados", + "@blockedUsers": {}, + "blockUsername": "Ignorar nombre de usuario", + "@blockUsername": {}, + "noMoreChatsFound": "No se encontraron más chats...", + "@noMoreChatsFound": {}, + "countChatsAndCountParticipants": "{chats} chats y {participants} participantes", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + } } diff --git a/assets/l10n/intl_et.arb b/assets/l10n/intl_et.arb index ca3ba6899b..92eb1839ee 100644 --- a/assets/l10n/intl_et.arb +++ b/assets/l10n/intl_et.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} võttis kutse vastu", + "acceptedTheInvitation": "👍 {username} võttis kutse vastu", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Kasutajakonto teave", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} võttis kasutusele läbiva krüptimise", + "activatedEndToEndEncryption": "🔐{username} võttis kasutusele läbiva krüptimise", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Lisa vestlusrühma kirjeldus", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Lisa uus sõber", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Peakasutaja", "@admin": { "type": "text", @@ -70,11 +55,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Sul juba on kasutajakonto olemas?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} vastas kõnele", "@answeredTheCall": { "type": "text", @@ -97,11 +77,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arhiveeritud jututuba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Kas külalised võivad liituda", "@areGuestsAllowedToJoin": { "type": "text", @@ -117,21 +92,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Krüptovõtmete puhverdamiseks palun sisesta oma turvahoidla paroolifraas või taastevõti.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla paroolifraas või taastevõti.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Oma sessiooni verifitseerimiseks palun sisesta oma turvahoidla paroolifraas või taastevõti.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Kas võtad vastu selle verifitseerimispalve kasutajalt {username}?", "@askVerificationRequest": { "type": "text", @@ -139,31 +104,11 @@ "username": {} } }, - "audioPlayerPause": "Peata", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Esita", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentimine", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Esita liikuvad kleepse ja emotikone automaatselt", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Tunnuspilt on muutunud", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "See koduserver toetab Matrixi võrku sisselogimiseks:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi võimalusi:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -213,11 +158,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Puhverdatud krüptovõtmed", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Katkesta", "@cancel": { "type": "text", @@ -339,21 +279,11 @@ "username": {} } }, - "changelog": "Muudatuste logi", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Muuda salasõna", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Salvestasin muudatused", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Muuda koduserverit", "@changeTheHomeserver": { "type": "text", @@ -369,16 +299,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Muuda serverit", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Muuda taustapilti", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Muuda oma tunnuspilti", "@changeYourAvatar": { "type": "text", @@ -419,18 +339,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Vali kasutajanimi", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Kustuta arhiiv", "@clearArchive": {}, - "clearText": "Kustuta tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Sulge", "@close": { "type": "text", @@ -518,12 +428,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Võrdle ja kontrolli, et emotikonid on teises seadmes täpselt samad:", + "compareEmojiMatch": "Palun võrdle emotikone", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Võrdle ja kontrolli, et järgnevad numbrid on teises seadmes täpselt samad:", + "compareNumbersMatch": "Palun võrdle numbreid", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -543,11 +453,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Ühenduse loomise katse ebaõnnestus", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma vestlusrühma", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -568,11 +473,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Sisukuvaja", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Kopeerisin lõikelauale", "@copiedToClipboard": { "type": "text", @@ -595,16 +495,6 @@ "error": {} } }, - "couldNotSetAvatar": "Tunnuspildi seadmine ei õnnestunud", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kuvatava nime määramine ei õnnestunud", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} osalejat", "@countParticipants": { "type": "text", @@ -617,38 +507,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Tee nüüd kasutajakonto", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} algatas vestluse", + "createdTheChat": "💬 {username} algatas vestluse", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Loo uus vestlusrühm", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Uus kogukond", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Risttunnustamine ei ole kasutusel", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Risttunnustamine on kasutusel", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Hetkel aktiivne", "@currentlyActive": { "type": "text", @@ -689,7 +559,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Vaikimisi õigused", + "defaultPermissionLevel": "Vaikimisi õigused uutele kasutajatele", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -709,11 +579,6 @@ "type": "text", "placeholders": {} }, - "deny": "Keela", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Seade", "@device": { "type": "text", @@ -729,46 +594,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Krüptimisel on mõte vaid siis, kui ka kõik vestlusega seotud seadmed on verifitseeritud.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Otsevestlused", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Emalda pilt", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Avasta", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Otsi vestlusrühmi", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Kuvatav nimi on muudetud", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Toeta", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Katkesta ja ära küsi enam uuesti", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Laadi fail alla", "@downloadFile": { "type": "text", @@ -784,21 +619,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Muuda vestluse õigusi", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Muuda kuvatavat nime", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Muuda Jitsi liidestust", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Muuda jututoa aliast", "@editRoomAliases": { "type": "text", @@ -844,11 +669,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Selleks, et sa ei kaotaks ligipääsu oma vestlustele, palun võta kasutusele vestluste varundamine.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Võta emotsioonitegevuste pakid läbivalt kasutusele", "@enableEmotesGlobally": { "type": "text", @@ -874,21 +694,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Krüptoalgoritm", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Krüptimine ei ole kasutusel", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Läbiva krüptimise seadistused", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} lõpetas kõne", "@endedTheCall": { "type": "text", @@ -896,23 +706,11 @@ "senderName": {} } }, - "enterAGroupName": "Sisesta vestlusrühma nimi", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Sisesta e-posti aadress", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Sisesta kogukonna nimi", - "@enterASpacepName": {}, - "enterAUsername": "Sisesta kasutajanimi", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Sisesta oma koduserveri aadress", "@enterYourHomeserver": { "type": "text", @@ -940,11 +738,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Faili suurus", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -960,16 +753,6 @@ "type": "text", "placeholders": {} }, - "friday": "Reede", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Sõbrad", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Alates liitumise hetkest", "@fromJoining": { "type": "text", @@ -990,16 +773,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Vestlusrühma kirjeldus", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Vestlusrühma kirjeldus on muutunud", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Vestlusrühm on avalik", "@groupIsPublic": { "type": "text", @@ -1050,11 +823,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Koduserver ei ole ühilduv", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Kui solvav see sisu on?", "@howOffensiveIsThisContent": { "type": "text", @@ -1080,16 +848,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Sul on võimalik eirata neid kasutajaid, kes sind segavad. Oma isiklikku eiramisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Eira kasutajanime", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Ma olen klõpsinud saadetud linki", "@iHaveClickedOnLink": { "type": "text", @@ -1105,11 +863,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Vigane e-posti aadress", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Kutsu sõpru ja tuttavaid", "@inviteContact": { "type": "text", @@ -1127,7 +880,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} kutsus kasutajaks {targetName}", + "invitedUser": "📩 {username} saatis kutse kasutajale {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1145,7 +898,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} kutsus sind kasutama Matrix'i-põhist suhtlusrakendust FluffyChat. \n1. Paigalda FluffyChat: https://fluffychat.im \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix'i kasutajakontoga\n3. Ava kutse link: {link}", + "inviteText": "{username} kutsus sind kasutama Matrix'i-põhist suhtlusrakendust FluffyChat. \n1. Ava fluffychat.im ja paigalda FluffyChat'i rakendus \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix'i kasutajakontoga\n3. Ava kutse link: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1153,17 +906,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Kas järgnev seadmevõti on õige?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "kirjutab…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} liitus vestlusega", + "joinedTheChat": "👋 {username} liitus vestlusega", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1175,17 +923,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Krüptovõtmed on puhverdatud", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Krüptovõtmed on puudu", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} müksas kasutaja {targetName} välja", + "kicked": "👞 {username} müksas kasutaja {targetName} välja", "@kicked": { "type": "text", "placeholders": { @@ -1193,7 +931,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} müksas kasutaja {targetName} välja ning seadis talle suhtluskeelu", + "kickedAndBanned": "🙅{username} müksas kasutaja {targetName} välja ning seadis talle suhtluskeelu", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1213,16 +951,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Viimati nähtud IP-aadress", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Nähtud ammu aega tagasi", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Lahku", "@leave": { "type": "text", @@ -1282,33 +1010,11 @@ "homeserver": {} } }, - "loginWith": "Logi sisse {brand} abil", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Logi välja", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Määra moderaatoriks", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Määra peakasutajaks", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Kontrolli, et see tunnus oleks õige", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Muudatused liikmeskonnas", "@memberChanges": { "type": "text", @@ -1324,28 +1030,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Sõnum eemaldatakse kõikidelt kasutajatelt", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderaator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Esmaspäev", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Veel 1 sündmus} other{Veel {count} sündmust}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Summuta vestlus", "@muteChat": { "type": "text", @@ -1361,7 +1050,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Uus sõnum FluffyChat'i vahendusel", + "newMessageInFluffyChat": "💬 Uus sõnum FluffyChat'i vahendusel", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1386,16 +1075,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat ei toeta hetkel risttunnustamist. Palun võta ta kasutusele Element'i vahendusel.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Kirjeldus puudub", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Ühtegi emotsioonitegevust ei leidunud. 😕", "@noEmotesFound": { "type": "text", @@ -1406,7 +1085,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Tundub, et sinu nutiseadmes pole Google teenuseid. Sinu privaatsuse mõttes on see kindlasti hea otsus! Kui sa soovid FluffyChat'is näha tõuketeavitusi, siis soovitame, et selle jaoks kasutad https://microg.org või https://unifiedpush.org liidestust.", + "noGoogleServicesWarning": "Tundub, et sinu nutiseadmes pole Firebase Cloud Messaging teenuseid. Sinu privaatsuse mõttes on see kindlasti hea otsus! Kui sa soovid FluffyChatis näha tõuketeavitusi, siis soovitame, et selle jaoks kasutad ntfy liidestust. Kasutades ntfyd või mõnda muud Unified Push standardil põhinevat liidestust saad tõuketeavitusi turvalisel moel. Ntfy rakendus on saadaval nii PlayStore kui F-Droidi rakendusepoodides.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1419,11 +1098,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Palun võta krüptovõtmete võrgupõhine varundus kasutusele vestusrakenduse Element vahendusel.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Mitte midagi", "@none": { "type": "text", @@ -1439,21 +1113,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Avalikke jututubasid ei leidunud…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Jututubasid ei leidunud…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Pole veel ühtegi olekut leidnud.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Teavitused", "@notifications": { "type": "text", @@ -1464,18 +1128,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "See funktsionaalsus ei ole veebiliideses toetatud", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} valitud", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} kasutajat kirjutavad…", "@numUsersTyping": { "type": "text", @@ -1498,7 +1150,7 @@ "type": "text", "placeholders": {} }, - "ok": "sobib", + "ok": "Sobib", "@ok": { "type": "text", "placeholders": {} @@ -1508,11 +1160,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Krüptovõtmete veebipõhine varundus ei ole kasutusel", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Krüptovõtmete veebipõhine varundus on kasutusel", "@onlineKeyBackupEnabled": { "type": "text", @@ -1533,7 +1180,7 @@ "type": "text", "placeholders": {} }, - "openCamera": "Ava kaamera", + "openCamera": "Pildista", "@openCamera": { "type": "text", "placeholders": {} @@ -1543,16 +1190,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "Sinu e-posti aadress (kui soovid lisada)", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Kui soovid) Vestlusrühma nimi", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "või", "@or": { "type": "text", @@ -1563,11 +1200,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Kaasatud kasutajate seadmed", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "paroolifraas või taastevõti", "@passphraseOrKey": { "type": "text", @@ -1625,11 +1257,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Palun vali kasutajanimi", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Jätkamiseks palun klõpsi sulle saadetud e-kirjas leiduvat linki.", "@pleaseClickOnLink": { "type": "text", @@ -1640,16 +1267,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Palun sisesta Matrix'i kasutajatunnus.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Palun sisesta oma turvavõti:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Palun sisesta oma salasõna", "@pleaseEnterYourPassword": { "type": "text", @@ -1675,26 +1292,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Avalikud vestlusrühmad", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Avalik võti", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Avalikud jututoad", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Avalik kogukond", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Tõukereeglid", "@pushRules": { "type": "text", @@ -1771,11 +1373,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Eemalda sõnum", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Kustuta oma tunnuspilt", "@removeYourAvatar": { "type": "text", @@ -1806,16 +1403,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Palu õigust lugeda vanu sõnumeid", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Tühista kõik õigused", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Jututoa vesrioon on uuendatud", "@roomHasBeenUpgraded": { "type": "text", @@ -1826,53 +1413,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Laupäev", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Salvestasin faili nimega {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Salvesta fail", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Salvesta fail sellesse kausta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Otsi", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Otsi vestlust", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Turvalisus", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Turvavõti", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Kas kaotasid turvavõtme?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Sõnumit nägi {username}", "@seenByUser": { "type": "text", @@ -1880,22 +1435,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Sõnumit nägid {username} ja veel {count} kasutajat}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Sõnumit nägid {username} ja {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Saada", "@send": { "type": "text", @@ -1915,11 +1454,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Luba veateadete saatmist sentry.io vahendusel", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Saada fail", "@sendFile": { "type": "text", @@ -1950,35 +1484,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} saatis faili", + "sentAFile": "📁 {username} saatis faili", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} saatis helifaili", + "sentAnAudio": "🎤 {username} saatis helifaili", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} saatis pildi", + "sentAPicture": "🖼️ {username} saatis pildi", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} saatis kleepsu", + "sentASticker": "😊 {username} saatis kleepsu", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} saatis video", + "sentAVideo": "🎥 {username} saatis video", "@sentAVideo": { "type": "text", "placeholders": { @@ -1992,21 +1526,6 @@ "senderName": {} } }, - "sentryInfo": "Teave sinu privaatsuse kohta: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessioon on verifitseeritud", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Seadista profiilipilt", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Määra põhinimeks", "@setAsCanonicalAlias": { "type": "text", @@ -2017,11 +1536,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Seadista vestlusrühma kirjeldus", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Tee kutselink", "@setInvitationLink": { "type": "text", @@ -2064,11 +1578,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Liitu", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Ühekordne sisselogimine", "@singlesignon": { "type": "text", @@ -2079,11 +1588,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Heli, värin, LED-värvid", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Lähtekood", "@sourceCode": { "type": "text", @@ -2106,11 +1610,6 @@ "senderName": {} } }, - "startYourFirstChat": "Alusta oma esimest vestlust kohe nüüd 🙂\n- klõpsi nuppu „Uus vestlus“\n- skaneeri teise osapoole QR-koodi\n- ja lase vestlusel kulgeda", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Olek", "@status": { "type": "text", @@ -2126,11 +1625,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Pühapäev", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Sünkroniseerin andmeid… Palun oota.", "@synchronizingPleaseWait": { "type": "text", @@ -2141,21 +1635,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Verifitseerimiseks klõpsi seadme nime", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Pildi vaatamiseks klõpsi", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Menüü kuvamiseks puuduta", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Nad ei klapi omavahel", "@theyDontMatch": { "type": "text", @@ -2166,26 +1645,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "See jututuba on arhiveeritud.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Neljapäev", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2222,11 +1681,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Teisipäev", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Eemal", "@unavailable": { "type": "text", @@ -2262,16 +1716,6 @@ "type": {} } }, - "unknownSessionVerify": "Tundmatu sessioon, palun tee talle verifitseerimine", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Krüpti lahti oma vestluste varukoopia", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Lõpeta vestluse vaigistamine", "@unmuteChat": { "type": "text", @@ -2289,18 +1733,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 lugemata sõnum} other{{unreadEvents} lugemata sõnumit}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Kas kasutame AMOLED-tehnoloogiaga ühilduvaid värve?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} ja {count} muud kirjutavad…", "@userAndOthersAreTyping": { "type": "text", @@ -2324,7 +1756,7 @@ "username": {} } }, - "userLeftTheChat": "{username} lahkus vestlusest", + "userLeftTheChat": "🚪{username} lahkus vestlusest", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2336,11 +1768,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Kasutaja on verifitseerimata", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} saatis {type} sündmuse", "@userSentUnknownEvent": { "type": "text", @@ -2349,36 +1776,16 @@ "type": {} } }, - "userUnknownVerification": "Kasutaja verifitseerimisolek on teadmata", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Kasutaja on verifitseeritud", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Verifitseeritud", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sessiooni verifitseerimine õnnestus!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verifitseeri", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verifitseeri käsitsi", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Alusta verifitseerimist", "@verifyStart": { "type": "text", @@ -2394,11 +1801,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifitseeri kasutajat", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videokõne", "@videoCall": { "type": "text", @@ -2439,7 +1841,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Taustapilt", + "wallpaper": "Taustapilt:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2449,21 +1851,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Läbiv krüptimine on parasjagu beetatestimise faasis! Kasuta seda omal vastutusel!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Kolmapäev", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Tere tulemast kasutama kõige vahvamat sõnumiklienti Matrix'i võrgus.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Me saatsime sulle e-kirja", "@weSentYouAnEmail": { "type": "text", @@ -2509,85 +1896,33 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Sa oled kutsutud osalema selles vestluses", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Sa enam ei osale selles vestluses", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Sa ei saa endale kutset saata", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Sinule on selles vestluses seatud suhtluskeeld", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Sünkroniseerin sinu vestlusi…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Sinu oma kasutajanimi", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Sinu avalik võti", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Sinu ühendus on koduserveriga {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Suumi sisse", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Suumi välja", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Eemaldasime vestluse kogukonnast", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Lisasime vestluse kogukonda", "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Lisa kogukonda", "@addToSpace": {}, "scanQrCode": "Skaneeri QR-koodi", "@scanQrCode": {}, - "typeInInviteLinkManually": "Sisesta kutse link käsitsi...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Jaga oma kutselinki", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Lihtsalt skaneeri QR-koodi või kui te pole kõrvuti, siis jaga kutse linki.", - "@createNewChatExplaination": {}, "sendOnEnter": "Saada sõnum sisestusklahvi vajutusel", "@sendOnEnter": {}, "homeserver": "Koduserver", "@homeserver": {}, "serverRequiresEmail": "See koduserver eeldab registreerimisel kasutatava e-postiaadressi kinnitamist.", "@serverRequiresEmail": {}, - "newUsernameDescription": "Sinu Matrix'i kasutajatunnus saab olema vormingus @kasutajanimi:koduserver", - "@newUsernameDescription": {}, - "newPasswordDescription": "Selleks, et saaksid vajadusel oma salasõna taastada, peaksid hiljem lisama oma kasutajakontole e-posti aadressi.", - "@newPasswordDescription": {}, "enableMultiAccounts": "(KATSELINE) Pruugi selles seadmes mitut Matrix'i kasutajakontot", "@enableMultiAccounts": {}, "bundleName": "Köite nimi", @@ -2604,31 +1939,12 @@ "@oneClientLoggedOut": {}, "link": "Link", "@link": {}, - "setupChatBackup": "Võta kasutusele vestluste varundus", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Panin krüptovõtme kirja", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Sinu vestluste varundus on seadistatud.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Et sinu sõnumid ei oleks võõrastele loetavad, me genereerisime taastamiseks mõeldud krüptovõtme.\nPalun hoia seda turvalises kohas, näiteks salasõnade halduris.", - "@setupChatBackupDescription": {}, - "yourUserId": "Sinu kasutajatunnus:", - "@yourUserId": {}, "unverified": "Verifitseerimata", "@unverified": {}, "repeatPassword": "Korda salasõna", "@repeatPassword": {}, - "pleaseEnterValidEmail": "Palun sisesta kehtiv e-posti aadress.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Salasõnad ei klapi omavahel!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "Palun vali pikkuseks vähemalt {min} tähemärki.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageInfo": "Sõnumi teave", "@messageInfo": {}, "time": "Kellaaeg", @@ -2641,20 +1957,10 @@ "@openGallery": {}, "addToSpaceDescription": "Vali kogukond, kuhu soovid seda vestlust lisada.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Logi sisse ühe klõpsuga", - "@loginWithOneClick": {}, "removeFromSpace": "Eemalda kogukonnast", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Järgnevaga eemaldad antud vestluse sellest kogukonnast. Vestlus on jätkuvalt leitav vaatest „Kõik vestlused“.", - "@removeFromSpaceDescription": {}, "start": "Alusta", "@start": {}, - "setupChatBackupNow": "Seadista oma vestluste varundus", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Salvesta turvavõti nüüd", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Kui soovid vestluste varundust kasutada, siis palun sisesta oma turvavõti, mille me varasemas sessioonis tegime. Turvavõti EI OLE sama kui salasõna.", - "@pleaseEnterSecurityKeyDescription": {}, "commandHint_discardsession": "Loobu sessioonist", "@commandHint_discardsession": { "type": "text", @@ -2675,34 +1981,17 @@ "type": "text", "description": "Usage hint for the command /create" }, - "openVideoCamera": "Video salvestamiseks ava kaamera", + "openVideoCamera": "Tee video", "@openVideoCamera": { "type": "text", "placeholders": {} }, - "addDescription": "Lisa kirjeldus", - "@addDescription": {}, - "iUnderstand": "Ma mõistan", - "@iUnderstand": {}, - "replyHasBeenSent": "Vastus on saadetud", - "@replyHasBeenSent": {}, "markAsRead": "Märgi loetuks", "@markAsRead": {}, - "bubbleSize": "Jutumulli suurus", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "reportUser": "Teata kasutajast", "@reportUser": {}, "openChat": "Ava vestlus", "@openChat": {}, - "editIntegrations": "Muuda vidinaid ja lõiminguid", - "@editIntegrations": {}, - "integrationsNotImplemented": "Vidinate ja lõimingute muutmine pole veel võimalik.", - "@integrationsNotImplemented": {}, - "matrixWidgets": "Matrix'i vidinad", - "@matrixWidgets": {}, "dismiss": "Loobu", "@dismiss": {}, "reactedWith": "{sender} reageeris nii {reaction}", @@ -2723,8 +2012,6 @@ "@voiceCall": {}, "confirmEventUnpin": "Kas sa oled kindel, et tahad klammerdatud sündmuse eemaldada?", "@confirmEventUnpin": {}, - "pinnedEventsError": "Viga klammerdatud sõnumite laadimisel", - "@pinnedEventsError": {}, "pinMessage": "Klammerda sõnum jututuppa", "@pinMessage": {}, "videoCallsBetaWarning": "Palun arvesta, et videokõned on veel beetajärgus. Nad ei pruugi veel toimida kõikidel platvormidel korrektselt.", @@ -2733,17 +2020,15 @@ "@emailOrUsername": {}, "experimentalVideoCalls": "Katselised videokõned", "@experimentalVideoCalls": {}, - "unsupportedAndroidVersionLong": "See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OS'i kasutada.", + "unsupportedAndroidVersionLong": "See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OSi kasutada.", "@unsupportedAndroidVersionLong": {}, "nextAccount": "Järgmine kasutajakonto", "@nextAccount": {}, - "separateChatTypes": "Eraldi vestlused, jututoad ja kogukonnad", + "separateChatTypes": "Eraldi vestlused ja jututoad", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "editWidgets": "Muuda vidinaid", - "@editWidgets": {}, "errorAddingWidget": "Vidina lisamisel tekkis viga.", "@errorAddingWidget": {}, "widgetNameError": "Palun sisesta kuvatav nimi.", @@ -2771,7 +2056,7 @@ "number": {} } }, - "youAcceptedTheInvitation": "Sa võtsid kutse vastu", + "youAcceptedTheInvitation": "👍 Sa võtsid kutse vastu", "@youAcceptedTheInvitation": {}, "youUnbannedUser": "Sa eemaldasid suhtluskeelu kasutajalt {user}", "@youUnbannedUser": { @@ -2793,17 +2078,12 @@ }, "youJoinedTheChat": "Sa liitusid vestlusega", "@youJoinedTheChat": {}, - "youKickedAndBanned": "Sa müksasid välja kasutaja {user} ning seadsid talle suhtluskeelu", + "youKickedAndBanned": "🙅Sa müksasid kasutaja {user} välja ning seadsid talle suhtluskeelu", "@youKickedAndBanned": { "placeholders": { "user": {} } }, - "showDirectChatsInSpaces": "Näita kogukonnasga seotud otsevestlusi", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2811,54 +2091,808 @@ "size": {} } }, - "storyPrivacyWarning": "Palun arvesta, et sinu jutustuste lugejad näevad üksteist ning saavad üksteisega suhelda. Lood ise on loetavad vaid 24 tunni jooksul, kuid mitte miski ei taga, et nad kustutatakse kõikidest seadmetest ja serveritest.", - "@storyPrivacyWarning": {}, - "thisUserHasNotPostedAnythingYet": "See kasutaja pole ühtegi jutustust veel avaldanud", - "@thisUserHasNotPostedAnythingYet": {}, - "storyFrom": "Lugu {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Palun arvesta, et sinu jutustuste lugejad näevad üksteist ning saavad üksteisega suhelda.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Mis toimub?", - "@whatIsGoingOn": {}, "youRejectedTheInvitation": "Sa lükkasid kutse tagasi", "@youRejectedTheInvitation": {}, - "youKicked": "Sa müksasid välja kasutaja {user}", + "youKicked": "👞 Sa müksasid kasutaja {user} välja", "@youKicked": { "placeholders": { "user": {} } }, - "youInvitedUser": "Sa saatsid kutse kasutajale {user}", + "youInvitedUser": "📩 Sa saatsid kutse kasutajale {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youInvitedBy": "{user} saatis sulle kutse", + "youInvitedBy": "📩 {user} saatis sulle kutse", "@youInvitedBy": { "placeholders": { "user": {} } }, - "addToStory": "Lisa jutustusele", - "@addToStory": {}, "publish": "Avalda", "@publish": {}, - "whoCanSeeMyStories": "Kes näeb minu jutustusi?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Loobu jutustuste tellimusest", - "@unsubscribeStories": {}, - "yourStory": "Sinu jutustused", - "@yourStory": {}, - "showSpaces": "Näita kogukondade loendit", - "@showSpaces": {}, - "noEmailWarning": "Palun sisesta korrektne e-posti aadress. Vastasel juhul ei saa te oma salasõna taastada. Kui te seda ei soovi, siis jätkamiseks klõpsige nuppu uuesti.", - "@noEmailWarning": {} + "pleaseEnterRecoveryKey": "Palun sisesta oma taastevõti:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Taastevõti", + "@recoveryKey": {}, + "users": "Kasutajad", + "@users": {}, + "storeInSecureStorageDescription": "Salvesta taastevõti selle seadme turvahoidlas.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Salvesta see krüptovõti kasutades selle süsteemi jagamisvalikuid või lõikelauda.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Vali salvestuskohaks Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Vali salvestuskohaks Apple KeyChain", + "@storeInAppleKeyChain": {}, + "recoveryKeyLost": "Kas taasetvõti on kadunud?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKeyDescription": "Vanade sõnumite lugemiseks palun siseta oma varasemas sessioonis loodud taastevõti. Taastamiseks mõeldud krüptovõti EI OLE sinu salasõna.", + "@pleaseEnterRecoveryKeyDescription": {}, + "storeSecurlyOnThisDevice": "Salvesta turvaliselt selles seadmes", + "@storeSecurlyOnThisDevice": {}, + "unlockOldMessages": "Muuda vanad sõnumid loetavaks", + "@unlockOldMessages": {}, + "countFiles": "{count} faili", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "dehydrate": "Ekspordi sessiooni teave ja kustuta nutiseadmest rakenduse andmed", + "@dehydrate": {}, + "dehydrateTor": "TOR'i kasutajad: Ekspordi sessioon", + "@dehydrateTor": {}, + "hydrateTor": "TOR'i kasutajatele: impordi viimati eksporditud sessiooni andmed", + "@hydrateTor": {}, + "hydrateTorLong": "Kui viimati TOR'i võrku kasutasid, siis kas sa eksportisid oma sessiooni andmed? Kui jah, siis impordi nad mugavasti ja jätka suhtlemist.", + "@hydrateTorLong": {}, + "indexedDbErrorTitle": "Brauseri privaatse akna kasutamisega seotud asjaolud", + "@indexedDbErrorTitle": {}, + "dehydrateWarning": "Seda tegevust ei saa tagasi pöörata. Palun kontrolli, et sa oled varukoopia turvaliselt salvestanud.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "Kui oled TOR'i võrgu kasutaja, siis enne akna sulgemist palun ekspordi viimase sessiooni andmed.", + "@dehydrateTorLong": {}, + "indexedDbErrorLong": "Privaatse akna puhul andmete salvestamine vaikimisi pole kasutusel.\nPalun toimi alljärgnevalt:\n- ava about:config\n- määra dom.indexedDB.privateBrowsing.enabled väärtuseks true\nVastasel juhul sa ei saa FluffyChat'i kasutada.", + "@indexedDbErrorLong": {}, + "hydrate": "Taasta varundatud failist", + "@hydrate": {}, + "user": "Kasutaja", + "@user": {}, + "custom": "Kohandatud", + "@custom": {}, + "confirmMatrixId": "Konto kustutamiseks palun kinnitage oma Matrix'i ID.", + "@confirmMatrixId": {}, + "supposedMxid": "See peaks olema {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasgroup": "Märgi vestlusrühmaks", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "Märgi otsevestusluseks antud Matrixi ID jaoks", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "See võib juhtuda, kui sõnum oli saadetud enne, kui siin seadmes oma kontoga sisse logisid.\n\nSamuti võib juhtuda siis, kui saatja on lugemises selles seadmes blokeerinud või on tekkinud tõrkeid veebiühenduses.\n\nAga mõnes teises seadmes saad seda sõnumit lugeda? Siis sa võid sõnumi sealt üle tõsta. Ava Seadistused -> Seadmed ning kontrolli, et kõik sinu seadmed on omavahel verifitseeritud. Kui avad selle vestluse või jututoa ning mõlemad sessioonid on avatud, siis vajalikud krüptovõtmed saadetakse automaatset.\n\nKas sa soovid vältida krüptovõtmete kadumist väljalogimisel ja seadmete vahetusel? Siis palun kontrolli, et seadistuses on krüptovõtmete varundus sisse lülitatud.", + "@noKeyForThisMessage": {}, + "callingPermissions": "Helistamise õigused", + "@callingPermissions": {}, + "callingAccountDetails": "Võimaldab FluffyChat'il kasutada Androidi helistamisrakendust.", + "@callingAccountDetails": {}, + "appearOnTop": "Luba pealmise rakendusena", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofoni, kaamera ja muud FluffyChat'i õigused", + "@otherCallingPermissions": {}, + "newGroup": "Uus jututuba", + "@newGroup": {}, + "newSpace": "Uus kogukond", + "@newSpace": {}, + "enterSpace": "Sisene kogukonda", + "@enterSpace": {}, + "enterRoom": "Ava jututuba", + "@enterRoom": {}, + "appearOnTopDetails": "Sellega lubad rakendust avada kõige pealmisena (pole vajalik, kui Fluffychat on juba seadistatud toimima helistamiskontoga)", + "@appearOnTopDetails": {}, + "callingAccount": "Helistamiskonto", + "@callingAccount": {}, + "screenSharingTitle": "ekraani jagamine", + "@screenSharingTitle": {}, + "foregroundServiceRunning": "See teavitus toimib siis, kui esiplaaniteenus töötab.", + "@foregroundServiceRunning": {}, + "allSpaces": "Kõik kogukonnad", + "@allSpaces": {}, + "screenSharingDetail": "Sa jagad oma ekraani FuffyChati vahendusel", + "@screenSharingDetail": {}, + "numChats": "{number} vestlust", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Peida väheolulised olekuteated", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Ära näita uuesti", + "@doNotShowAgain": {}, + "commandHint_cuddle": "Saada üks kaisutus", + "@commandHint_cuddle": {}, + "commandHint_hug": "Saada üks kallistus", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} saatis sulle otsivad silmad", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} kaisutab sind", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} kallistab sind", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "Saada ühed otsivad silmad", + "@commandHint_googly": {}, + "wasDirectChatDisplayName": "Sõnumiteta vestlus (vana nimega {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "startFirstChat": "Alusta oma esimest vestlust", + "@startFirstChat": {}, + "encryptThisChat": "Krüpti see vestlus", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Kui vestluses on krüptimine kasutusele võetud, siis turvalisuse huvides ei saa seda hiljem välja lülitada.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Vabandust... see ei ole võimalik", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Seadme võtmed:", + "@deviceKeys": {}, + "newSpaceDescription": "Kogukonnad võimaldavad sul koondada erinevaid vestlusi ning korraldada avalikku või privaatset ühistegevust.", + "@newSpaceDescription": {}, + "reopenChat": "Alusta vestlust uuesti", + "@reopenChat": {}, + "noOtherDevicesFound": "Muid seadmeid ei leidu", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Hoiatus! Kui sa ei lülita sisse vestluse varundust, siis sul puudub hiljem ligipääs krüptitud sõnumitele. Me tungivalt soovitame, et palun lülita vestluse varundamine sisse enne väljalogimist.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Saatmine ei õnnestu! Serveri vaid kuni {max} suurusega manuseid.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Fail on salvestatud kausta: {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Liigu viimase loetud sõnumini", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Siiamaani on loetud", + "@readUpToHere": {}, + "jump": "Hüppa", + "@jump": {}, + "openLinkInBrowser": "Ava link veebibrauseris", + "@openLinkInBrowser": {}, + "report": "teata", + "@report": {}, + "allRooms": "Kõik vestlusrühmad", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 Oh appike! Midagi läks valesti. Kui soovid, võid sellest veast arendajatele teatada.", + "@reportErrorDescription": {}, + "signInWithPassword": "Logi sisse salasõnaga", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Palun proovi hiljem uuesti või muuda serveri nime.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Logi sisse kasutades teenusepakkujat {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "importFromZipFile": "Impordi zip-failist", + "@importFromZipFile": {}, + "exportEmotePack": "Ekspordi emotikonide pakk zip-failina", + "@exportEmotePack": {}, + "replace": "Asenda", + "@replace": {}, + "notAnImage": "See pole pildifail.", + "@notAnImage": {}, + "importNow": "Impordi kohe", + "@importNow": {}, + "importEmojis": "Impordi emojid", + "@importEmojis": {}, + "sendTypingNotifications": "Saada kirjutamise teavitusi", + "@sendTypingNotifications": {}, + "createGroup": "Loo vestlusrühm", + "@createGroup": {}, + "setTheme": "Vali teema:", + "@setTheme": {}, + "inviteContactToGroupQuestion": "Kas sa soovid kutsuda kasutajat {contact} „{groupName}“ jututuppa?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Proovi uuesti", + "@tryAgain": {}, + "chatPermissions": "Vestluse õigused", + "@chatPermissions": {}, + "chatDescription": "Vestluse kirjeldus", + "@chatDescription": {}, + "noChatDescriptionYet": "Vestluse kirjeldus on puudu.", + "@noChatDescriptionYet": {}, + "optionalRedactReason": "(Kui soovid lisada) Sõnumi muutmise põhjus...", + "@optionalRedactReason": {}, + "messagesStyle": "Sõnumid:", + "@messagesStyle": {}, + "shareInviteLink": "Jaga kutse linki", + "@shareInviteLink": {}, + "directChat": "Otsevestlus", + "@directChat": {}, + "setChatDescription": "Lisa vestluse kirjeldus", + "@setChatDescription": {}, + "profileNotFound": "Sellist kasutajat serveris ei leidu. Tegemist võib olla kas võrguühenduse probleemiga või sellist kasutajat tõesti pole olemas.", + "@profileNotFound": {}, + "setColorTheme": "Vali värviteema:", + "@setColorTheme": {}, + "invite": "Kutsu", + "@invite": {}, + "invalidServerName": "Vigane serveri nimi", + "@invalidServerName": {}, + "addChatDescription": "Lisa vestluse kirjeldus...", + "@addChatDescription": {}, + "chatDescriptionHasBeenChanged": "Vestluse kirjeldus on muutunud", + "@chatDescriptionHasBeenChanged": {}, + "redactMessageDescription": "Sõnumi muudatus kehtib kõikidele vestluses osalejatele. Seda muudatust ei saa tagasi pöörata.", + "@redactMessageDescription": {}, + "redactedBy": "Muutja: {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedByBecause": "Muutja {username} märkis põhjuseks: „{reason}“", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "inviteGroupChat": "📨 Kutsu vestlusrühma", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Kutsu omavahelisele vestlusele", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "Vigane sisend!", + "@invalidInput": {}, + "wrongPinEntered": "Sisestasid vale PIN-koodi! Proovi uuesti {seconds} sekundi pärast...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "banUserDescription": "Sellele kasutajale on nüüd selles jututoas seatud suhtluskeeld ning ta ei saa vestluses osaleda seni, kuni suhtluskeeld pole eemaldatud.", + "@banUserDescription": {}, + "removeDevicesDescription": "Sind logitakse sellest seadmest välja ja sa enam ei saa sõnumeid.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Uuesti proovimisel saab see kasutaja nüüd vestlusega liituda.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Tõuketeavitused pole saadaval", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Kui annad sellele kasutajale peakasutaja õigused, siis kuna tal on sinuga samad õigused, sa ei saa seda toimingut enam tagasi pöörata.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Selle vestluse tõstame nüüd arhiivi. Muud osalejad näevad, et sa oled vestlusest lahkunud.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪{user} on jututoa uksele koputanud", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Loe lisaks", + "@learnMore": {}, + "roomUpgradeDescription": "See vestlus luuakse nüüd uuesti jututoa uue versioonina. Kõik senised osalejad saavad teate, et nad peavad liituma uue vestlusega. Jututubade versioonide kohta leiad teavet https://spec.matrix.org/latest/rooms/ lehelt", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Palun sisesta 0'st suurem number", + "@pleaseEnterANumber": {}, + "kickUserDescription": "See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.", + "@kickUserDescription": {}, + "blockListDescription": "Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Lisavestlusrühm ja kutsu sinna kasutajaid", + "@createGroupAndInviteUsers": {}, + "startConversation": "Alusta vestlust", + "@startConversation": {}, + "blockedUsers": "Blokeeritud kasutajad", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Vestlusrühm on leitav otsinguga", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "Blokeeri", + "@block": {}, + "yourGlobalUserIdIs": "Sinu üldine kasutajatunnus on: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Saada json oma algupärasel kujul", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Vabandust..., see ei tundu olema korrektne taastevõti.", + "@wrongRecoveryKey": {}, + "blockUsername": "Eira kasutajanime", + "@blockUsername": {}, + "groupName": "Vestlusrühma nimi", + "@groupName": {}, + "databaseMigrationTitle": "Andmebaas on optimeeritud", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Otsi #vestlusi, @kasutajaid...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Palun oota üks hetk. Natuke võib kuluda aega.", + "@databaseMigrationBody": {}, + "thisDevice": "See seade:", + "@thisDevice": {}, + "publicSpaces": "Avalikud kogukonnad", + "@publicSpaces": {}, + "passwordIsWrong": "Sinu sisestatud salasõna on vale", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Palun sisesta oma praegune salasõna", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Avalik link", + "@publicLink": {}, + "nothingFound": "Ei leidnud mitte midagi...", + "@nothingFound": {}, + "decline": "Keeldu", + "@decline": {}, + "newPassword": "Uus salasõna", + "@newPassword": {}, + "passwordsDoNotMatch": "Salasõnad ei klapi omavahel", + "@passwordsDoNotMatch": {}, + "subspace": "Jututuba või alamkogukond", + "@subspace": {}, + "select": "Vali", + "@select": {}, + "pleaseChooseAStrongPassword": "Palun sisesta korralik salasõna", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Lisa vestlus või jututuba", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Senise oleku eemaldamiseks jäta väärtus tühjaks.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Liitu kogukonnaga", + "@joinSpace": {}, + "searchForUsers": "Otsi kasutajat @kasutajanimi ...", + "@searchForUsers": {}, + "databaseBuildErrorBody": "SQlite andmebaasi loomine ei õnnestu. Seetõttu üritab rakendus kasutada senist andmehoidlat. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "Rakenduse käivitamisel tekkis viga", + "@initAppError": {}, + "sessionLostBody": "Sinu sessioon on kadunud. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Nüüd üritab rakendus taastada sinu sessiooni varukoopiast. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "transparent": "Läbipaistev", + "@transparent": {}, + "youInvitedToBy": "📩 Sa oled lingiga saanud kutse jututuppa:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "sendReadReceipts": "Saada lugemisteatisi", + "@sendReadReceipts": {}, + "verifyOtherUserDescription": "Kui sa oled vestluse teise osapoole verifitseerinud, siis saad kindel olla, et tead, kellega suhtled. 💪\n\nKui alustad verifitseerimist, siis sinul ja teisel osapoolel tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida peate omavahel võrdlema.\n\nKõige lihtsam on seda teha kas omavahelise kohtumise ajal või videokõne kestel. 👭", + "@verifyOtherUserDescription": {}, + "forwardMessageTo": "Kas edastame sõnumi jututuppa {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendTypingNotificationsDescription": "Muud vestluses osalejad saavad näha, kui sa oled uut sõnumit kirjutamas.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Muud vestluses osalejad näevad, kas oled sõnumit lugenud.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Vormindatud sõnumid", + "@formattedMessages": {}, + "verifyOtherUser": "🔐 Verifitseeri teine kasutaja", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Verifitseeri oma muu seade", + "@verifyOtherDevice": {}, + "canceledKeyVerification": "{sender} katkestas krüptovõtmete verifitseerimise", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} sai valmis krüptovõtmete verifitseerimise", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "formattedMessagesDescription": "Kasutades markdown-süntaksit kuva vormindust, nagu rasvases kirjas tekst.", + "@formattedMessagesDescription": {}, + "verifyOtherDeviceDescription": "Kui sa oled oma muu seadme verifitseerinud, siis need seadmed võivad vahetada krüptovõtmeid ning see parandab üldist turvalisust. 💪 Kui alustad verifitseerimist, siis sinu mõlemas seadmes tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida pead omavahel võrdlema. On oluline, et mõlemad seadmed on verifitseerimise alustamisel sinu kõrval. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} nõustus krüptovõtmete verifitseerimisega", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} on valmis krüptovõtmete verifitseerimiseks", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} palus krüptovõtmete verifitseerimist", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} alustas krüptovõtmete verifitseerimist", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presenceStyle": "Olekuteated:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Näita teiste kasutajate olekuteateid", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "incomingMessages": "Saabuvad sõnumid", + "@incomingMessages": {}, + "hidePresences": "Peida olekute loend?", + "@hidePresences": {}, + "stickers": "Kleepsud", + "@stickers": {}, + "discover": "Otsi ja leia", + "@discover": {}, + "commandHint_ignore": "Eira seda Matrixi kasutajatunnust", + "@commandHint_ignore": {}, + "commandHint_unignore": "Lõpeta selle Matrixi kasutajatunnuse eiramine", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} lugemata vestlust", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "globalChatId": "Üldine vestluse tunnus", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Kes võib selle vestlusega liituda ja kuidas on võimalik seda vestlust leida.", + "@accessAndVisibilityDescription": {}, + "hideRedactedMessagesBody": "Kui keegi muudab sõnumit, siis teda enam ei kuvataks vestluses.", + "@hideRedactedMessagesBody": {}, + "userWouldLikeToChangeTheChat": "{user} soovib liituda vestlusega.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "hideMemberChangesInPublicChats": "Peida avalike vestluste liikmelisuse muutused", + "@hideMemberChangesInPublicChats": {}, + "notifyMeFor": "Teavita mind kui", + "@notifyMeFor": {}, + "usersMustKnock": "Kasutajad peavad uksele koputama", + "@usersMustKnock": {}, + "noOneCanJoin": "Mitte keegi ei saa liituda", + "@noOneCanJoin": {}, + "knocking": "Koputus uksele", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Vestluse või jututoa saad leida otsingust serveris {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "publicChatAddresses": "Vestluse avalik aadress", + "@publicChatAddresses": {}, + "minimumPowerLevel": "{level} on väikseim võimalik õiguste tase.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "noDatabaseEncryption": "Andmebaasi krüptimine pole sellel platvormil toetatud", + "@noDatabaseEncryption": {}, + "noPublicLinkHasBeenCreatedYet": "Avalikult kasutatavat linki pole veel olemas", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Koputa uksele", + "@knock": {}, + "appLockDescription": "Kui sa rakendust parasjagu ei kasuta, siis lukusta ta PIN-koodiga", + "@appLockDescription": {}, + "accessAndVisibility": "Ligipääsetavus ja nähtavus", + "@accessAndVisibility": {}, + "calls": "Kõned", + "@calls": {}, + "customEmojisAndStickers": "Kohandatud emotikonid ja kleepsud", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Lisa või jaga kohandatud emotikone või kleepsupakke, mida võiks kasutada igas vestluses.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Peida muudetud sõnumid", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Peida vigase või tundmatu vorminguga sõnumid", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChatsBody": "Parema loetavuse nimel ära näita vestluse ajajoonel avaliku jututoaga liitumisi ja sealt lahkumisi.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Ülevaade", + "@overview": {}, + "passwordRecoverySettings": "Salasõna taastamise seadistused", + "@passwordRecoverySettings": {}, + "createNewAddress": "Loo uus aadress", + "@createNewAddress": {}, + "userRole": "Kasutaja roll", + "@userRole": {}, + "thereAreCountUsersBlocked": "Hetkel on {count} blokeeritud kasutajat.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "searchIn": "Otsi vestlusest „{chat}“...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Otsi veel...", + "@searchMore": {}, + "knockRestricted": "Koputa piiratud ligipääsuga jututoa uksele", + "@knockRestricted": {}, + "restricted": "Piiratud", + "@restricted": {}, + "gallery": "Galerii", + "@gallery": {}, + "files": "Failid", + "@files": {}, + "swipeRightToLeftToReply": "Vastamiseks viipa paremalt vasakule", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "Rohkem vestlusi ei leidu...", + "@noMoreChatsFound": {}, + "joinedChats": "Vestlusi, millega oled liitunud", + "@joinedChats": {}, + "unread": "Lugemata", + "@unread": {}, + "space": "Kogukond", + "@space": {}, + "spaces": "Kogukonnad", + "@spaces": {}, + "goToSpace": "Ava kogukond: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Märgi mitteloetuks", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} vestlust ja {participants} osalejat", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "userLevel": "{level} - kasutaja", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - moderaator", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - peakasutaja", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeTheVisibilityOfChatHistory": "Muuda vestluse ajaloo nähtavust", + "@changeTheVisibilityOfChatHistory": {}, + "sendRoomNotifications": "Saada @jututuba teavitusi", + "@sendRoomNotifications": {}, + "changeTheCanonicalRoomAlias": "Muuda vestluse põhilist avalikult nähtavat aadressi", + "@changeTheCanonicalRoomAlias": {}, + "changeGeneralChatSettings": "Muuda vestluse üldiseid seadistusi", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Kutsu teisi osalejaid sellesse vestlusesse", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Muuda vestluse õigusi", + "@changeTheChatPermissions": {}, + "changeTheDescriptionOfTheGroup": "Muuda vestluse kirjeldust", + "@changeTheDescriptionOfTheGroup": {}, + "chatPermissionsDescription": "Määra erinevatele kasutajatele selles vestluses vajalikud õigused. Tüüpiliselt on need 0, 50 ja 100 (vastavalt kasutajad, moderaatorid ja peakasutajad), kuid igasugused vahepealsed variatsioonid on ka võimalikud.", + "@chatPermissionsDescription": {}, + "invitedBy": "📩 Kutsujaks {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "updateInstalled": "🎉 Versiooniuuendus {version} on paigaldatud!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Muudatuste logi", + "@changelog": {}, + "sendCanceled": "Saatmine on katkestatud", + "@sendCanceled": {}, + "noChatsFoundHere": "Siin ei leidu veel ühtegi vestlust. Alusta uut vestlust klõpsides allpool asuvat nuppu. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "Logi sisse Matrix-ID alusel", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Leia koduservereid", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Mis on koduserver?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Sarnaselt e-postiteenuse pakkujale on kõik sinu sõnumid salvestatud koduserveris. Sa võid valida sellise koduserveri, nagu sulle meeldib ja nad kõik suudavad teiste koduserveritega suhelda. Lisateavet leiad veebisaidist https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Ei tundu olema ühilduv koduserver. Kas võrguaadress on ikka õige?", + "@doesNotSeemToBeAValidHomeserver": {}, + "prepareSendingAttachment": "Valmistume manuse saatmiseks...", + "@prepareSendingAttachment": {}, + "generatingVideoThumbnail": "Loome video pisipilti...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Pakime videot väiksemaks...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Saadame manust: {index} pikkusega {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "Serveri poolt lubatud ülempiir on käes. Ootame {seconds} sekundit...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "sendingAttachment": "Saadame manust...", + "@sendingAttachment": {}, + "calculatingFileSize": "Arvutame faili suurust...", + "@calculatingFileSize": {}, + "oneOfYourDevicesIsNotVerified": "Üks sinu seadmetest pole verifitseeritud", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Märkus: kui liidad kõik oma seadmed vestluste varundamisega, siis on nad sellega ka automaatselt verifitseeritud.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Jätka", + "@continueText": {}, + "welcomeText": "Tere, tere 👋 See on FluffyChat. Sa võid sisse logida igasse koduserverisse, mis ühildub https://matrix.org serveriga. Ja seejärel saad suhelda kõigiga. Tegemist on ikka väga suure detsentraliseeritud sõnumivõrguga!", + "@welcomeText": {}, + "setWallpaper": "Määra taustapildiks", + "@setWallpaper": {}, + "manageAccount": "Halda kasutajakontot", + "@manageAccount": {}, + "blur": "Hägusus:", + "@blur": {}, + "opacity": "Läbipaistmatus:", + "@opacity": {}, + "contactServerSecurity": "Võta ühendust serveri andmeturbe eest vastutajaga", + "@contactServerSecurity": {}, + "supportPage": "Kasutajatugi", + "@supportPage": {}, + "serverInformation": "Serveri teave:", + "@serverInformation": {}, + "name": "Nimi", + "@name": {}, + "version": "Versioon", + "@version": {}, + "noContactInformationProvided": "Server ei jaga asjakohast kontaktteavet", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Võta ühendust serveri haldajaga", + "@contactServerAdmin": {}, + "website": "Veebisait", + "@website": {}, + "aboutHomeserver": "Koduserveri teave: {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "compressBeforeSending": "Paki enne saatmist kokku", + "@compressBeforeSending": {}, + "pleaseFillOut": "Palun täida", + "@pleaseFillOut": {}, + "invalidUrl": "Vigane võrguaadress", + "@invalidUrl": {}, + "addLink": "Lisa link", + "@addLink": {}, + "strikeThrough": "Läbikriipsutatud kiri", + "@strikeThrough": {}, + "sendUncompressed": "Saada pakkimata kujul", + "@sendUncompressed": {}, + "boldText": "Paks kiri", + "@boldText": {}, + "italicText": "Kaldkiri", + "@italicText": {}, + "unableToJoinChat": "Vestlusega liitumine ei õnnestu. Võib-olla on teine osapool juba vestluse sulgenud.", + "@unableToJoinChat": {}, + "sendImages": "Saada {count} pilti", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Paki kokku", + "@compress": {} } diff --git a/assets/l10n/intl_eu.arb b/assets/l10n/intl_eu.arb index 4938aa5ff3..d8f170604f 100644 --- a/assets/l10n/intl_eu.arb +++ b/assets/l10n/intl_eu.arb @@ -6,12 +6,12 @@ "type": "text", "placeholders": {} }, - "accept": "Ados", + "accept": "Onartu", "@accept": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username}-(e)k gonbidapena onartu du", + "acceptedTheInvitation": "👍 {username}(e)k gonbidapena onartu du", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,23 +23,13 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Kontuaren informazioa", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}(e)k puntuz puntuko zifraketa gaitu du", + "activatedEndToEndEncryption": "🔐 {username}(e)k ertzetik ertzerako zifratzea gaitu du", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "addGroupDescription": "Gehitu taldearen deskribapena", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Administratzailea", "@admin": { "type": "text", @@ -50,12 +40,7 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Baduzu kontu bat?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName}-(e)k deia erantzun du", + "answeredTheCall": "{senderName}(e)k deia erantzun du", "@answeredTheCall": { "type": "text", "placeholders": { @@ -67,69 +52,44 @@ "type": "text", "placeholders": {} }, - "archive": "Artxibatu", + "archive": "Fitxategia", "@archive": { "type": "text", "placeholders": {} }, - "archivedRoom": "Artxibatutako gelak", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Ba al dute batzeko baimenik erabiltzaile gonbidatuek?", + "areGuestsAllowedToJoin": "Batu daitezke bisitan dauden erabiltzaileak?", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "areYouSure": "Ziur al zaude?", + "areYouSure": "Ziur zaude?", "@areYouSure": { "type": "text", "placeholders": {} }, - "askSSSSCache": "Mesedez sar ezazu zure biltegiratze segururako pasaesaldia edo berreskuratze gakoa katxean gakoak gordetzeko.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Beste pertsona ziurtatzeko, mesedez, sartu zure biltegiratze segururako pasaesaldia edo berreskuratze gakoa.", + "askSSSSSign": "Beste pertsona egiaztatzeko, sartu zure biltegiratze segururako pasaesaldia edo berreskuratze-gakoa.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Zure saioa egiaztatzeko, mesedez sar ezazu zure biltegiratze segururako pasaesaldia edo berreskuratze gakoa.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "{username}-(r)en egiaztatze eskaera onartu?", + "askVerificationRequest": "{username}(r)en egiaztaketa-eskaera onartu?", "@askVerificationRequest": { "type": "text", "placeholders": { "username": {} } }, - "authentication": "Autentifikazioa", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Profileko irudia aldatua izan da", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Berriketa debekatu", + "banFromChat": "Txatera batzeko debekua ezarri", "@banFromChat": { "type": "text", "placeholders": {} }, - "banned": "Debekatuta", + "banned": "Kanporatuta", "@banned": { "type": "text", "placeholders": {} }, - "bannedUser": "{username}-(e)k {targetName} debekatu du", + "bannedUser": "{username}(e)k {targetName}(r)i debekua ezarri dio", "@bannedUser": { "type": "text", "placeholders": { @@ -137,22 +97,17 @@ "targetName": {} } }, - "blockDevice": "Gailua blokeatu", + "blockDevice": "Blokeatu gailua", "@blockDevice": { "type": "text", "placeholders": {} }, - "cachedKeys": "Gakoak ongi gorde dira", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Utzi", "@cancel": { "type": "text", "placeholders": {} }, - "changedTheChatAvatar": "{username}-(e)k berriketako irudia aldatu du", + "changedTheChatAvatar": "{username}(e)k txataren abatarra aldatu du", "@changedTheChatAvatar": { "type": "text", "placeholders": { @@ -167,7 +122,7 @@ "description": {} } }, - "changedTheChatNameTo": "{username}-(e)k berriketaren izena '{chatname}'-(e)ra aldatu du", + "changedTheChatNameTo": "{username}(e)k txataren izena '{chatname}'(e)ra aldatu du", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -175,14 +130,14 @@ "chatname": {} } }, - "changedTheChatPermissions": "{username}-(e)k berriketaren baimenak aldatu ditu", + "changedTheChatPermissions": "{username}(e)k txataren baimenak aldatu ditu", "@changedTheChatPermissions": { "type": "text", "placeholders": { "username": {} } }, - "changedTheDisplaynameTo": "{username}(e)k bere izena aldatu du. Aurrerantzean '{displayname}' izango da", + "changedTheDisplaynameTo": "{username}(e)k bere ezizena aldatu du. Aurrerantzean '{displayname}' izango da", "@changedTheDisplaynameTo": { "type": "text", "placeholders": { @@ -190,14 +145,14 @@ "displayname": {} } }, - "changedTheGuestAccessRules": "{username}-(e)k gonbidatuen sarbide arauak aldatu ditu", + "changedTheGuestAccessRules": "{username}(e)k bisitarien sarbide-arauak aldatu ditu", "@changedTheGuestAccessRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheGuestAccessRulesTo": "{username}(e)k gonbidatuen arauak aldatu ditu: {rules}", + "changedTheGuestAccessRulesTo": "{username}(e)k bisitarien arauak aldatu ditu: {rules}", "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { @@ -205,14 +160,14 @@ "rules": {} } }, - "changedTheHistoryVisibility": "{username}-(e)k historiaren ikusgarritasuna aldatu du", + "changedTheHistoryVisibility": "{username}(e)k historiaren ikusgaitasuna aldatu du", "@changedTheHistoryVisibility": { "type": "text", "placeholders": { "username": {} } }, - "changedTheHistoryVisibilityTo": "{username}-(e)k historiaren ikusgarritasuna {rules}-(e)ra aldatu du", + "changedTheHistoryVisibilityTo": "{username}(e)k historiaren ikusgaitasuna {rules}-(e)ra aldatu du", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -220,14 +175,14 @@ "rules": {} } }, - "changedTheJoinRules": "{username}-(e)k batze arauak aldatu ditu", + "changedTheJoinRules": "{username}(e)k batzeko arauak aldatu ditu", "@changedTheJoinRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheJoinRulesTo": "{username}-(e)k batzeko arauak {joinRules}-(e)ra aldatu ditu", + "changedTheJoinRulesTo": "{username}(e)k batzeko arauak aldatu ditu: {joinRules}", "@changedTheJoinRulesTo": { "type": "text", "placeholders": { @@ -235,37 +190,27 @@ "joinRules": {} } }, - "changedTheProfileAvatar": "{username}-(e)k profileko irudia aldatu du", + "changedTheProfileAvatar": "{username}(e)k profileko abatarra aldatu du", "@changedTheProfileAvatar": { "type": "text", "placeholders": { "username": {} } }, - "changedTheRoomAliases": "{username}-(e)k gelaren ezizena aldatu du", + "changedTheRoomAliases": "{username}(e)k gelaren ezizena aldatu du", "@changedTheRoomAliases": { "type": "text", "placeholders": { "username": {} } }, - "changedTheRoomInvitationLink": "{username}-(e)k gonbidapen esteka aldatu du", + "changedTheRoomInvitationLink": "{username}(e)k gonbidapen-esteka aldatu du", "@changedTheRoomInvitationLink": { "type": "text", "placeholders": { "username": {} } }, - "changelog": "Aldaketen erregistroa", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Aldaketak gorde dira", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Aldatu zerbitzaria", "@changeTheHomeserver": { "type": "text", @@ -281,52 +226,37 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Aldatu zerbitzaria", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Atzekaldea aldatu", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Enkriptatzea hondatu egin da", + "channelCorruptedDecryptError": "Zifratzea hondatu egin da", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "chat": "Berriketa", + "chat": "Txata", "@chat": { "type": "text", "placeholders": {} }, - "chatDetails": "Berriketaren xehetasunak", + "chatDetails": "Txataren xehetasunak", "@chatDetails": { "type": "text", "placeholders": {} }, - "chooseAStrongPassword": "Aukera ezazu pasahitz sendo bat", + "chooseAStrongPassword": "Aukeratu pasahitz sendo bat", "@chooseAStrongPassword": { "type": "text", "placeholders": {} }, - "chooseAUsername": "Aukera ezazu erabiltzaile izen bat", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "close": "Itxi", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Konparatu eta egiazta ezazu ondorengo emojiak beste gailukoaren berdinak direla:", + "compareEmojiMatch": "Konparatu emojiak", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Konparatu eta egiazta ezazu ondorengo zenbakiak beste gailukoaren berdinak direla:", + "compareNumbersMatch": "Konparatu zenbakiak", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -341,22 +271,12 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Konektatze saiakerak huts egin du", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontaktua taldera gonbidatua izan da", + "contactHasBeenInvitedToTheGroup": "Kontaktua taldera gonbidatu da", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "contentViewer": "Eduki ikustailea", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Arbelera kopiatua", + "copiedToClipboard": "Arbelera kopiatu da", "@copiedToClipboard": { "type": "text", "placeholders": {} @@ -373,16 +293,6 @@ "error": {} } }, - "couldNotSetAvatar": "Ezin izan da irudia ezarri", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Ezin izan da bistaratze-izena ezarri", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} partaide", "@countParticipants": { "type": "text", @@ -395,34 +305,14 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Sortu kontua orain", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}-(e)k berriketa sortu du", + "createdTheChat": "💬 {username}(e)k txata sortu du", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Talde berria sortu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Sinadura gurutzatua desgaituta dago", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Zeharkako sinadura piztuta", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Unean aktibo", + "currentlyActive": "Une honetan aktibo", "@currentlyActive": { "type": "text", "placeholders": {} @@ -462,16 +352,11 @@ "type": "text", "placeholders": {} }, - "deleteMessage": "Ezabatu mezua", + "deleteMessage": "Mezuak ezabatu", "@deleteMessage": { "type": "text", "placeholders": {} }, - "deny": "Ukatu", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Gailua", "@device": { "type": "text", @@ -482,91 +367,66 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Baztertu irudia", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Pantaila-izena aldatu da", + "displaynameHasBeenChanged": "Ezizena aldatu da", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Egin dohaintza", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Deskargatu fitxategia", "@downloadFile": { "type": "text", "placeholders": {} }, - "editDisplayname": "Moldatu ezizena", + "editDisplayname": "Editatu ezizena", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Moldatu Jitsi zerbitzaria", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotea dagoeneko existitzen da!", + "emoteExists": "Emotea badago lehendik ere!", "@emoteExists": { "type": "text", "placeholders": {} }, - "emoteInvalid": "Emotearen laburdura ez da baliogarria!", + "emoteInvalid": "Emotearen laburdura ez da baliozkoa!", "@emoteInvalid": { "type": "text", "placeholders": {} }, - "emoteSettings": "Emote ezarpenak", + "emoteSettings": "Emote-ezarpenak", "@emoteSettings": { "type": "text", "placeholders": {} }, - "emoteShortcode": "Emote laburdurak", + "emoteShortcode": "Laburdura", "@emoteShortcode": { "type": "text", "placeholders": {} }, - "emoteWarnNeedToPick": "Emote laburdura eta irudi bat aukeratu behar dituzu!", + "emoteWarnNeedToPick": "Emote-laburdura eta irudi bat aukeratu behar dituzu!", "@emoteWarnNeedToPick": { "type": "text", "placeholders": {} }, - "emptyChat": "Hutsik dago", + "emptyChat": "Txata hutsik dago", "@emptyChat": { "type": "text", "placeholders": {} }, - "enableEncryptionWarning": "Ezingo duzu zifraketa desgaitu. Ziur zaude?", + "enableEncryptionWarning": "Ezingo duzu zifratzea ezgaitu. Ziur zaude?", "@enableEncryptionWarning": { "type": "text", "placeholders": {} }, - "encryption": "Zifraketa", + "encryption": "Zifratzea", "@encryption": { "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Zifraketa algoritmoa", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Zifraketa ez dago gaituta", + "encryptionNotEnabled": "Zifratzea ez dago gaituta", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Puntuz puntuko zifraketaren ezarpenak", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName}(e)k deia amaitu du", "@endedTheCall": { "type": "text", @@ -574,17 +434,7 @@ "senderName": {} } }, - "enterAGroupName": "Idatzi talderako izena", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Idatzi erabiltzailea", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Idatzi zure zerbitzaria", + "enterYourHomeserver": "Sartu zure zerbitzaria", "@enterYourHomeserver": { "type": "text", "placeholders": {} @@ -594,32 +444,22 @@ "type": "text", "placeholders": {} }, - "fileSize": "Fitxategiaren tamaina", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", "placeholders": {} }, - "forward": "Berbidali", + "forward": "Birbidali", "@forward": { "type": "text", "placeholders": {} }, - "friday": "Ostirala", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "sartzeaz", + "fromJoining": "Batzeaz geroztik", "@fromJoining": { "type": "text", "placeholders": {} }, - "fromTheInvitation": "gonbidapenaz", + "fromTheInvitation": "Gonbidapenaz geroztik", "@fromTheInvitation": { "type": "text", "placeholders": {} @@ -629,16 +469,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Taldearen deskribapena", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Taldearen deskribapena moldatu da", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Taldea publikoa da", "@groupIsPublic": { "type": "text", @@ -651,17 +481,17 @@ "displayname": {} } }, - "guestsAreForbidden": "Gonbidatuak debekatuta daude", + "guestsAreForbidden": "Ez, bisitariak ez daude baimenduta", "@guestsAreForbidden": { "type": "text", "placeholders": {} }, - "guestsCanJoin": "Gonbidatuak sar daitezke", + "guestsCanJoin": "Bai, bisitariak batu daitezke", "@guestsCanJoin": { "type": "text", "placeholders": {} }, - "hasWithdrawnTheInvitationFor": "{username}(e)k {targetName}(r)en gonbidapena baliogabetu du", + "hasWithdrawnTheInvitationFor": "{username}(e)k {targetName}(r)en gonbidapena atzera bota du", "@hasWithdrawnTheInvitationFor": { "type": "text", "placeholders": { @@ -674,27 +504,22 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Zerbitzaria ez da bateragarria", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "id": "IDa", "@id": { "type": "text", "placeholders": {} }, - "identity": "Nortasuna", + "identity": "Identitatea", "@identity": { "type": "text", "placeholders": {} }, - "incorrectPassphraseOrKey": "Pasahitza edo segurtasun gakoa ez da zuzena", + "incorrectPassphraseOrKey": "Pasaesaldi edo berreskuratze-gakoa ez da zuzena", "@incorrectPassphraseOrKey": { "type": "text", "placeholders": {} }, - "inviteContact": "Gonbidatu kontaktua", + "inviteContact": "Kontaktuak gonbidatu", "@inviteContact": { "type": "text", "placeholders": {} @@ -711,7 +536,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username}(e)k {targetName} gonbidatu du", + "invitedUser": "📩 {username}(e)k {targetName} gonbidatu du", "@invitedUser": { "type": "text", "placeholders": { @@ -724,7 +549,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username}(e)k FluffyChatera gonbidatu zaitu.\n1. Instala ezazu FluffyChat: https://fluffychat.im\n2. Eman ezazu izena edo hasi ezazu saioa\n3. Ireki ezazu gonbidapen esteka: {link}", + "inviteText": "{username}(e)k FluffyChatera gonbidatu zaitu.\n1. Bisitatu https://fluffychat.im eta instalatu aplikazioa\n2. Eman izena edo hasi saioa\n3. Ireki gonbidapen-esteka:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -732,39 +557,24 @@ "link": {} } }, - "isDeviceKeyCorrect": "Zuzena al da ondorengo gailuaren gakoa?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "idazten ari da…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} txatera sartu da", + "joinedTheChat": "👋 {username} txatera batu da", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "joinRoom": "Sartu gelara", + "joinRoom": "Batu gelara", "@joinRoom": { "type": "text", "placeholders": {} }, - "keysCached": "Gakoak cachean daude", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Gakoak falta dira", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}(e)k {targetName} kaleratu du", + "kicked": "👞 {username}(e)k {targetName} kanporatu du", "@kicked": { "type": "text", "placeholders": { @@ -772,7 +582,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username}(e)k {targetName} kaleratu eta debekua ezarri dio", + "kickedAndBanned": "🙅 {username}(e)k {targetName} kanporatu eta debekua ezarri dio", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -780,7 +590,7 @@ "targetName": {} } }, - "kickFromChat": "Kaleratu txatetik", + "kickFromChat": "Txatetik kanporatu", "@kickFromChat": { "type": "text", "placeholders": {} @@ -792,16 +602,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Azkenekoz ikusitako IPa", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Duela denbora luze", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Irten", "@leave": { "type": "text", @@ -822,14 +622,14 @@ "type": "text", "placeholders": {} }, - "loadCountMoreParticipants": "Kargatu {count} partehartzaile gehiago", + "loadCountMoreParticipants": "Kargatu {count} partaide gehiago", "@loadCountMoreParticipants": { "type": "text", "placeholders": { "count": {} } }, - "loadingPleaseWait": "Kargatzen… Mesedez, itxaron.", + "loadingPleaseWait": "Kargatzen… itxaron.", "@loadingPleaseWait": { "type": "text", "placeholders": {} @@ -856,52 +656,27 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Bilakatu moderatzaile", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Bilakatu administratzaile", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Egiaztatu identifikazioa baliozkoa dela", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Mezua partehartzaile guztientzat ezabatuko da", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderatzailea", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Astelehena", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Mututu txata", "@muteChat": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "Mesedez, kontuan izan Pantalaimon behar duzula oraingoz puntuz puntuko zifraketarako.", + "needPantalaimonWarning": "Kontuan izan oraingoz Pantalaimon behar duzula ertzetik ertzerako zifratzerako.", "@needPantalaimonWarning": { "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Mezu berria FluffyChaten", + "newMessageInFluffyChat": "💬 Mezu berria FluffyChaten", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} }, - "newVerificationRequest": "Egiaztaketa eskaera berria!", + "newVerificationRequest": "Egiaztaketa-eskaera berria!", "@newVerificationRequest": { "type": "text", "placeholders": {} @@ -911,32 +686,22 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChatek une honetan ez du gaituta zeharkako-sinadura. Mesedez, gaitu ezazu Element-en ezarpenetan.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Ez da emoterik aurkitu. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Dirudienez ez daukazu Googleren zerbitzurik zure mugikorrean. Primerako erabakia zure pribatutasunerako! FluffyChaten jakinarazpenak jasotzeko https://microg.org/ edo https://unifiedpush.org/ erabiltzea gomendatzen dugu.", + "noGoogleServicesWarning": "Ez dirudi Firebase Cloud Messaging zure mugikorrean erabilgarri dagoenik. Jakinarazpenak jasotzeko ntfy instalatzea gomendatzen dugu. ntfy edo beste Unified Push hornitzaileren batekin, push jakinarazpenak jaso ditzazkezu datuentzako segurua den modu batean. ntfy PlayStore edo F-Droid dendetatik deskarga dezakezu.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Mesedez, gaitu gakoen online babeskopia Elementen ezarpenetan.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Bat ere ez", "@none": { "type": "text", "placeholders": {} }, - "noPermission": "Baimenik ez", + "noPermission": "Baimenik gabe", "@noPermission": { "type": "text", "placeholders": {} @@ -946,28 +711,11 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Ez dago weberako gaituta", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} aukeratuta", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "ok": "Ados", "@ok": { "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Gakoen online babeskopia ez dago gaituta", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Gakoen online babeskopia gaituta dago", "@onlineKeyBackupEnabled": { "type": "text", @@ -988,17 +736,7 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Hautazkoa) Taldearen izena", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Partehartzaileen gailuak", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "pasahitza edo berreskuratzeko gakoa", + "passphraseOrKey": "pasaesaldia edo berreskuratze-gakoa", "@passphraseOrKey": { "type": "text", "placeholders": {} @@ -1013,7 +751,7 @@ "type": "text", "placeholders": {} }, - "pin": "Iltzatu", + "pin": "Finkatu", "@pin": { "type": "text", "placeholders": {} @@ -1025,22 +763,12 @@ "fileName": {} } }, - "pleaseChooseAUsername": "Mesedez, aukeratu goitizen bat", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Mesedez, idatzi Matrix ID bat.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Mesedez, idatzi zure pasahitza", + "pleaseEnterYourPassword": "Sartu zure pasahitza", "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} }, - "pleaseEnterYourUsername": "Mesedez, idatzi zure erabiltzaile-izena", + "pleaseEnterYourUsername": "Sartu zure erabiltzaile-izena", "@pleaseEnterYourUsername": { "type": "text", "placeholders": {} @@ -1055,7 +783,7 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username}(e)k gertaera bat izkutatu du", + "redactedAnEvent": "{username}(e)k gertaera bat atzera bota du", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -1074,7 +802,7 @@ "username": {} } }, - "rejoin": "Sartu berriro", + "rejoin": "Batu berriro", "@rejoin": { "type": "text", "placeholders": {} @@ -1084,7 +812,7 @@ "type": "text", "placeholders": {} }, - "removeAllOtherDevices": "Kendu gainerako gailuak", + "removeAllOtherDevices": "Kendu gainerako gailu guztiak", "@removeAllOtherDevices": { "type": "text", "placeholders": {} @@ -1101,16 +829,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "Baimendu txatean", + "unbanFromChat": "Kendu txatean duen debekua", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "Kendu mezua", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Kargatu mezu aberatseko edukia", "@renderRichContent": { "type": "text", @@ -1126,31 +849,11 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Eskatu mezu zaharragoak irakurri ahal izatea", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Kendu baimen guztiak", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Gela eguneratu da", + "roomHasBeenUpgraded": "Gela bertsio-berritu da", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "Larunbata", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Bilatu txat bat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "seenByUser": "{username}(e)k ikusi du", "@seenByUser": { "type": "text", @@ -1158,14 +861,6 @@ "username": {} } }, - "seenByUserAndUser": "{username}(e)k eta {username2}(e)k ikusi dute", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Bidali", "@send": { "type": "text", @@ -1181,11 +876,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Gaitu erroreen berri sentry.io bidez ematea", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Bidali fitxategia", "@sendFile": { "type": "text", @@ -1206,35 +896,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username}(e)k fitxategia bidali du", + "sentAFile": "📁 {username}(e)k fitxategia bidali du", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username}(e)k audioa bidali du", + "sentAnAudio": "🎤 {username}(e)k audioa bidali du", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username}(e)k irudia bidali du", + "sentAPicture": "🖼️ {username}(e)k irudia bidali du", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username}(e)k stickerra bidali du", + "sentASticker": "😊 {username}(e)k pegatina bidali du", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username}(e)k bideoa bidali du", + "sentAVideo": "🎥 {username}(e)k bideoa bidali du", "@sentAVideo": { "type": "text", "placeholders": { @@ -1248,27 +938,7 @@ "senderName": {} } }, - "sentryInfo": "Zure pribatutasunari buruzko informazioa: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Saioa egiaztatu da", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Ezarri profileko irudia", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Ezarri taldeko deskribapena", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Ezarri gonbidapen esteka", + "setInvitationLink": "Gonbidapen-esteka ezarri", "@setInvitationLink": { "type": "text", "placeholders": {} @@ -1295,11 +965,6 @@ "username": {} } }, - "signUp": "Eman izena", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Saltatu", "@skip": { "type": "text", @@ -1317,11 +982,6 @@ "senderName": {} } }, - "startYourFirstChat": "Hasi zure lehen txata oraintxe bertan! 🙂\n- Ttap 'Txat berria'n\n- Eskaneatu lagun baten QR kodea\n- Dibertitu txateatzen", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "Zer moduz zaude gaur?", "@statusExampleMessage": { "type": "text", @@ -1332,21 +992,11 @@ "type": "text", "placeholders": {} }, - "sunday": "Igandea", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", + "systemTheme": "Sistemak darabilena", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "Sakatu menua ikusteko", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Ez datoz bat", "@theyDontMatch": { "type": "text", @@ -1357,43 +1007,18 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Gela hau artxibatu da.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Osteguna", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", "type": "text", "placeholders": {} }, - "tryToSendAgain": "Saia zaitez berriro bidaltzen", + "tryToSendAgain": "Saiatu berriro bidaltzen", "@tryToSendAgain": { "type": "text", "placeholders": {} }, - "tuesday": "Asteartea", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username}(e)k {targetName} baimendu du", + "unbannedUser": "{username}(e)k {targetName}(r)i debekua kendu dio", "@unbannedUser": { "type": "text", "placeholders": { @@ -1411,7 +1036,7 @@ "type": "text", "placeholders": {} }, - "unknownEncryptionAlgorithm": "Zifraketa-algoritmo ezezaguna", + "unknownEncryptionAlgorithm": "Zifratze-algoritmo ezezaguna", "@unknownEncryptionAlgorithm": { "type": "text", "placeholders": {} @@ -1423,26 +1048,16 @@ "type": {} } }, - "unknownSessionVerify": "Saio ezezaguna; mesedez, egiaztatu", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Kendu mozala txatari", + "unmuteChat": "Utzi txata mututzeari", "@unmuteChat": { "type": "text", "placeholders": {} }, - "unpin": "Kendu iltzea", + "unpin": "Utzi finkatzeari", "@unpin": { "type": "text", "placeholders": {} }, - "useAmoledTheme": "Erabili AMOLEDekin bateragarriak diren koloreak?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} eta beste {count} idazten ari dira…", "@userAndOthersAreTyping": { "type": "text", @@ -1466,14 +1081,14 @@ "username": {} } }, - "userLeftTheChat": "{username} txatetik irten da", + "userLeftTheChat": "🚪 {username}(e)k txata utzi du", "@userLeftTheChat": { "type": "text", "placeholders": { "username": {} } }, - "username": "Erabiltzaile izena", + "username": "Erabiltzaile-izena", "@username": { "type": "text", "placeholders": {} @@ -1486,27 +1101,17 @@ "type": {} } }, - "verifiedSession": "Arrakastaz egiaztatu da saioa!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Egiaztatu", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Eskuz egiaztatu", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Abiarazi egiaztaketa", "@verifyStart": { "type": "text", "placeholders": {} }, - "verifySuccess": "Arrakastaz egiaztatu duzu!", + "verifySuccess": "Ondo egiaztatu duzu!", "@verifySuccess": { "type": "text", "placeholders": {} @@ -1516,22 +1121,17 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Egiaztatu erabiltzailea", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Bideo-deia", "@videoCall": { "type": "text", "placeholders": {} }, - "visibilityOfTheChatHistory": "Txat-historiaren ikusgarritasuna", + "visibilityOfTheChatHistory": "Txat-historiaren ikusgaitasuna", "@visibilityOfTheChatHistory": { "type": "text", "placeholders": {} }, - "visibleForAllParticipants": "Partehartzaile guztientzat ikusgai", + "visibleForAllParticipants": "Partaide guztientzat ikusgai", "@visibleForAllParticipants": { "type": "text", "placeholders": {} @@ -1546,42 +1146,27 @@ "type": "text", "placeholders": {} }, - "waitingPartnerAcceptRequest": "Bikotearen zain eskaera onartu dezan…", + "waitingPartnerAcceptRequest": "Kideak eskaera onartuko zain…", "@waitingPartnerAcceptRequest": { "type": "text", "placeholders": {} }, - "waitingPartnerEmoji": "Bikotearen zain emojia onartu dezan…", + "waitingPartnerEmoji": "Kideak emojia onartuko zain…", "@waitingPartnerEmoji": { "type": "text", "placeholders": {} }, - "waitingPartnerNumbers": "Bikotearen zain zenbakia onartu dezan…", + "waitingPartnerNumbers": "Kideak zenbakiak onartuko zain…", "@waitingPartnerNumbers": { "type": "text", "placeholders": {} }, - "wallpaper": "Horma-irudia", + "wallpaper": "Horma-irudia:", "@wallpaper": { "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Puntuz puntuko zifraketa Beta fasean dago!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Asteazkena", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Ongi etorri Matrix sareko bat-bateko mezularitza programa moñoñoenera.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Nork duen baimena talde honetan sartzeko", + "whoIsAllowedToJoinThisGroup": "Nor batu daiteke talde honetara?", "@whoIsAllowedToJoinThisGroup": { "type": "text", "placeholders": {} @@ -1601,38 +1186,18 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Txat honetara gonbidatu zaituzte", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Ez duzu txat honetan parte hartzen honezkero", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Ezin duzu zure burua gonbidatu", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Txat honetan debekatu zaituzte", + "youHaveBeenBannedFromThisChat": "Txat honetan debekua ezarri dizute", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Zure erabiltzaile propioa", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Talde publikoak", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Editatu gelako goitizenak", - "@editRoomAliases": { + "editRoomAliases": "Editatu gelaren aliasak", + "@editRoomAliases": { "type": "text", "placeholders": {} }, @@ -1647,26 +1212,26 @@ "@placeCall": {}, "voiceCall": "Ahozko deia", "@voiceCall": {}, - "unsupportedAndroidVersion": "Android bertsioarekin arazoa", + "unsupportedAndroidVersion": "Android bertsioa ez da bateragarria", "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "Funtzio honek Android bertsio berriago bat behar du. Mesedez, egiaztatu eguneraketan dauden eta begiratu Lineage OS-ek zure gailuarentzat aukerarik eskaintzen duen.", + "unsupportedAndroidVersionLong": "Funtzio honek Android bertsio berriago bat behar du. Egiaztatu eguneraketak ote dauden edo begiratu Lineage OS-ek zure gailuarentzat aukerarik eskaintzen duen.", "@unsupportedAndroidVersionLong": {}, "commandHint_ban": "Debekatu erabiltzailea gela honetan", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" }, - "commandHint_clearcache": "Ezabatu cachea", + "commandHint_clearcache": "Ezabatu katxea", "@commandHint_clearcache": { "type": "text", "description": "Usage hint for the command /clearcache" }, - "commandHint_create": "Sortu taldeko-gela huts bat\nErabili --no-encyption zifratzea desgaitzeko", + "commandHint_create": "Sortu taldeko-txat huts bat\nErabili --no-encyption zifratzea desgaitzeko", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" }, - "commandHint_op": "Zehaztu erabiltzaile honen botere-maila (lehenetsia: 50)", + "commandHint_op": "Zehaztu erabiltzaile honen botere-maila (defektuz: 50)", "@commandHint_op": { "type": "text", "description": "Usage hint for the command /op" @@ -1676,7 +1241,7 @@ "type": "text", "description": "Usage hint for the command /plain" }, - "commandHint_react": "Bidali erantzuna erreakzioa bailitzan", + "commandHint_react": "Bidali erantzuna erreakzio gisa", "@commandHint_react": { "type": "text", "description": "Usage hint for the command /react" @@ -1691,22 +1256,12 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "Ezeztatu eta ez galdetu berriro", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Moldatu blokeatutako zerbitzariak", + "editBlockedServers": "Editatu blokeatutako zerbitzariak", "@editBlockedServers": { "type": "text", "placeholders": {} }, - "editChatPermissions": "Moldatu txat-baimenak", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Moldatu gelaren avatarra", + "editRoomAvatar": "Gelaren abatarra editatu", "@editRoomAvatar": { "type": "text", "placeholders": {} @@ -1716,13 +1271,11 @@ "type": "text", "placeholders": {} }, - "enterAnEmailAddress": "Idatzi helbide elektroniko bat", + "enterAnEmailAddress": "Sartu helbide elektroniko bat", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Idatzi gunerako izena", - "@enterASpacepName": {}, "homeserver": "Zerbitzaria", "@homeserver": {}, "errorObtainingLocation": "Errorea kokapena lortzerakoan: {error}", @@ -1747,22 +1300,17 @@ "type": "text", "placeholders": {} }, - "friends": "Lagunak", - "@friends": { - "type": "text", - "placeholders": {} - }, "groups": "Taldeak", "@groups": { "type": "text", "placeholders": {} }, - "hideRedactedEvents": "Izkutatu ezabatutakoak", + "hideRedactedEvents": "Ezkutatu atzera botatako gertaerak", "@hideRedactedEvents": { "type": "text", "placeholders": {} }, - "hideUnknownEvents": "Izkutatu gertaera ezezagunak", + "hideUnknownEvents": "Ezkutatu gertaera ezezagunak", "@hideUnknownEvents": { "type": "text", "placeholders": {} @@ -1772,19 +1320,7 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Helbide elektronikoa ez da baliogarria", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "shareYourInviteLink": "Partekatu gonbidapen esteka", - "@shareYourInviteLink": {}, - "noStatusesFound": "Ez da egoerarik aurkitu oraingoz.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Kontu honentzat gaitutako jakinarazpenak", + "notificationsEnabledForThisAccount": "Gaitu kontu honentzako jakinarazpenak", "@notificationsEnabledForThisAccount": { "type": "text", "placeholders": {} @@ -1801,18 +1337,18 @@ "type": "text", "placeholders": {} }, - "oneClientLoggedOut": "Zure gailuetako batek saioa itxi du", + "oneClientLoggedOut": "Zure gailuetako batek saioa amaitu du", "@oneClientLoggedOut": {}, "addAccount": "Gehitu kontua", "@addAccount": {}, - "editBundlesForAccount": "Moldatu kontu honetarako sortak", + "editBundlesForAccount": "Editatu kontu honetarako sortak", "@editBundlesForAccount": {}, - "oopsPushError": "Hara! Zoritxarrez, errore bat gertatu da jakinarazpenak ezartzerakoan.", + "oopsPushError": "Hara! Zoritxarrez, errore bat gertatu da push jakinarazpenak ezartzerakoan.", "@oopsPushError": { "type": "text", "placeholders": {} }, - "pleaseChoose": "Mesedez, aukeratu", + "pleaseChoose": "Aukeratu", "@pleaseChoose": { "type": "text", "placeholders": {} @@ -1827,75 +1363,30 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Soinua, dardara, LED kolorea", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{irakurri gabeko txat 1} other {{unreadCount} txat irakurri gabe}}", + "unreadChats": "{unreadCount, plural, =1{irakurri gabeko txat 1} other {irakurri gabeko {unreadCount} txat}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{irakurri gabeko txat bat} other {{unreadEvents} mezu irakurri gabe}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "userNotVerified": "Erabiltzailea ez da egiaztatu", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Erabiltzailearen egiaztaketa egoera ezezaguna da", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Ulertzen dut", - "@iUnderstand": {}, - "videoCallsBetaWarning": "Mesedez, kontuan izan bideo deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.", + "videoCallsBetaWarning": "Kontuan izan bideo-deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.", "@videoCallsBetaWarning": {}, - "toggleMuted": "Piztu / Itzali mututuak", + "toggleMuted": "Ikusi / Ezkutatu mutututakoak", "@toggleMuted": { "type": "text", "placeholders": {} }, - "audioPlayerPause": "Gelditu", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Zure storya", - "@yourStory": {}, - "replyHasBeenSent": "Erantzuna bidali da", - "@replyHasBeenSent": {}, "all": "Guztia", "@all": { "type": "text", "placeholders": {} }, - "loginWithOneClick": "Hasi saioa klik bakarrarekin", - "@loginWithOneClick": {}, "next": "Hurrengoa", "@next": { "type": "text", "placeholders": {} }, - "storyFrom": "{date}ko storya:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Mesedez, kontuan izan jendeak bata bestea ikusi eta harremanetan jar daitekeela zure storyan.", - "@whoCanSeeMyStoriesDesc": {}, "experimentalVideoCalls": "Bideo-dei esperimentalak", "@experimentalVideoCalls": {}, "emailOrUsername": "ePosta edo erabiltzaile-izena", @@ -1923,7 +1414,7 @@ "type": "text", "placeholders": {} }, - "redactMessage": "Izkutatu mezua", + "redactMessage": "Bota mezua atzera", "@redactMessage": { "type": "text", "placeholders": {} @@ -1933,12 +1424,12 @@ "type": "text", "placeholders": {} }, - "pleaseFollowInstructionsOnWeb": "Mesedez, jarrai itzazu webguneko argibideak eta sakatu Hurrengoa.", + "pleaseFollowInstructionsOnWeb": "Jarraitu webguneko argibideak eta sakatu 'Hurrengoa'.", "@pleaseFollowInstructionsOnWeb": { "type": "text", "placeholders": {} }, - "reason": "Zergatia", + "reason": "Arrazoia", "@reason": { "type": "text", "placeholders": {} @@ -1953,33 +1444,17 @@ "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Zure txatak sinkronizatzen ari dira…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Zure gako publikoa", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "zoomOut": "Urrundu", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "messageType": "Mezu mota", "@messageType": {}, "time": "Ordua", "@time": {}, "dismiss": "Baztertu", "@dismiss": {}, - "matrixWidgets": "Matrixen widgetak", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Oraindik ez da posible widget eta integrazioak moldatzea.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Moldatu widget eta integrazioak", - "@editIntegrations": {}, "switchToAccount": "Aldatu {number} kontura", "@switchToAccount": { "type": "number", @@ -1989,34 +1464,19 @@ }, "previousAccount": "Aurreko kontua", "@previousAccount": {}, - "edit": "Moldatu", + "edit": "Editatu", "@edit": { "type": "text", "placeholders": {} }, - "mention": "Aipamena", + "mention": "Aipatu", "@mention": { "type": "text", "placeholders": {} }, - "whatIsGoingOn": "Zertan zabiltza?", - "@whatIsGoingOn": {}, - "addDescription": "Gehitu deskribapena", - "@addDescription": {}, - "passwordsDoNotMatch": "Pasahitzak ez datoz bat!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Mesedez, idatzi baliozko ePosta helbide bat.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Berridatzi pasahitza", + "repeatPassword": "Idatzi berriro pasahitza", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Mesedez, aukeratu gutxienez {min} karaktere.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "addEmail": "Gehitu eposta", + "addEmail": "Gehitu ePosta", "@addEmail": { "type": "text", "placeholders": {} @@ -2041,24 +1501,14 @@ "type": "text", "placeholders": {} }, - "zoomIn": "Gerturatu", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Abiarazi", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatikoki abiarazi sticker eta emote animatuak", + "autoplayImages": "Automatikoki abiarazi pegatina eta emote animatuak", "@autoplayImages": { "type": "text", "placeholder": {} }, "sendOnEnter": "Bidali enter sakatuz", "@sendOnEnter": {}, - "badServerVersionsException": "Zerbitzariak ondorengo ezaugarriak onartzen ditu:\n{serverVersions}\nBaina aplikazioak hauek baino ez: {supportedVersions}", + "badServerVersionsException": "Zerbitzariak ondorengo ezaugarriak onartzen ditu:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu bakarrik: {supportedVersions}", "@badServerVersionsException": { "type": "text", "placeholders": { @@ -2088,36 +1538,29 @@ "type": "text", "placeholders": {} }, - "changeYourAvatar": "Aldatu avatarra", + "changeYourAvatar": "Aldatu abatarra", "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "yourUserId": "Zure erabiltzaile IDa:", - "@yourUserId": {}, "chatBackup": "Txataren babeskopia", "@chatBackup": { "type": "text", "placeholders": {} }, - "chatBackupDescription": "Zure txaten babeskopiek segurtasun-gako batekin daude babestuta. Mesedez, ez ezazu gako hori galdu.", + "chatBackupDescription": "Txat zaharrak berreskuratze-gako batekin daude babestuta. Ez galdu gako hori.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, "chatHasBeenAddedToThisSpace": "Txata gune honetara gehitu da", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Txata gune honetatik kendu da", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Konfiguratu txata", + "configureChat": "Txata konfiguratu", "@configureChat": { "type": "text", "placeholders": {} }, - "contentHasBeenReported": "Edukia zerbitzariko administrariei jakinarazi zaie", + "contentHasBeenReported": "Edukia zerbitzariko administratzaileei jakinarazi zaie", "@contentHasBeenReported": { "type": "text", "placeholders": {} @@ -2127,27 +1570,17 @@ "type": "text", "placeholders": {} }, - "publicKey": "Gako publikoa", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Gune publikoa", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Ezarri goitizen nagusi bezala", + "setAsCanonicalAlias": "Ezarri alias nagusi bezala", "@setAsCanonicalAlias": { "type": "text", "placeholders": {} }, - "setCustomEmotes": "Ezarri neurrira egindako emoteak", + "setCustomEmotes": "Ezarri zure emoteak", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "appLock": "Aplikazioaren blokeoa", + "appLock": "Aplikazioa blokeatzea", "@appLock": { "type": "text", "placeholders": {} @@ -2159,12 +1592,7 @@ "type": "text", "placeholders": {} }, - "addNewFriend": "Gehitu lagun berria", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Zerbitzariak ondorengo aukerak ditu saioa hasteko:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu:\n{supportedVersions}", + "badServerLoginTypesException": "Zerbitzariak ondorengo aukerak onartzen ditu saioa hasteko:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu bakarrik:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", "placeholders": { @@ -2172,12 +1600,7 @@ "supportedVersions": {} } }, - "bubbleSize": "Puxiken tamaina", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "commandHint_dm": "Hasi txat zuzen bat\nErabili --no-encryption zifratzea desgaitu nahi baduzu", + "commandHint_dm": "Hasi banakako txat bat\nErabili --no-encyption zifratzea desgaitzeko", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2192,11 +1615,11 @@ "type": "text", "placeholders": {} }, - "commandInvalid": "Komandoa ez da baliogarria", + "commandInvalid": "Komandoa ez da baliozkoa", "@commandInvalid": { "type": "text" }, - "commandHint_myroomnick": "Ezarri izengoiti bat gela honetarako", + "commandHint_myroomnick": "Ezarri zure ezizena gela honetarako", "@commandHint_myroomnick": { "type": "text", "description": "Usage hint for the command /myroomnick" @@ -2206,36 +1629,31 @@ "type": "text", "placeholders": {} }, - "containsUserName": "erabiltzaile izena dauka", + "containsUserName": "Erabiltzaile-izena dauka", "@containsUserName": { "type": "text", "placeholders": {} }, - "containsDisplayName": "pantaila-izena dauka", + "containsDisplayName": "Ezizena dauka", "@containsDisplayName": { "type": "text", "placeholders": {} }, - "locationDisabledNotice": "Kokapen zerbitzuak ez daude gaituta. Mesedez, gaitu itzazu zure kokapena partekatu ahal izateko.", + "locationDisabledNotice": "Kokapen zerbitzuak ezgaituta daude. Gaitu zure kokapena partekatu ahal izateko.", "@locationDisabledNotice": { "type": "text", "placeholders": {} }, - "directChats": "Txat zuzenak", + "directChats": "Banakako txatak", "@directChats": { "type": "text", "placeholders": {} }, - "enableEncryption": "Gaitu zifraketa", + "enableEncryption": "Gaitu zifratzea", "@enableEncryption": { "type": "text", "placeholders": {} }, - "ignoreUsername": "Ezikusi erabiltzailea", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Estekan sakatu dut", "@iHaveClickedOnLink": { "type": "text", @@ -2246,8 +1664,6 @@ "type": "text", "placeholders": {} }, - "typeInInviteLinkManually": "Eskuz idatzi gonbidapen esteka…", - "@typeInInviteLinkManually": {}, "online": "Linean", "@online": { "type": "text", @@ -2258,7 +1674,7 @@ "type": "text", "placeholders": {} }, - "pleaseEnter4Digits": "Mesedez, idatzi lau zenbaki edo utzi hutsik aplikazioa babestu nahi ez baduzu.", + "pleaseEnter4Digits": "Sartu lau zenbaki edo utzi hutsik aplikazioa babestu nahi ez baduzu.", "@pleaseEnter4Digits": { "type": "text", "placeholders": {} @@ -2273,11 +1689,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Sakatu gailu batean egiaztatzeko", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "withTheseAddressesRecoveryDescription": "Helbide hauekin pasahitza berreskuratu dezakezu.", "@withTheseAddressesRecoveryDescription": { "type": "text", @@ -2295,13 +1706,9 @@ "size": {} } }, - "removeFromSpaceDescription": "Honek txata uneko gunetik kenduko du. Ikusgai egoten jarraituko du \"Txat guztiak\" atalean.", - "@removeFromSpaceDescription": {}, - "openGallery": "Ireki galeria", + "openGallery": "Ireki bilduma", "@openGallery": {}, - "storyPrivacyWarning": "Mesedez, kontuan izan jendeak bata bestea ikus dezakeela eta bata bestearekin harremanetan jar daitekeela. Zure storya 24 orduz egongo da ikusgai baina ezin da ziurtatu gailu eta zerbitzari guztietatik ezabatuko denik denbora pasatakoan.", - "@storyPrivacyWarning": {}, - "pinMessage": "Iltzatu gelan", + "pinMessage": "Finkatu gelan", "@pinMessage": {}, "reactedWith": "{sender}(e)k {reaction}(r)ekin erreakzionatu du", "@reactedWith": { @@ -2311,32 +1718,16 @@ "reaction": {} } }, - "confirmEventUnpin": "Ziur zaude gertaerari iltzea kendu nahi diozula?", + "confirmEventUnpin": "Ziur zaude gertaera finaktzeari utzi nahi diozula?", "@confirmEventUnpin": {}, - "moreEvents": "{count,plural, =1{gertaera 1 gehiago} other {{count} gertaera gehiago}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "nextAccount": "Hurrengo kontua", "@nextAccount": {}, - "markAsRead": "Markatu irakurrita gisa", + "markAsRead": "Markatu irakurritzat", "@markAsRead": {}, - "iWroteDownTheKey": "Idatzi dut gakoa", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Txaten babeskopiak ezarri dira.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Mezuak babestearren, sagurtasun gako bat sortu dugu zuretzat.\nMesedez, gorde ezazu toki seguru batean, pasahitz-kudeatzaile batean adibidez.", - "@setupChatBackupDescription": {}, "clearArchive": "Ezabatu artxiboa", "@clearArchive": {}, - "clearText": "Ezabatu testua", - "@clearText": { - "type": "text", - "placeholders": {} - }, "commandHint_html": "Bidali testua HTML formatuan", "@commandHint_html": { "type": "text", @@ -2347,7 +1738,7 @@ "type": "text", "description": "Usage hint for the command /invite" }, - "commandHint_join": "Sartu gela horretara", + "commandHint_join": "Batu gelara", "@commandHint_join": { "type": "text", "description": "Usage hint for the command /join" @@ -2357,17 +1748,17 @@ "type": "text", "description": "Usage hint for the command /kick" }, - "commandHint_me": "Deskriba zaitez", + "commandHint_me": "Deskribatu zure burua", "@commandHint_me": { "type": "text", "description": "Usage hint for the command /me" }, - "commandHint_myroomavatar": "Ezarri irudi bat gela honetarako (by mxc-uri)", + "commandHint_myroomavatar": "Ezarri zure irudia gela honetarako (mxc-uri bidez)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" }, - "commandHint_unban": "Baimendu erabiltzailea gela honetan", + "commandHint_unban": "Kendu erabiltzaileak gela honetan duen debekua", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" @@ -2385,14 +1776,12 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "setupChatBackup": "Ezarri txaten babeskopiak", - "@setupChatBackup": {}, "deactivateAccountWarning": "Honek zure kontua desaktibatuko du. Ezin da desegin! Ziur zaude?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Lehenetsitako botere-maila", + "defaultPermissionLevel": "Erabiltzaile berrien defektuzko botere-maila", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2407,32 +1796,12 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Zifraketa segurua da soilik gailu guztiak egiaztatu badira.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "discover": "Deskubritu", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Diskubritu taldeak", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emote sortak gelarako", + "emotePacks": "Gelarako emote-sortak", "@emotePacks": { "type": "text", "placeholders": {} }, - "enableChatBackup": "Gaitu txat babeskopiak sarbidea inoiz gal ez dezazun.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Gaitu emote sorta txat guztietarako", + "enableEmotesGlobally": "Gaitu emote-sorta txat guztietarako", "@enableEmotesGlobally": { "type": "text", "placeholders": {} @@ -2447,17 +1816,12 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Molestatzen zaituzten erabiltzaileak ez ikusi ditzakezu. Ez dituzu beraien mezurik jasoko edota gonbidapenik, ezikusitako pertsonen zerrendatik.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, "inoffensive": "Ez da iraingarria", "@inoffensive": { "type": "text", "placeholders": {} }, - "locationPermissionDeniedNotice": "Kokapen baimena ukatu da. Mesedez, eman ezazu zure kokapena partekatzeko.", + "locationPermissionDeniedNotice": "Kokapen baimena ukatu da. Eman zure kokapena partekatzeko baimena.", "@locationPermissionDeniedNotice": { "type": "text", "placeholders": {} @@ -2477,12 +1841,7 @@ "type": "text", "placeholders": {} }, - "noDescription": "Ez dago deskribapenik", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Zifraketa aktiba dezakezu soilik gela publikoa ez bada.", + "noEncryptionForPublicRooms": "Zifratzea aktiba dezakezu soilik gelak publikoa izateari utzi badio.", "@noEncryptionForPublicRooms": { "type": "text", "placeholders": {} @@ -2495,20 +1854,9 @@ "server2": {} } }, - "createNewChatExplaination": "QR kodea eskaneatu edota elkarren ondoan ez bazaudete, partekatu gonbidapen esteka.", - "@createNewChatExplaination": {}, "scanQrCode": "Eskaneatu QR kodea", "@scanQrCode": {}, - "newPasswordDescription": "Pasahitza berreskuratu ahal izateko, posta elektroniko bat gehitu beharko zenuke zure kontuan.", - "@newPasswordDescription": {}, - "newUsernameDescription": "Zure erabiltzaile IDak honako formatua izango du: @erabiltzailea:zerbitzaria", - "@newUsernameDescription": {}, - "noPublicRoomsFound": "Ez da gela publikorik aurkitu…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Kokapena lortzen…", + "obtainingLocation": "Kokapena atzitzen…", "@obtainingLocation": { "type": "text", "placeholders": {} @@ -2532,12 +1880,12 @@ "type": "text", "placeholders": {} }, - "participant": "Partehartzailea", + "participant": "Partaide", "@participant": { "type": "text", "placeholders": {} }, - "passwordForgotten": "Ahaztu zait pasahitza", + "passwordForgotten": "Pasahitza ahaztu dut", "@passwordForgotten": { "type": "text", "placeholders": {} @@ -2557,27 +1905,22 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAPasscode": "Mesedez, aukeratu kode bat", + "pleaseChooseAPasscode": "Aukeratu sartzeko kode bat", "@pleaseChooseAPasscode": { "type": "text", "placeholders": {} }, - "pleaseClickOnLink": "Mesedez, sakatu epostako estekan eta ondoren jarraitu.", + "pleaseClickOnLink": "Sakatu ePostako estekan eta ondoren jarraitu.", "@pleaseClickOnLink": { "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "Mesedez, idatzi zure babes-gakoa:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Mesedez, idatzi zure zenbakia", + "pleaseEnterYourPin": "Sartu zure PINa", "@pleaseEnterYourPin": { "type": "text", "placeholders": {} }, - "removeYourAvatar": "Kendu zure avatarra", + "removeYourAvatar": "Kendu zure abatarra", "@removeYourAvatar": { "type": "text", "placeholders": {} @@ -2587,51 +1930,21 @@ "type": "text", "placeholders": {} }, - "savedFileAs": "Fitxategia {filename} izenarekin gorde da", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFileToFolder": "Gorde fitxategia hemen", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Segurtasun gakoa", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Galdu al duzu segurtasun gakoa?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{{username}(e)k eta beste {count}(e)k ikusi dute}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, "sendAsText": "Bidali testu bezala", "@sendAsText": { "type": "text" }, - "sendMessages": "Bidali mezuak", + "sendMessages": "Mezuak bidali", "@sendMessages": { "type": "text", "placeholders": {} }, - "sendSticker": "Bidali stickerra", + "sendSticker": "Bidali pegatina", "@sendSticker": { "type": "text", "placeholders": {} }, - "setPermissionsLevel": "Ezarri baimen maila", + "setPermissionsLevel": "Ezarri baimen-maila", "@setPermissionsLevel": { "type": "text", "placeholders": {} @@ -2656,27 +1969,22 @@ "type": "text", "placeholders": {} }, - "synchronizingPleaseWait": "Sinkronizatzen… Mesedez, itxaron.", + "synchronizingPleaseWait": "Sinkronizatzen… itxaron.", "@synchronizingPleaseWait": { "type": "text", "placeholders": {} }, - "tapToShowImage": "Sakatu irudia ikusteko", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Piztu / Itzali gogokoa", + "toggleFavorite": "Ikusi / Ezkutatu gogokoak", "@toggleFavorite": { "type": "text", "placeholders": {} }, - "toggleUnread": "Markatu irakurrita / irakurri gabe gisa", + "toggleUnread": "Markatu irakurrita / irakurri gabe", "@toggleUnread": { "type": "text", "placeholders": {} }, - "tooManyRequestsWarning": "Eskaera gehiegi. Mesedez, saia zaitez geroago!", + "tooManyRequestsWarning": "Eskaera gehiegi. Saiatu berriro geroago!", "@tooManyRequestsWarning": { "type": "text", "placeholders": {} @@ -2691,17 +1999,7 @@ "type": "text", "placeholders": {} }, - "unlockChatBackup": "Desblokeatu txataren babeskopia", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Erabiltzailea egiaztatu da", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "Egiaztatu gabe", + "unverified": "Egiaztatu gabe(a)", "@unverified": {}, "verified": "Egiaztatuta", "@verified": { @@ -2718,79 +2016,47 @@ "type": "text", "placeholders": {} }, - "whoCanPerformWhichAction": "Nork egin dezakeen zer", + "whoCanPerformWhichAction": "Nork zer egin dezakeen", "@whoCanPerformWhichAction": { "type": "text", "placeholders": {} }, - "wipeChatBackup": "Ezabatu txataren babeskopia segurtasun-gako berria sortzeko?", + "wipeChatBackup": "Ezabatu txataren babeskopia berreskuratze-gako berria sortzeko?", "@wipeChatBackup": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "{homeserver}(e)ra konektatuko zara", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "messageInfo": "Mezuaren xehetasunak", "@messageInfo": {}, "sender": "Igorlea", "@sender": {}, "removeFromSpace": "Kendu gunetik", "@removeFromSpace": {}, - "addToSpaceDescription": "Aukeratu gune bat txat hau gehitzeko.", + "addToSpaceDescription": "Hautatu gune bat txat hau bertara gehitzeko.", "@addToSpaceDescription": {}, "start": "Hasi", "@start": {}, - "setupChatBackupNow": "Ezarri txaten babeskopia orain", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Txaten babeskopiak desblokeatzeko, mesedez, idatzi aurreko saioan sortutako segurtasun-gakoa. Segurtasun-gakoa EZ da zure pasahitza.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Gorde segurtasun-gakoa orain", - "@saveTheSecurityKeyNow": {}, - "addToStory": "Gehitu storyra", - "@addToStory": {}, "publish": "Argitaratu", "@publish": {}, - "whoCanSeeMyStories": "Nork ikus ditzazke nire storyak?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Storyak jasotzeari utzi", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Erabiltzaile honek oraindik ez du ezer argitaratu bere storyetan", - "@thisUserHasNotPostedAnythingYet": {}, "reportUser": "Salatu erabiltzailea", "@reportUser": {}, "openChat": "Ireki txata", "@openChat": {}, - "pinnedEventsError": "Errorea iltzatutako mezua kargatzerakoan", - "@pinnedEventsError": {}, "addWidget": "Gehitu widgeta", "@addWidget": {}, - "showSpaces": "Erakutsi guneen zerrenda", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Erakutsi zerikusia duten Mezu Zuzenak Taldeetan", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "editWidgets": "Editatu widgetak", - "@editWidgets": {}, "widgetVideo": "Bideoa", "@widgetVideo": {}, "widgetEtherpad": "Testu-oharra", "@widgetEtherpad": {}, "widgetJitsi": "Jitsi Meet", "@widgetJitsi": {}, - "widgetCustom": "Neurrira egindakoa", + "widgetCustom": "Norberak ezarritakoa", "@widgetCustom": {}, "widgetName": "Izena", "@widgetName": {}, - "youJoinedTheChat": "Txatera sartu zara", + "youJoinedTheChat": "Txatera batu zara", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Gonbidapena onartu duzu", + "youAcceptedTheInvitation": "👍 Gonbidapena onartu duzu", "@youAcceptedTheInvitation": {}, "youBannedUser": "{user}(r)i debekua ezarri diozu", "@youBannedUser": { @@ -2804,25 +2070,25 @@ "user": {} } }, - "youInvitedBy": "{user}(e)k gonbidatu zaitu", + "youInvitedBy": "📩 {user}(e)k gonbidatu zaitu", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "{user} gonbidatu duzu", + "youInvitedUser": "📩 {user} gonbidatu duzu", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "{user} kanporatu duzu", + "youKicked": "👞 {user} kanporatu duzu", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "{user} kanporatu eta debekua ezarri diozu", + "youKickedAndBanned": "🙅 {user} kanporatu eta debekua ezarri diozu", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2836,15 +2102,797 @@ }, "youRejectedTheInvitation": "Gonbidapena baztertu duzu", "@youRejectedTheInvitation": {}, - "separateChatTypes": "Bereizi Mezu Zuzenak, Taldeak eta Guneak", + "separateChatTypes": "Bereizi banakako mezuak eta taldeak", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "widgetUrlError": "Ez da baliozko URL bat.", + "widgetUrlError": "Ez da baliozko URLa.", "@widgetUrlError": {}, - "widgetNameError": "Mesedez, ezarri/zehaztu izen publiko bat.", + "widgetNameError": "Zehaztu ezizen bat.", "@widgetNameError": {}, "errorAddingWidget": "Errorea widgeta gehitzerakoan.", - "@errorAddingWidget": {} + "@errorAddingWidget": {}, + "pleaseEnterRecoveryKey": "Sartu berreskuratze-gakoa:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Berreskuratze-gakoa", + "@recoveryKey": {}, + "recoveryKeyLost": "Berreskuratze-gakoa galdu duzu?", + "@recoveryKeyLost": {}, + "users": "Erabiltzaileak", + "@users": {}, + "storeInAndroidKeystore": "Gorde Android KeyStore-n", + "@storeInAndroidKeystore": {}, + "dehydrate": "Esportatu saioa eta ezabatu gailua", + "@dehydrate": {}, + "dehydrateWarning": "Ekintza hau ezin da desegin. Egiaztatu babeskopia toki seguruan gorde duzula.", + "@dehydrateWarning": {}, + "hydrate": "Lehengoratu babeskopia bat erabiliz", + "@hydrate": {}, + "pleaseEnterRecoveryKeyDescription": "Mezu zaharrak ikusi ahal izateko, sartu aurreko saioan sortu zen berreskuratze-gakoa. Berreskuratze-gakoa EZ da zure pasahitza.", + "@pleaseEnterRecoveryKeyDescription": {}, + "indexedDbErrorLong": "Mezuen artxibatzea ez dago defektuz gaituta modu pribatua erabiltzean.\nGaitzeko:\n - about:config\n - dom.indexedDB.privateBrowsing.enabled aukerak true erakutsi dezala\nBestela ezin da FluffyChat erabili.", + "@indexedDbErrorLong": {}, + "storeSecurlyOnThisDevice": "Gorde gailu honetan modu seguruan", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} fitxategi", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "user": "Erabiltzailea", + "@user": {}, + "custom": "Neurrira egindakoa", + "@custom": {}, + "storeInSecureStorageDescription": "Gorde berreskuratze-gakoa gailu honetako biltegiratze seguruan.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Gorde Apple KeyChain-en", + "@storeInAppleKeyChain": {}, + "unlockOldMessages": "Desblokeatu mezu zaharrak", + "@unlockOldMessages": {}, + "dehydrateTorLong": "TOR erabiltzaileentzat gomendioa leihoa itxi baino lehen saioa esportatzea da.", + "@dehydrateTorLong": {}, + "hydrateTorLong": "Esportatu al zenuen zure saioa TOR erabili zenuen azken aldian? Inportatu segidan eta jarraitu txateatzen.", + "@hydrateTorLong": {}, + "dehydrateTor": "TOR Erabiltzaileak: Esportatu saioa", + "@dehydrateTor": {}, + "hydrateTor": "TOR Erabiltzaileak: Inportatu esportatutako saioa", + "@hydrateTor": {}, + "saveKeyManuallyDescription": "Gorde eskuz gako hau gailuko partekatze-menua edo arbela erabiliz.", + "@saveKeyManuallyDescription": {}, + "indexedDbErrorTitle": "Arazoak modu pribatuarekin", + "@indexedDbErrorTitle": {}, + "confirmMatrixId": "Baieztatu zure Matrix IDa kontua ezabatu ahal izateko.", + "@confirmMatrixId": {}, + "newSpace": "Gune berria", + "@newSpace": {}, + "enterRoom": "Sartu gelara", + "@enterRoom": {}, + "whyIsThisMessageEncrypted": "Zergatik ezin da mezu hau irakurri?", + "@whyIsThisMessageEncrypted": {}, + "allSpaces": "Gune guztiak", + "@allSpaces": {}, + "newGroup": "Talde berria", + "@newGroup": {}, + "enterSpace": "Sartu gunera", + "@enterSpace": {}, + "appearOnTopDetails": "Aplikazioa goikaldean agertzea baimentzen du (ez da beharrezkoa FluffyChat deitzeko kontutzat ezarri baduzu)", + "@appearOnTopDetails": {}, + "screenSharingTitle": "pantaila-partekatzea", + "@screenSharingTitle": {}, + "screenSharingDetail": "Pantaila FluffyChaten partekatzen ari zara", + "@screenSharingDetail": {}, + "callingPermissions": "Deitzeko baimenak", + "@callingPermissions": {}, + "callingAccount": "Deitzen ari den kontua", + "@callingAccount": {}, + "callingAccountDetails": "Baimendu FluffyChat Android gailuko telefono-markagailua erabiltzea.", + "@callingAccountDetails": {}, + "appearOnTop": "Gainean erakutsi", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofono, kamera eta FluffyChaten beste baimen batzuk", + "@otherCallingPermissions": {}, + "numChats": "{number} txat", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Ezkutatu garrantzirik gabeko gertaerak", + "@hideUnimportantStateEvents": {}, + "noKeyForThisMessage": "Mezua gailu honetan saioa hasi baino lehen bidali bazen gertatu daiteke.\n\nBeste aukera bat igorleak zure gailua blokeatu izana da, edo zerbaitek huts egin izana interneteko konexioan.\n\nMezua beste saio batean irakur dezakezu? Hala bada, mezua transferitu dezakezu! Zoaz Ezrpenetara > Gailuak eta baieztatu zure gailuek bata bestea egiaztatu dutela. Gela irekiko duzun hurrengo aldian eta bi saioak aurreko planoan irekita daudenean, gakoak automatikoki partekatuko dira.\n\nEz duzu gakorik galdu nahi saioa amaitu edo gailuak aldatzen dituzunean? Baieztatu ezarpenetan txaten babeskopiak gaituta dituzula.", + "@noKeyForThisMessage": {}, + "supposedMxid": "Hau {mxid} izan behar da", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasgroup": "Markatu talde bezala", + "@commandHint_markasgroup": {}, + "foregroundServiceRunning": "Jakinarazpen hau zerbitzua martxan dagoenean agertzen da.", + "@foregroundServiceRunning": {}, + "commandHint_markasdm": "Markatu mezu-zuzen gela bezala Matrix ID jakin honentzat", + "@commandHint_markasdm": {}, + "wasDirectChatDisplayName": "Txata hutsik dago ({oldDisplayName} zen lehen)", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "deviceKeys": "Gailuaren gakoak:", + "@deviceKeys": {}, + "noBackupWarning": "Adi! Txataren babeskopia gaitzen ez baduzu, ezingo dituzu zifratutako txatak atzitu. Oso gomendagarria da txaten babeskopia gaitzea saioa amaitu baino lehen.", + "@noBackupWarning": {}, + "doNotShowAgain": "Ez erakutsi berriro", + "@doNotShowAgain": {}, + "fileIsTooBigForServer": "Ezin da bidali! Zerbitzariak gehienez {max}-ko eranskinak onartzen ditu.", + "@fileIsTooBigForServer": {}, + "noOtherDevicesFound": "Ez da beste gailurik aurkitu", + "@noOtherDevicesFound": {}, + "startFirstChat": "Hasi zure lehen txata", + "@startFirstChat": {}, + "newSpaceDescription": "Guneek txatak taldekatzea ahalbidetzen dute eta komunitate pribatu edo publikoak osatzea.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "Segurtasun arrazoiak direla-eta, ezin duzu lehendik zifratuta zegoen txat bateko zifratzea ezgaitu.", + "@disableEncryptionWarning": {}, + "encryptThisChat": "Zifratu txata", + "@encryptThisChat": {}, + "commandHint_hug": "Bidali besarkada", + "@commandHint_hug": {}, + "hugContent": "{senderName}(e)k besarkatu zaitu", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "sorryThatsNotPossible": "Barka… hori ez da posible", + "@sorryThatsNotPossible": {}, + "reopenChat": "Ireki txata berriro", + "@reopenChat": {}, + "commandHint_googly": "Bidali begi dibertigarri batzuk", + "@commandHint_googly": {}, + "commandHint_cuddle": "Bidali besarkada samurra", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName}(e)k begi dibertigarri batzuk bidali dizkizu", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "allRooms": "Talde-txat guztiak", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "jumpToLastReadMessage": "Joan irakurritako azken mezura", + "@jumpToLastReadMessage": {}, + "reportErrorDescription": "😭 O ez! Zerbaitek huts egin du. Nahi izanez gero, eman garatzaileei errorearen berri.", + "@reportErrorDescription": {}, + "cuddleContent": "{senderName}(e)k samurki besarkatu zaitu", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "readUpToHere": "Honaino irakurrita", + "@readUpToHere": {}, + "fileHasBeenSavedAt": "Fitxategia {path}(e)n gorde da", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jump": "Joan", + "@jump": {}, + "openLinkInBrowser": "Ireki esteka nabigatzailean", + "@openLinkInBrowser": {}, + "report": "salatu", + "@report": {}, + "signInWithPassword": "Hasi saioa pasahitzarekin", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Saiatu geroago edo aukeratu beste zerbitzari bat.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Hasi saioa {provider}(r)ekin", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Ez da irudi-fitxategia.", + "@notAnImage": {}, + "importNow": "Inportatu orain", + "@importNow": {}, + "importEmojis": "Inportatu emojiak", + "@importEmojis": {}, + "importFromZipFile": "Inportatu .zip fitxategi batetik", + "@importFromZipFile": {}, + "exportEmotePack": "Esportatu emote-sorta .zip gisa", + "@exportEmotePack": {}, + "replace": "Ordezkatu", + "@replace": {}, + "sendTypingNotifications": "Jakinarazi idazten nagoela", + "@sendTypingNotifications": {}, + "setColorTheme": "Ezarri kolore-gaia:", + "@setColorTheme": {}, + "tryAgain": "Saiatu berriro", + "@tryAgain": {}, + "messagesStyle": "Mezuak:", + "@messagesStyle": {}, + "chatDescription": "Txataren deskribapena", + "@chatDescription": {}, + "invalidServerName": "Zerbitzari-izenak ez du balio", + "@invalidServerName": {}, + "chatPermissions": "Txataren baimenak", + "@chatPermissions": {}, + "setChatDescription": "Ezarri txataren deskribapena", + "@setChatDescription": {}, + "redactedBy": "{username}(e)k atzera bota du", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "optionalRedactReason": "(Aukerakoa) Mezua atzera botatzearen arrazoia…", + "@optionalRedactReason": {}, + "inviteContactToGroupQuestion": "{contact} \"{groupName}\" txatera gonbidatu nahi duzu?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "{username}(e)k atzera bota du \"{reason}\" dela-eta", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "redactMessageDescription": "Mezua elkarrizketa honetako partaide guztientzat botako da atzera. Ezin da desegin.", + "@redactMessageDescription": {}, + "addChatDescription": "Gehitu txataren deskribapena…", + "@addChatDescription": {}, + "directChat": "Banakako txata", + "@directChat": {}, + "wrongPinEntered": "PIN okerra! Saiatu berriro {seconds} segundu barru…", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "noChatDescriptionYet": "Ez da txaterako deskribapenik sortu oraindik.", + "@noChatDescriptionYet": {}, + "chatDescriptionHasBeenChanged": "Txataren deskribapena aldatu da", + "@chatDescriptionHasBeenChanged": {}, + "profileNotFound": "Ezin izan da erabiltzailea zerbitzarian aurkitu. Agian arazo bat dago konexioarekin edo erabiltzailea ez da existitzen.", + "@profileNotFound": {}, + "shareInviteLink": "Partekatu gonbidapen-esteka", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Oraintsu erabilitako emoteak hemen ageriko dira…", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Ezarri gaia:", + "@setTheme": {}, + "createGroup": "Sortu taldea", + "@createGroup": {}, + "invite": "Gonbidatu", + "@invite": {}, + "invalidInput": "Sartu duzunak ez du balio!", + "@invalidInput": {}, + "inviteGroupChat": "📨 Gonbidatu taldeko txatera", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Gonbidatu txat pribatura", + "@invitePrivateChat": {}, + "banUserDescription": "Erabiltzailea txatetik kanporatu eta berriro sartzeko debekua ezarriko zaio; ezingo da berriro sartu debekua kendu arte.", + "@banUserDescription": {}, + "removeDevicesDescription": "Gailu honetako saioa amaituko da eta ezingo duzu mezurik jaso aurrerantzean.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Erabiltzailea txatera berriro sartu ahal izango da berak nahi izanez gero.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push jakinarazpenak ez daude erabilgarri", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Behin erabiltzaile hau administratzaile eginda, litekeena da desegin ezin izatea zuk dituzun baimenak izango dituelako.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Txata artxibategira mugituko da. Beste erabiltzaileek txatetik alde egin duzula ikusi ahal izango dute.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user}(e)k baimena eskatu du", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Gehiago irakurri", + "@learnMore": {}, + "roomUpgradeDescription": "Gela bertsio berri gisa birsortuko da txata. Partaide guztiei jakinaraziko zaie txat berrira aldatu behar direla. Gehiago irakur dezakezu gela bertsioei buruz ondorengo estekan: https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Sartu 0 baino zenbaki handiago bat", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Erabiltzailea txatetik kanporatu da baina ez zaio debekua ezarri. Txat publikoen kasuan, edozein momentutan batu daiteke berriro.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "Sortu talde bat eta gonbidatu partaideak", + "@createGroupAndInviteUsers": {}, + "startConversation": "Hasi elkarrizketa", + "@startConversation": {}, + "groupCanBeFoundViaSearch": "Bilaketa erabiliz aurkitu daiteke taldea", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Zoritxarrez ez da \"{query}\" duen erabiltzailerik aurkitu. Egiaztatu zuzen idatzi duzula.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "yourGlobalUserIdIs": "Zure erabiltzaile-ID orokorra: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Bidali json gordina", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Barka baina ez dirudi berreskuratze-gako zuzena denik.", + "@wrongRecoveryKey": {}, + "groupName": "Taldearen izena", + "@groupName": {}, + "searchChatsRooms": "Bilatu #txatak, @erabiltzaileak…", + "@searchChatsRooms": {}, + "blockListDescription": "Gogaitzen zaituzten erabiltzaileak blokeatu ditzakezu. Ez duzu blokeatutakoen zerrendan dituzun erabiltzaileen mezurik edo gelara batzeko gonbidapenik jasoko.", + "@blockListDescription": {}, + "blockedUsers": "Blokeatutako erabiltzaileak", + "@blockedUsers": {}, + "block": "Blokeatu", + "@block": {}, + "blockUsername": "Ezikusi erabiltzaile-izena", + "@blockUsername": {}, + "databaseMigrationTitle": "Datu-basea optimizatu da", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Itxaron, litekeena da tarte bat behar izatea.", + "@databaseMigrationBody": {}, + "publicSpaces": "Gune publikoak", + "@publicSpaces": {}, + "passwordIsWrong": "Sartu duzun pasahitza okerra da", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Sartu oraingo pasahitza", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Esteka publikoa", + "@publicLink": {}, + "nothingFound": "Ez da ezer aurkitu…", + "@nothingFound": {}, + "newPassword": "Pasahitz berria", + "@newPassword": {}, + "passwordsDoNotMatch": "Pasahitzak ez datoz bat", + "@passwordsDoNotMatch": {}, + "subspace": "Azpi-gunea", + "@subspace": {}, + "select": "Hautatu", + "@select": {}, + "pleaseChooseAStrongPassword": "Aukeratu pasahitz sendo bat", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Gehitu txata edo azpi-gunea", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Utzi hutsik zure egoera garbitzeko.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Batu gunera", + "@joinSpace": {}, + "searchForUsers": "Bilatu @erabiltzaileak…", + "@searchForUsers": {}, + "thisDevice": "Gailu hau:", + "@thisDevice": {}, + "decline": "Baztertu", + "@decline": {}, + "databaseBuildErrorBody": "Ezin da SQlite datu-basea eraiki. Aplikazioa aurreko datu-basea erabiltzen saiatuko da oraingoz. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "Errorea aplikazioa abiaraztean", + "@initAppError": {}, + "sessionLostBody": "Zure saioa galdu da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Aplikazioa babeskopia erabiliz saioa leheneratzen saiatuko da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "youInvitedToBy": "📩 Esteka baten bidez gonbidatu zaituzte:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "transparent": "Gardena", + "@transparent": {}, + "sendReadReceipts": "Bidali irakurri izanaren agiria", + "@sendReadReceipts": {}, + "formattedMessages": "Formatua duten mezuak", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 Egiaztatu beste gailu bat", + "@verifyOtherDevice": {}, + "acceptedKeyVerification": "{sender}(e)k gakoaren egiaztapena onartu du", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender}(e)k gakoen egiaztapena ezeztatu du", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender}(e)k gakoen egiaztapena galdegin du", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "sendReadReceiptsDescription": "Txateko beste partaideek mezu bat irakurri duzula ikus dezakete.", + "@sendReadReceiptsDescription": {}, + "forwardMessageTo": "Birbidali mezua {roomName}(e)ra?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "completedKeyVerification": "{sender}(e)k gakoen egiaztapena osatu du", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} gakoak egiaztatzeko prest dago", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "verifyOtherDeviceDescription": "Beste gailu bat egiaztatzean, gailu horiek gakoak truka ditzakete, eta segurtasun orokorra handitu. 💪 Egiaztapena hasten duzunean, laster-leiho bat agertuko da bi gailuetan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk ikusiko dituzu. Hobe da bi gailuak eskura izatea egiaztapena hasi aurretik. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherUserDescription": "Beste erabiltzaile bat egiaztatzen baduzu, ziur egon zaitezke nori idazten ari zaren. 💪\n\nEgiaztapena hasten duzunean, zuk eta beste erabiltzaileak laster-leiho bat ikusiko duzue aplikazioan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk erakutsiko dira.\n\nBideo-dei bat hastea edo aurrez-aurre batzea da horretarako modurik onena. 👭", + "@verifyOtherUserDescription": {}, + "formattedMessagesDescription": "Erakutsi mezu aberatsen edukia markdown erabiliz, testu lodia esaterako.", + "@formattedMessagesDescription": {}, + "sendTypingNotificationsDescription": "Txateko beste partaideek mezu berri bat idazten ari zarela ikus dezakete.", + "@sendTypingNotificationsDescription": {}, + "verifyOtherUser": "🔐 Egiaztatu beste erabiltzaile bat", + "@verifyOtherUser": {}, + "startedKeyVerification": "{sender}(e)k gakoen egiaztapena hasi du", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presencesToggle": "Erakutsi beste erabiltzaileen egoera-mezuak", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "presenceStyle": "Presentzia:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "incomingMessages": "Jasotako mezuak", + "@incomingMessages": {}, + "hidePresences": "Ezkutatu Egoeren Zerrenda?", + "@hidePresences": {}, + "discover": "Arakatu", + "@discover": {}, + "stickers": "Pegatinak", + "@stickers": {}, + "commandHint_unignore": "Utzi Matrix ID honi muzin egiteari", + "@commandHint_unignore": {}, + "commandHint_ignore": "Muzin egin Matrix ID honi", + "@commandHint_ignore": {}, + "unreadChatsInApp": "{appname}: {unread} mezu irakurri gabe", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "Plataforma honetan ezin da datu-basea zifratu", + "@noDatabaseEncryption": {}, + "usersMustKnock": "Erabiltzaileek baimena eskatu behar dute", + "@usersMustKnock": {}, + "userWouldLikeToChangeTheChat": "{user}(e)k txatera batu nahiko luke.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "knock": "Eskatu baimena", + "@knock": {}, + "knocking": "Baimena eskatzen", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Txata {server}(e)n bilaketa eginez aurkitu daiteke", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "thereAreCountUsersBlocked": "Une honetan {count} erabiltzaile daude blokeatuta.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "appLockDescription": "Blokeatu aplikazioa pin kode batekin erabiltzen ari ez zarenean", + "@appLockDescription": {}, + "accessAndVisibility": "Sarbidea eta ikusgaitasuna", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Nork du txat honetara batzeko baimena eta nola aurkitu daiteke txata.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Emoji eta pegatina propioak", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Gehitu edo partekatu edozein txatetan erabil daitezkeen emoji edo pegatina propioak.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Ezkutatu atzera botatako mezuak", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Norbaitek mezuren bat atzera botaz gero, mezua txatetik kenduko da, abisurik gabe.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Ezkutatu mezuen formatu ezezagun edo baliogabea", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Ikuspegi orokorra", + "@overview": {}, + "notifyMeFor": "Jakinarazi…", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Pasahitza berreskuratzeko ezarpenak", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChats": "Ezkutatu kideen egoera aldaketak txat publikoetan", + "@hideMemberChangesInPublicChats": {}, + "globalChatId": "Txat ID orokorra", + "@globalChatId": {}, + "calls": "Deiak", + "@calls": {}, + "hideMemberChangesInPublicChatsBody": "Ez erakutsi txataren denbora-lerroan norbait txat publikora batu edo txatetik irteten dela, irakurgaitasuna hobetzeko.", + "@hideMemberChangesInPublicChatsBody": {}, + "noOneCanJoin": "Ezin da inor batu", + "@noOneCanJoin": {}, + "noPublicLinkHasBeenCreatedYet": "Oraindik ez da esteka publikorik sortu", + "@noPublicLinkHasBeenCreatedYet": {}, + "userRole": "Erabiltzailearen rola", + "@userRole": {}, + "minimumPowerLevel": "{level} da gutxieneko botere-maila.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "publicChatAddresses": "Txataren helbide publikoak", + "@publicChatAddresses": {}, + "createNewAddress": "Sortu helbide berria", + "@createNewAddress": {}, + "files": "Fitxategiak", + "@files": {}, + "gallery": "Galeria", + "@gallery": {}, + "searchIn": "Bilatu {chat} txatean...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Bilatu gehiago...", + "@searchMore": {}, + "restricted": "Mugatuta", + "@restricted": {}, + "knockRestricted": "Eskatu baimena sarrera mugatua duen txatean", + "@knockRestricted": {}, + "swipeRightToLeftToReply": "Herrestatu eskuin-ezker erantzuteko", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "Ez da beste txatik aurkitu...", + "@noMoreChatsFound": {}, + "unread": "Irakurtzeke", + "@unread": {}, + "space": "Gunea", + "@space": {}, + "joinedChats": "Batu zaren txatak", + "@joinedChats": {}, + "goToSpace": "Joan {space} gunera", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Markatu irakurri gabetzat", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} txat eta {participants} partaide", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "spaces": "Guneak", + "@spaces": {}, + "adminLevel": "{level} - Administratzailea", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeTheChatPermissions": "Aldatu txataren baimenak", + "@changeTheChatPermissions": {}, + "inviteOtherUsers": "Gonbidatu beste erabiltzaileak txat honetara", + "@inviteOtherUsers": {}, + "userLevel": "{level} - Erabiltzailea", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderatzailea", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "sendRoomNotifications": "Bidali @gela jakinarazpena", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Aldatu txataren deskribapena", + "@changeTheDescriptionOfTheGroup": {}, + "changeGeneralChatSettings": "Aldatu txataren ezarpen orokorrak", + "@changeGeneralChatSettings": {}, + "changeTheVisibilityOfChatHistory": "Aldatu txataren historiaren ikusgaitasuna", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Aldatu txataren helbide publiko nagusia", + "@changeTheCanonicalRoomAlias": {}, + "invitedBy": "📩 {user}(e)k gonbidatua", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "updateInstalled": "🎉 {version} bertsioa instalatu da!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Aldaketak", + "@changelog": {}, + "chatPermissionsDescription": "Definitu zer botere-maila behar den txat honetako ekintza jakinetarako. 0, 50 eta 100 botere-mailek erabiltzaileak, moderatzaileak eta administratzaileak ordezkatzen dituzte, baina edozein graduazio posible da.", + "@chatPermissionsDescription": {}, + "sendCanceled": "Bidalketa bertan behera utzi da", + "@sendCanceled": {}, + "noChatsFoundHere": "Ez da txatik aurkitu. Hasi norbaitekin txateatzen beheko botoia erabiliz. ⤵️", + "@noChatsFoundHere": {}, + "homeserverDescription": "Zerbitzariak datuak gordetzen ditu, ePosta hornitzaileek mezuak gordetzen dituzten bezala. Nahi duzun zerbitzaria aukeratu dezakezu eta, hala ere, besteetako edonorekin hitz egin. Ikasi gehiago https://matrix.org webgunean.", + "@homeserverDescription": {}, + "loginWithMatrixId": "Hasi saioa Matrix IDarekin", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Arakatu zerbitzariak", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Zer da zerbitzari bat?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "Ez dirudi zerbitzaria bateragarria denik. Zuzena da URLa?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Fitxategiaren tamaina kalkulatzen…", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Eranskinaren bidalketa prestatzen…", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Eranskina bidaltzen…", + "@sendingAttachment": {}, + "compressVideo": "Bideoa konprimatzen…", + "@compressVideo": {}, + "generatingVideoThumbnail": "Bideoaren iruditxoa sortzen…", + "@generatingVideoThumbnail": {}, + "serverLimitReached": "Zerbitzariaren muga gainditu da! Itxaron {seconds} segundo…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "sendingAttachmentCountOfCount": "{index}. eranskina bidaltzen ({length} guztira)…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Zure gailuetako bat ez dago egiaztatuta", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Oharra: gailu guztiak txat-babeskopiarekin konektatzen dituzunean, automatikoki egiaztatzen dira.", + "@noticeChatBackupDeviceVerification": {}, + "opacity": "Opakutasuna:", + "@opacity": {}, + "manageAccount": "Kudeatu kontua", + "@manageAccount": {}, + "setWallpaper": "Ezarri horma-irudia", + "@setWallpaper": {}, + "blur": "Lausotu:", + "@blur": {}, + "continueText": "Jarraitu", + "@continueText": {}, + "welcomeText": "Ieup 👋 Ongi etorri FluffyChat-era. https://matrix.org-rekin bateragarria den edozein zerbitzaritan hasi dezakezu saioa eta edonorekin txateatu. Mezularitza-sare deszentralizatu eraraldoia da!", + "@welcomeText": {}, + "contactServerAdmin": "Jarri harremanetan zerbitzariaren administratzailearekin", + "@contactServerAdmin": {}, + "aboutHomeserver": "{homeserver}(e)ri buruz", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "supportPage": "Laguntza orria", + "@supportPage": {}, + "serverInformation": "Zerbitzariaren informazioa:", + "@serverInformation": {}, + "name": "Izena", + "@name": {}, + "version": "Bertsioa", + "@version": {}, + "website": "Webgunea", + "@website": {}, + "contactServerSecurity": "Jakinarazi segurtasun arazo bat", + "@contactServerSecurity": {}, + "noContactInformationProvided": "Zerbitzariak ez du harremanetarako informaziorik zehaztu", + "@noContactInformationProvided": {}, + "compressBeforeSending": "Konprimatu bidali baino lehen", + "@compressBeforeSending": {}, + "boldText": "Testu lodia", + "@boldText": {}, + "italicText": "Testu etzana", + "@italicText": {}, + "invalidUrl": "URL baliogabea", + "@invalidUrl": {}, + "addLink": "Gehitu esteka", + "@addLink": {}, + "sendUncompressed": "Bidali konprimatu gabe", + "@sendUncompressed": {}, + "strikeThrough": "Zirrimarra", + "@strikeThrough": {}, + "pleaseFillOut": "Bete ezazu", + "@pleaseFillOut": {}, + "unableToJoinChat": "Ezin da txatera batu. Agian besteak elkarrizketa itxiko zuen honezkero.", + "@unableToJoinChat": {}, + "sendImages": "Bidali {count} irudi", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Konprimatu", + "@compress": {} } diff --git a/assets/l10n/intl_fa.arb b/assets/l10n/intl_fa.arb index b2eb103403..d62cb8884a 100644 --- a/assets/l10n/intl_fa.arb +++ b/assets/l10n/intl_fa.arb @@ -1,29 +1,18 @@ { "@@last_modified": "2021-08-14 12:41:10.061080", - "pleaseChooseAtLeastChars": "لطفاً حداقل {min} تا نماد‌ انتخاب بده.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "repeatPassword": "رمز عبور را تکرار بده", + "repeatPassword": "تکرار رمزعبور", "@repeatPassword": {}, "about": "درباره", "@about": { "type": "text", "placeholders": {} }, - "passwordsDoNotMatch": "این رمز‌های عبور مطابقه ندارند!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "لطفاً یک آدرس ایمیل معتبر وارد کن.", - "@pleaseEnterValidEmail": {}, - "accept": "بپذیر", + "accept": "پذیرش", "@accept": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} دعوت را پذیرفت", + "acceptedTheInvitation": "👍 {username} دعوت را پذیرفت", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -35,12 +24,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "اطلاعات حساب", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "به اسپاش اضافه کن", + "addToSpace": "به فضا اضافه کنید", "@addToSpace": {}, "appLock": "قفل برنامه", "@appLock": { @@ -52,71 +36,2270 @@ "type": "text", "placeholders": {} }, - "allChats": "همه اتاق‌ها", + "allChats": "همه گپ‌ها", "@allChats": { "type": "text", "placeholders": {} }, - "addEmail": "ایمیل اضافه کن", + "addEmail": "افزودن ایمیل", "@addEmail": { "type": "text", "placeholders": {} }, - "addGroupDescription": "توضیحات گروه اضافه کن", - "@addGroupDescription": { + "answeredTheCall": "{senderName} پاسخ تماس را داد", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "archive": "بایگانی", + "@archive": { "type": "text", "placeholders": {} }, - "addNewFriend": "دوست جدید اضافه کن", - "@addNewFriend": { + "areYouSure": "مطمئن هستید؟", + "@areYouSure": { "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "قبلاً حساب دارید؟", - "@alreadyHaveAnAccount": { + "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خارج شوید؟", + "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "answeredTheCall": "{senderName} زنگ زدن را جواب کرد", - "@answeredTheCall": { + "activatedEndToEndEncryption": "🔐 {username} رمزگذاری سرتاسر را فعال کرد", + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "admin": "ادمین", + "@admin": { + "type": "text", + "placeholders": {} + }, + "supposedMxid": "این باید {mxid} باشد", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "botMessages": "پیام‌های روبات", + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} نام نمایشی خود را تغییر داد به: «{displayname}»", + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "confirmMatrixId": "برای حذف حسابتان، لطفا هویت ماتریکستان را تایید کنید.", + "@confirmMatrixId": {}, + "changeDeviceName": "نام دستگاه را تغییر دهید", + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "alias": "نام مستعار", + "@alias": { + "type": "text", + "placeholders": {} + }, + "banFromChat": "از گپ محروم کنید", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "askVerificationRequest": "این درخواست تایید را از {username} می‌پذیرید؟", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "areGuestsAllowedToJoin": "آیا کاربران مهمان اجازه پیوستن دارند", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "autoplayImages": "اموجی و برچسب‌های متحرک به طور خودکار پخش شوند", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "sendOnEnter": "ارسال با کلید تعويض سطر", + "@sendOnEnter": {}, + "cancel": "لغو", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "changedTheChatDescriptionTo": "{username} توصیف گپ را تغییر داد به: «{description}»", + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "changedTheChatPermissions": "{username} اجازه‌های گپ را تغییر داد", + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheChatNameTo": "{username} نام گپ را تغییر داد به: «{chatname}»", + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "cantOpenUri": "نمی‌توانیم این آدرس اینترنتی را باز کنیم: {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "banned": "محروم شده", + "@banned": { + "type": "text", + "placeholders": {} + }, + "bannedUser": "{username} {targetName} را محروم کرد", + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "blockDevice": "دستگاه را مسدود کنید", + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "blocked": "مسدود شده", + "@blocked": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "سرور می‌تواند این گونه‌های ورود‮ را پشتیباتی کند:\n{serverVersions}\nولی این برنامه فقط می‌تواند این‌ها را پشتیبانی کند:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "badServerVersionsException": "سرور می‌تواند این نسخه‌های مشخصات را پشتیبانی کند:\n{serverVersions}\nولی این برنامه فقط می‌تواند این‌ها را پشتیبانی کند:\n{supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "changedTheChatAvatar": "{username} تصویر گپ را تغییر داد", + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheGuestAccessRules": "{username} قوانین دسترسی مهمان را تغییر داد", + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheProfileAvatar": "{username} عکس پروفایل خود را تغییر داد", + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "chats": "گپ‌ها", + "@chats": { + "type": "text", + "placeholders": {} + }, + "messages": "پیام‌ها", + "@messages": { + "type": "text", + "placeholders": {} + }, + "send": "ارسال", + "@send": { + "type": "text", + "placeholders": {} + }, + "sendAudio": "ارسال صدا", + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "sendOriginal": "ارسال اصل", + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} نام‌های مستعار اتاق را تغییر داد", + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheRoomInvitationLink": "{username} لینک دعوت را تغییر داد", + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "close": "بستن", + "@close": { + "type": "text", + "placeholders": {} + }, + "sendImage": "ارسال تصویر", + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "sendMessages": "ارسال پیام‌ها", + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "changedTheHistoryVisibility": "{username} قابليت‌ ديدن‌ تاریخچه را تغییر داد", + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheGuestAccessRulesTo": "{username} قوانین دسترسی مهمان را تغییر داد به: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheJoinRulesTo": "{username} قوانین پیوستن را تغییر داد به: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "changedTheHistoryVisibilityTo": "{username} قابليت‌ ديدن‌ تاریخچه را تغییر داد به: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "chooseAStrongPassword": "رمز عبور قوی انتخاب کنید", + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "پشتیبان گپ‌تان تنظیم شده است.", + "@yourChatBackupHasBeenSetUp": {}, + "changeTheme": "سبک خود را تغییر دهید", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "نام گروه را تغییر دهید", + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "changeYourAvatar": "عکس پروفایل خود را تغییر دهید", + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "channelCorruptedDecryptError": "رمزگذاری مخدوش شده‌ است", + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "clearArchive": "بایگانی را پاک کنید", + "@clearArchive": {}, + "commandHint_create": "یک گپ گروهی خالی بسازید\nاز «--no-encryption» برای غیرفعال کردن رمزگذاری استفاده کنید", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "یک گپ مستقیم شروع کنید\nاز «--no-encryption» برای غیرفعال کردن رمزگذاری استفاده کنید", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "sendSticker": "ارسال برچسب", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "sendVideo": "ارسال ویدئو", + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "sender": "فرستنده", + "@sender": {}, + "changedTheJoinRules": "{username} قوانین پیوستن را تغییر داد", + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "chatDetails": "جزئیات گپ", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "commandHint_markasdm": "برای دادن شناسه ماتریکس به عنوان اتاق پیام‌های مستقیم علامت بگذارید", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "به عنوان گروه علامت بگذارید", + "@commandHint_markasgroup": {}, + "commandHint_clearcache": "حافظه پنھان را پاک کنید", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "طرد نشست", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "groups": "گروه‌ها", + "@groups": { + "type": "text", + "placeholders": {} + }, + "openAppToReadMessages": "برای خواندن پیام‌ها، برنامه را باز کنید", + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "sendAMessage": "ارسال پیام", + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "sentCallInformations": "{senderName} اطلاعات تماس را فرستاد", + "@sentCallInformations": { "type": "text", "placeholders": { "senderName": {} } }, - "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", - "@anyoneCanJoin": { + "sendAsText": "ارسال به عنوان متن", + "@sendAsText": { + "type": "text" + }, + "sendFile": "ارسال فایل", + "@sendFile": { "type": "text", "placeholders": {} }, - "archive": "بایگانی", - "@archive": { + "startedACall": "{senderName} تماسی را شروع کرد", + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "tryToSendAgain": "تلاش برای ارسال مجدد", + "@tryToSendAgain": { "type": "text", "placeholders": {} }, - "archivedRoom": "اتاق بایگانی شده", - "@archivedRoom": { + "reactedWith": "{sender} با {reaction} واکنش نشان داد", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "askSSSSSign": "لطفا عبارت عبور یا کلید بازیابی حافظه امن خود را وارد کنید تا بتوانید شخص دیگر را امضا کنید.", + "@askSSSSSign": { "type": "text", "placeholders": {} }, - "areYouSure": "مطمئن هستید؟", - "@areYouSure": { + "chatHasBeenAddedToThisSpace": "گپ به این فضا اضافه شده است", + "@chatHasBeenAddedToThisSpace": {}, + "chat": "گپ", + "@chat": { "type": "text", "placeholders": {} }, - "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خروج شوید؟", - "@areYouSureYouWantToLogout": { + "chatBackup": "پشتیبان گپ", + "@chatBackup": { "type": "text", "placeholders": {} }, - "audioPlayerPause": "مکث", - "@audioPlayerPause": { + "changePassword": "تغییر رمز عبور", + "@changePassword": { "type": "text", "placeholders": {} }, - "audioPlayerPlay": "نمایش", - "@audioPlayerPlay": { + "changeTheHomeserver": "تغییر سرور خانه", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "separateChatTypes": "گپ‌های مستقیم را از گروه‌ها جدا کنید", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} یک عکس فرستاد", + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAVideo": "🎥 {username} یک ویدئو فرستاد", + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "commandInvalid": "دستور نامعتبر", + "@commandInvalid": { + "type": "text" + }, + "commandMissing": "{command} یک دستور نیست.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "مخاطب به گروه دعوت شده است", + "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} - } + }, + "sentAFile": "📁 {username} یک فایل فرستاد", + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAnAudio": "🎤 {username} یک صدای ضبط شده فرستاد", + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "userSentUnknownEvent": "{username} یک رویداد {type} فرستاد", + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "weSentYouAnEmail": "یک ایمیل برایتان فرستادیم", + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "loadCountMoreParticipants": "بارگیری {count} شرکت کنندۀ بیشتر", + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "sentASticker": "😊 {username} یک برچسب فرستاد", + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "connect": "اتصال", + "@connect": { + "type": "text", + "placeholders": {} + }, + "confirm": "تایید", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "allSpaces": "همه فضاها", + "@allSpaces": {}, + "commandHint_ban": "کاربر مشخص شده را از این اتاق محروم کنید", + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "commandHint_kick": "کاربر مشخص شده را از این اتاق حذف کنید", + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "commandHint_plain": "متن بی‌فرمت بفرستید", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "commandHint_unban": "محرومیت کاربر مشخص شده را از این اتاق لغو کنید", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "containsDisplayName": "شامل نام نمایشی است", + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "containsUserName": "شامل نام کاربری است", + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "device": "دستگاه", + "@device": { + "type": "text", + "placeholders": {} + }, + "copy": "کپی", + "@copy": { + "type": "text", + "placeholders": {} + }, + "defaultPermissionLevel": "درجه اجازۀ پیشفرض", + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "delete": "حذف", + "@delete": { + "type": "text", + "placeholders": {} + }, + "deleteAccount": "حساب را حذف کنید", + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "پیام را حذف کنید", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "commandHint_html": "متن با فرمت HTML بفرستید", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "commandHint_join": "به اتاق مشخص شده بپیوندید", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "commandHint_leave": "این اتاق را ترک کنید", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomnick": "نام نمایشی خود را برای این اتاق تنظیم کنید", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "عکس پروفایل خود را برای این اتاق تنظیم کنید (با mxc-uri)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "درجه اختیار کاربر مشخص شده را تنظیم کنید (پیشفرض: ۵۰)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "پاسخ را به عنوان یک واکنش بفرستید", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "compareEmojiMatch": "لطفا ایموجی‌ها را مقایسه کنید", + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "copyToClipboard": "در حافظه کپی کنید", + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "countParticipants": "{count} شرکت کننده", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "create": "ایجاد", + "@create": { + "type": "text", + "placeholders": {} + }, + "createNewSpace": "فضای جدید", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "deviceId": "هویت دستگاه", + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "devices": "دستگاه‌ها", + "@devices": { + "type": "text", + "placeholders": {} + }, + "displaynameHasBeenChanged": "نام نمایشی تغییر یافته است", + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "downloadFile": "بارگیری فایل", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "edit": "ویرایش", + "@edit": { + "type": "text", + "placeholders": {} + }, + "editBlockedServers": "سرور‌های مسدود را ویرایش کنید", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "editRoomAliases": "نام‌های مستعار اتاق را ویرایش کنید", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "editRoomAvatar": "عکس اتاق را ویرایش کنید", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "emoteExists": "شکلک از پیش وجود دارد!", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "emoteWarnNeedToPick": "باید یک کد کوتاه شکلک و یک تصویر انتخاب کنید!", + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "emoteInvalid": "کد کوتاه شکلک نامعتبر!", + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "emptyChat": "گپ خالی", + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "copiedToClipboard": "در حافظه کپی شد", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "createdTheChat": "💬 {username} گپ را ایجاد کرد", + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "darkTheme": "تاریک", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "directChats": "گپ‌های مستقیم", + "@directChats": { + "type": "text", + "placeholders": {} + }, + "emotePacks": "بسته‌های شکلک برای اتاق", + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "emoteSettings": "‏تنظیمات شکلک", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "emoteShortcode": "کد کوتاه شکلک", + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "commandHint_me": "خود را توصیف کنید", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "commandHint_send": "متن را بفرستید", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "couldNotDecryptMessage": "نتوانستیم پیام را رمزگشایی کنیم: {error}", + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "chatBackupDescription": "پیام‌های قدیمی‌تان با یک کلید باز یابی، امن می‌شوند. لطفا مطمئن شوید که آن را گم نمی‌کنید.", + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "deactivateAccountWarning": "این کار حساب کاربری‌تان را غیرفعال خواهد کرد. این عمل قابل جبران و بازگشت نیست! آیا اطمینان دارید؟", + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "commandHint_invite": "کاربر مشخص شده را به این اتاق دعوت کنید", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "compareNumbersMatch": "لطفا اعداد را مقایسه کنید", + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "configureChat": "گپ را تنظیم کنید", + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "currentlyActive": "اکنون فعال", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}، {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "editDisplayname": "ویرایش نام نمایشی", + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "id": "آی‌دی", + "@id": { + "type": "text", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} دعوت‌نامه {targetName} را پس گرفته است", + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "guestsAreForbidden": "مهمان‌ها ممنوع شده‌اند", + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "hideRedactedEvents": "پنهان کردن رویدادهای ویرایش شده", + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "hideUnknownEvents": "پنهان کردن رویدادهای ناشناخته", + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "contentHasBeenReported": "محتوا به مدیران سرور گزارش شده است", + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "fromJoining": "از پیوستن", + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "fromTheInvitation": "از دعوت", + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "goToTheNewRoom": "به اتاق جدید بروید", + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "group": "گروه", + "@group": { + "type": "text", + "placeholders": {} + }, + "groupIsPublic": "گروه عمومی است", + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "groupWith": "گروه با {displayname}", + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "howOffensiveIsThisContent": "این محتوا چه مقدار توهین آمیز است؟", + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "enableEmotesGlobally": "بسته شکلک را به طور سراسری فعال کنید", + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "enableEncryption": "رمزگذاری را فعال کنید", + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "enableEncryptionWarning": "شما دیگر قادر به غیرفعال کردن رمزگذاری نخواهید بود. آیا مطمئن هستید؟", + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "encrypted": "رمزگذاری شده", + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "encryption": "رمزگذاری", + "@encryption": { + "type": "text", + "placeholders": {} + }, + "encryptionNotEnabled": "رمزگذاری فعال نیست", + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "enterAnEmailAddress": "یک آدرس رایانامه(ایمیل) وارد کنید", + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "endedTheCall": "{senderName} به تماس پایان داد", + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "homeserver": "سرور خانه", + "@homeserver": {}, + "enterYourHomeserver": "سرور خانه خود را وارد کنید", + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "errorObtainingLocation": "خطا هنگام بدست آوردن مکان: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "everythingReady": "همه‌چیز آماده است!", + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "extremeOffensive": "به شدت توهین آمیز", + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "fileName": "نام فایل", + "@fileName": { + "type": "text", + "placeholders": {} + }, + "fluffychat": "فلافی‌چت", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "fontSize": "اندازه قلم", + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "forward": "ارسال", + "@forward": { + "type": "text", + "placeholders": {} + }, + "help": "کمک", + "@help": { + "type": "text", + "placeholders": {} + }, + "guestsCanJoin": "مهمان‌ها می‌توانند بپیوندند", + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "ignoredUsers": "کاربران نادیده‌گرفته شده", + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "ارسال چند چشم گوگولی", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} به شما چشمان گوگولی می‌فرستد", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "ignore": "نادیده‌گرفتن", + "@ignore": { + "type": "text", + "placeholders": {} + }, + "cuddleContent": "{senderName} شما را در آغوش می‌گیرد", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "identity": "هویت", + "@identity": { + "type": "text", + "placeholders": {} + }, + "hugContent": "{senderName} شما را بغل می‌کند", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_cuddle": "ارسال آغوش", + "@commandHint_cuddle": {}, + "commandHint_hug": "ارسال بغل", + "@commandHint_hug": {}, + "editBundlesForAccount": "بسته‌های این حساب را ویرایش کنید", + "@editBundlesForAccount": {}, + "logout": "خارج شدن", + "@logout": { + "type": "text", + "placeholders": {} + }, + "mention": "نام‌‌بردن‌", + "@mention": { + "type": "text", + "placeholders": {} + }, + "muteChat": "بی‌صدا کردن گپ", + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "newChat": "گپ جدید", + "@newChat": { + "type": "text", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 پیام جدید در فلافی‌چت", + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "noConnectionToTheServer": "عدم اتصال به سرور", + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "no": "نه", + "@no": { + "type": "text", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "شما هنوز راهی برای بازیابی رمز عبور خود اضافه نکرده‌اید.", + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "اعلان‌ها برای این حساب فعال شد", + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "or": "یا", + "@or": { + "type": "text", + "placeholders": {} + }, + "participant": "شرکت‌کننده", + "@participant": { + "type": "text", + "placeholders": {} + }, + "passphraseOrKey": "عبارت عبور یا کلید بازیابی", + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "password": "رمز عبور", + "@password": { + "type": "text", + "placeholders": {} + }, + "passwordHasBeenChanged": "رمز عبور تغییر کرد", + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "passwordRecovery": "بازیابی رمز عبور", + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "pin": "سنجاق کردن", + "@pin": { + "type": "text", + "placeholders": {} + }, + "play": "پخش {fileName}", + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "pleaseEnter4Digits": "لطفا ۴ رقم وارد کنید یا خالی بگذارید تا قفل برنامه غیرفعال شود.", + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourPin": "لطفا کد خود را وارد کنید", + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourPassword": "لطفا رمزعبور خود را وارد کنید", + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "لطفا دستورالعمل‌های وب‌سایت را دنبال کنید و روی بعدی بزنید.", + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "publicRooms": "اتاق‌های عمومی", + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "obtainingLocation": "به دست آوردن مکان…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "oopsSomethingWentWrong": "اوه، مشکلی پیش آمد…", + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "addToBundle": "به بسته نرم‌افزاری اضافه کنید", + "@addToBundle": {}, + "passwordForgotten": "رمز عبور را فراموش کرده‌ام", + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "لطفا کلید بازیابی خود را وارد کنید:", + "@pleaseEnterRecoveryKey": {}, + "link": "پیوند", + "@link": {}, + "iHaveClickedOnLink": "من روی پیوند کلیک کردم", + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "عبارت عبور یا کلید بازیابی اشتباه است", + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "inoffensive": "بی ضرر", + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroup": "دعوت از مخاطب به {groupName}", + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "invitedUsersOnly": "فقط کاربران دعوت شده", + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "inviteForMe": "دعوت برای من", + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "isTyping": "در حال نوشتن…", + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "joinRoom": "پیوستن به اتاق", + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "kicked": "👞 {username} {targetName} را بیرون کرد", + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "kickFromChat": "از گفتگو بیرون کردن", + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "leftTheChat": "گپ را ترک کرد", + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "dehydrate": "صدور جلسه و پاک کردن دستگاه", + "@dehydrate": {}, + "hydrateTorLong": "آیا آخرین بار جلسه خود را با تور (TOR) صادر کردید؟ به سرعت آن را وارد کنید و به گپ‌زنی ادامه دهید.", + "@hydrateTorLong": {}, + "loadingPleaseWait": "در حال بارگیری... لطفا صبر کنید.", + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "loadMore": "بارگیری بیشتر…", + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "مجوز مکان رد شد. برای به اشتراک گذاشتن موقعیت مکانی شما لطفا به آن اجازه دهید.", + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "logInTo": "وارد شدن به {homeserver}", + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "memberChanges": "تغییرات اعضا", + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "moderator": "مدیر", + "@moderator": { + "type": "text", + "placeholders": {} + }, + "newVerificationRequest": "درخواست تایید جدید!", + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "noPermission": "بدون اجازه", + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "noRoomsFound": "اتاقی پیدا نشد…", + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "offline": "آفلاین", + "@offline": { + "type": "text", + "placeholders": {} + }, + "online": "آنلاین", + "@online": { + "type": "text", + "placeholders": {} + }, + "oopsPushError": "اوه! متاسفانه هنگام تنظیم اعلان‌ها خطایی روی داد.", + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "openCamera": "باز کردن دوربین", + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "addAccount": "اضافه کردن حساب کاربری", + "@addAccount": {}, + "people": "مردم", + "@people": { + "type": "text", + "placeholders": {} + }, + "pickImage": "یک عکس انتخاب کنید", + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "pleaseChoose": "لطفا انتخاب کنید", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "pleaseChooseAPasscode": "لطفا یک کد عبور انتخاب کنید", + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourUsername": "لطفا نام‌کاربری خود را وارد کنید", + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "privacy": "حریم خصوصی", + "@privacy": { + "type": "text", + "placeholders": {} + }, + "license": "پروانه", + "@license": { + "type": "text", + "placeholders": {} + }, + "numUsersTyping": "{count} کاربر در حال نوشتن…", + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "invited": "دعوت شده", + "@invited": { + "type": "text", + "placeholders": {} + }, + "invitedUser": "📩 {username} از {targetName} دعوت کرد", + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "joinedTheChat": "👋 {username} به گپ پیوست", + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "kickedAndBanned": "🙅 {username} {targetName} را بیرون و محروم کرد", + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "dehydrateWarning": "این عمل قابل لغو نیست. مطمئن شوید که فایل پشتیبان را به صورت امن ذخیره می کنید.", + "@dehydrateWarning": {}, + "locationDisabledNotice": "خدمات مکان غیرفعال است. لطفا آن را فعال کنید تا بتوانید موقعیت مکانی خود را به اشتراک بگذارید.", + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "dehydrateTorLong": "برای کاربران تور (TOR)، توصیه می شود قبل از بستن پنجره، جلسه را صادر کنند.", + "@dehydrateTorLong": {}, + "needPantalaimonWarning": "لطفا توجه داشته باشید که در حال حاضر برای استفاده از رمزگذاری انتها به انتها به Pantalaimon نیاز دارید.", + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "next": "بعدی", + "@next": { + "type": "text", + "placeholders": {} + }, + "noEmotesFound": "هیچ شکلکی پیدا نشد. 😕", + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "noGoogleServicesWarning": "به نظر می رسد که شما سرویس‌های گوگل را در گوشی خود ندارید. این تصمیم خوبی برای حفظ حریم خصوصی شماست! برای دریافت اعلان‌ها در فلافی‌چت توصیه می‌کنیم ازhttps://ntfy.sh استفاده کنید. با ntfy یا یک ارائه دهنده UnifiedPush می توانید اعلان‌های فشار را به روش داده امن دریافت کنید. می توانید ntfy را از پلی استور یا از اف‌دروید بارگیری کنید.", + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "فقط زمانی می‌توانید رمزگذاری را فعال کنید که اتاق، دیگر در دسترس عموم نباشد.", + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "پشتیبان‌گیری آنلاین از کلید فعال است", + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "enableMultiAccounts": "(آزمایشی) چند حساب را در این دستگاه فعال کنید", + "@enableMultiAccounts": {}, + "pleaseClickOnLink": "لطفا روی لینک موجود در رایانامه(ایمیل) کلیک کنید و سپس ادامه دهید.", + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "hydrateTor": "کاربران تور (TOR): صادرات جلسه را وارد کنید", + "@hydrateTor": {}, + "hydrate": "بازیابی از فایل پشتیبان", + "@hydrate": {}, + "inviteContact": "دعوت از مخاطب", + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "noMatrixServer": "{server1} سرور ماتریکس نیست، به جای آن از {server2} استفاده شود؟", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "openVideoCamera": "بازکردن دوربین برای فیلم‌برداری", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "oneClientLoggedOut": "یکی از کلاینت(برنامه)های شما از سیستم خارج شده است", + "@oneClientLoggedOut": {}, + "removeFromBundle": "از این بسته حذف کنید", + "@removeFromBundle": {}, + "bundleName": "اسم بسته", + "@bundleName": {}, + "openInMaps": "باز کردن در نقشه", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "serverRequiresEmail": "برای ثبت‌نام، این سرور باید آدرس ایمیل شما را تایید کند.", + "@serverRequiresEmail": {}, + "inviteText": "{username} شما را به فلافی‌چت دعوت کرد.\n۱. به fluffychat.im مراجعه کرده و کاره را نصب کنید\n۲. ثبت نام کنید یا وارد شوید.\n۳. لینک دعوت را باز کنید:\n {link}", + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "leave": "ترک کردن", + "@leave": { + "type": "text", + "placeholders": {} + }, + "none": "هیچ‌کدام", + "@none": { + "type": "text", + "placeholders": {} + }, + "offensive": "توهین آمیز", + "@offensive": { + "type": "text", + "placeholders": {} + }, + "scanQrCode": "کد QR را اسکن کنید", + "@scanQrCode": {}, + "lastActiveAgo": "آخرین فعالیت: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "lightTheme": "روشن", + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "dehydrateTor": "کاربران تور (TOR): صدور جلسه", + "@dehydrateTor": {}, + "login": "وارد شدن", + "@login": { + "type": "text", + "placeholders": {} + }, + "notifications": "اعلان‌ها", + "@notifications": { + "type": "text", + "placeholders": {} + }, + "ok": "تایید", + "@ok": { + "type": "text", + "placeholders": {} + }, + "roomHasBeenUpgraded": "اتاق ارتقا پیدا کرد", + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "register": "ثبت نام", + "@register": { + "type": "text", + "placeholders": {} + }, + "reject": "رد کردن", + "@reject": { + "type": "text", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} دعوت را رد کرد", + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "rejoin": "دوباره پیوستن", + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "unbanFromChat": "لغو محرومیت از گپ", + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "reply": "پاسخ", + "@reply": { + "type": "text", + "placeholders": {} + }, + "requestPermission": "درخواست اجازه", + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "roomVersion": "نسخه اتاق", + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "search": "جستجو", + "@search": { + "type": "text", + "placeholders": {} + }, + "security": "امنیت", + "@security": { + "type": "text", + "placeholders": {} + }, + "seenByUser": "دیده شده توسط {username}", + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "setAsCanonicalAlias": "به عنوان نام مستعار اصلی تنظیم کنید", + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "removeYourAvatar": "آواتار(عکس حساب) خود را حذف کنید", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "recording": "در حال ضبط", + "@recording": { + "type": "text", + "placeholders": {} + }, + "redactedAnEvent": "{username} یک رویداد را ویرایش کرد", + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "remove": "حذف کردن", + "@remove": { + "type": "text", + "placeholders": {} + }, + "removeAllOtherDevices": "حذف تمام دستگاه‌های دیگر", + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "removedBy": "حذف شده توسط {username}", + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "removeDevice": "حذف دستگاه", + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "renderRichContent": "تبدیل و نمایش محتوای پیام به صورت کامل", + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "reportMessage": "گزارش دادن پیام", + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "saveFile": "ذخیره فایل", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "recoveryKey": "کلید بازیابی", + "@recoveryKey": {}, + "setInvitationLink": "تنظیم پیوند دعوت", + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "pushRules": "قواعد دریافت اعلان", + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "reason": "دلیل", + "@reason": { + "type": "text", + "placeholders": {} + }, + "setCustomEmotes": "شکلک سفارشی را تنظیم کنید", + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "redactMessage": "ویرایش پیام", + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "اتاق را با نسخه جدیدتر جایگزین کنید", + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "recoveryKeyLost": "کلید بازیابی را گم کردید؟", + "@recoveryKeyLost": {}, + "fileHasBeenSavedAt": "فایل در {path} ذخیره شده است", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "enterSpace": "ورود به فضا", + "@enterSpace": {}, + "wasDirectChatDisplayName": "گپ خالی ({oldDisplayName} بود)", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "newSpaceDescription": "فضاها به شما امکان می‌دهند گپ‌های خود را یکپارچه کنید و جوامع خصوصی یا عمومی بسازید.", + "@newSpaceDescription": {}, + "encryptThisChat": "این گپ را رمزگذاری کنید", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "متاسفم... این امکان‌پذیر نیست", + "@sorryThatsNotPossible": {}, + "deviceKeys": "کلیدهای دستگاه:", + "@deviceKeys": {}, + "fileIsTooBigForServer": "سرور گزارش می‌دهد که فایل برای ارسال بسیار بزرگ است.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "پرش به آخرین پیام خوانده شده", + "@jumpToLastReadMessage": {}, + "hideUnimportantStateEvents": "رویدادهای غیر مهم مربوط به وضعیت را پنهان کنید", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "دوباره نشان نده", + "@doNotShowAgain": {}, + "readUpToHere": "تا اینجا خوانده شده", + "@readUpToHere": {}, + "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام های رمزگذاری شده خود را از دست خواهید داد. قویا توصیه می‌شود قبل از خروج از سیستم، ابتدا پشتیبان‌گیری گپ را فعال کنید.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "دستگاه دیگری پیدا نشد", + "@noOtherDevicesFound": {}, + "countFiles": "{count} فایل", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "callingAccountDetails": "به فلافی‌چت اجازه می‌دهد تا از برنامه شماره‌گیر بومی اندروید استفاده کند.", + "@callingAccountDetails": {}, + "noKeyForThisMessage": "اگر پیام قبل از ورود به حسابتان در این دستگاه ارسال شده باشد، ممکن است این اتفاق بیفتد.\n\nهمچنین ممکن است فرستنده، دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت رخ داده باشد.\n\nآیا می توانید پیام را در نشست دیگری بخوانید؟ بنابراین می توانید پیام را از آن منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید که دستگاه های شما یکدیگر را تایید کرده‌اند. هنگامی که دفعه بعد اتاق را باز می‌کنید و هر دو جلسه در پیش‌زمینه هستند، کلیدها به طور خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج از سیستم یا تعویض دستگاه، کلیدها را گم کنید؟ مطمئن شوید که پشتیبان گپ را در تنظیمات فعال کرده‌اید.", + "@noKeyForThisMessage": {}, + "numChats": "{number} گپ", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزگذاری را در گپ غیرفعال کنید، در حالی که از قبل فعال شده است.", + "@disableEncryptionWarning": {}, + "enterRoom": "ورود به اتاق", + "@enterRoom": {}, + "newGroup": "گروه جدید", + "@newGroup": {}, + "foregroundServiceRunning": "این اعلان زمانی وقتی ظاهر می شود که سرویس پیش‌زمینه در حال اجرا است.", + "@foregroundServiceRunning": {}, + "appearOnTopDetails": "به برنامه اجازه می‌دهد در بالا ظاهر شود (اگر قبلا فلافی‌‌چت را به عنوان حساب تماس تنظیم کرده‌اید، لازم نیست)", + "@appearOnTopDetails": {}, + "storeSecurlyOnThisDevice": "به طور ایمن در دستگاه ذخیره کنید", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "شما در حال به اشتراک‌گذاری صفحه‌نمایش خود در فلافی‌چت هستید", + "@screenSharingDetail": {}, + "newSpace": "فضای جدید", + "@newSpace": {}, + "saveKeyManuallyDescription": "این کلید را به صورت دستی با فعال کردن گفتگوی اشتراک گذاری سیستم یا کلیپ بورد ذخیره کنید.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "در Android KeyStore ذخیره کنید", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "در Apple KeyChain ذخیره کنید", + "@storeInAppleKeyChain": {}, + "user": "کاربر", + "@user": {}, + "custom": "سفارشی", + "@custom": {}, + "screenSharingTitle": "اشتراک گذاری صفحه نمایش", + "@screenSharingTitle": {}, + "callingPermissions": "اجازه‌های تماس", + "@callingPermissions": {}, + "callingAccount": "حساب تماس", + "@callingAccount": {}, + "appearOnTop": "در بالا ظاهر شود", + "@appearOnTop": {}, + "otherCallingPermissions": "میکروفون، دوربین و سایر مجوزهای فلافی‌چت", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "چرا این پیام قابل خواندن نیست؟", + "@whyIsThisMessageEncrypted": {}, + "reopenChat": "گپ را دوباره باز کنید", + "@reopenChat": {}, + "unmuteChat": "بازکردن صدای گپ", + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "nextAccount": "حساب بعدی", + "@nextAccount": {}, + "unlockOldMessages": "گشودن قفل پیام‌های قدیمی", + "@unlockOldMessages": {}, + "share": "اشتراک‌گذاری", + "@share": { + "type": "text", + "placeholders": {} + }, + "skip": "رد شدن", + "@skip": { + "type": "text", + "placeholders": {} + }, + "systemTheme": "سیستم", + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "theyDontMatch": "با هم منطبق نیستند", + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "toggleFavorite": "تغییر حالت محبوبیت", + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "toggleMuted": "تغییر حالت بی‌صدا", + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "toggleUnread": "علامت‌گذاشتن به عنوان خوانده‌شده/خوانده‌نشده", + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "unavailable": "خارج از دسترس", + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "unblockDevice": "برداشتن مسدود بودن دستگاه", + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "verifyStart": "شروع بازبینی و تایید", + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "verifySuccess": "بازبینی و تایید با موفقیت انجام شد!", + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerEmoji": "در انتظار پذیرفتن شکلک از جانب فرد دیگر…", + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "wallpaper": "کاغذدیواری:", + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "whoCanPerformWhichAction": "چه کسی توان انجام کدام عمل را داراست", + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "writeAMessage": "نوشتن پیام…", + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "widgetVideo": "ویدئو", + "@widgetVideo": {}, + "youHaveBeenBannedFromThisChat": "شما از این گپ محروم شده‌اید", + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "setPermissionsLevel": "تنظیم درجه اجازه‌ها", + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "setStatus": "تنظیم وضعیت", + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "settings": "تنظیمات", + "@settings": { + "type": "text", + "placeholders": {} + }, + "showPassword": "نمایش رمز عبور", + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "singlesignon": "شناسایی یگانه(Single Sign on)", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "spaceName": "نام فضا", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "اولین گپ خود را شروع کنید", + "@startFirstChat": {}, + "theyMatch": "با هم منطبق هستند", + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "title": "فلافی‌چت", + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "tooManyRequestsWarning": "تعداد درخواست‌های بیش از حد. لطفا بعدا دوباره امتحان کنید!", + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "unbannedUser": "{username} محرومیت {targetName} را برداشت", + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "unknownEncryptionAlgorithm": "الگوریتم رمزگذاری ناشناخته", + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "unpin": "برداشتن سنجاق", + "@unpin": { + "type": "text", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} و {username2} در حال تایپ کردن…", + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "videoCall": "تماس تصویری", + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "visibleForAllParticipants": "قابل رویت برای تمام شرکت‌کنندگان", + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "visibleForEveryone": "قابل رویت برای همه", + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "voiceMessage": "پیام صوتی", + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "در انتظار پذیرفتن درخواست از جانب فرد دیگر…", + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "warning": "هشدار!", + "@warning": { + "type": "text", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "شما دیگر در این گپ شرکت نمی‌کنید", + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "messageInfo": "اطلاعات پیام", + "@messageInfo": {}, + "time": "زمان", + "@time": {}, + "messageType": "نوع پیام", + "@messageType": {}, + "addToSpaceDescription": "فضایی برای افزودن این گپ به آن انتخاب کنید.", + "@addToSpaceDescription": {}, + "start": "شروع", + "@start": {}, + "videoWithSize": "ویدئو ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "userIsTyping": "{username} در حال تایپ کردن…", + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "username": "نام‌کاربری", + "@username": { + "type": "text", + "placeholders": {} + }, + "yes": "بله", + "@yes": { + "type": "text", + "placeholders": {} + }, + "yourPublicKey": "کلید عمومی شما", + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "publish": "انتشار", + "@publish": {}, + "shareLocation": "اشتراک‌گذاری وضعیت مکانی", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "youInvitedUser": "📩 شما {user} را دعوت کردید", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "unverified": "تاییدنشده", + "@unverified": {}, + "verify": "بازبینی و تایید", + "@verify": { + "type": "text", + "placeholders": {} + }, + "openChat": "بازکردن گپ", + "@openChat": {}, + "dismiss": "رد كردن‌", + "@dismiss": {}, + "unsupportedAndroidVersion": "نسخه اندروید پشتیبانی نشده", + "@unsupportedAndroidVersion": {}, + "youUnbannedUser": "شما محرومیت {user} را برداشتید", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "verified": "تاییدشده", + "@verified": { + "type": "text", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "چرا می‌خواهید گزارش دهید؟", + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "you": "شما", + "@you": { + "type": "text", + "placeholders": {} + }, + "widgetJitsi": "جیتسی‌میت(Jitsi Meet)", + "@widgetJitsi": {}, + "sourceCode": "کد منبع", + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "spaceIsPublic": "فضا عمومی است", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "synchronizingPleaseWait": "در حال همگام‌سازی... لطفا صبر کنید.", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "unknownEvent": "رویداد ناشناخته «{type}»", + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "userAndOthersAreTyping": "{username} و {count} نفر دیگر در حال تایپ کردن…", + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "userLeftTheChat": "🚪{username} گپ را ترک کرد", + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "verifyTitle": "در حال تایید حساب دیگر", + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه گپ", + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "چه کسی اجازه پیوستن به این گروه را دارد", + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerNumbers": "در انتظار پذیرفتن اعداد از جانب فرد دیگر…", + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "wipeChatBackup": "برای ایجاد کلید بازیابی جدید، پشتیبان گپ خود را پاک می‌کنید؟", + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "با این آدرس‌ها می‌توانید رمز خود را بازیابی کنید.", + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "openGallery": "بازکردن گالری", + "@openGallery": {}, + "removeFromSpace": "حذف از فضا", + "@removeFromSpace": {}, + "pleaseEnterRecoveryKeyDescription": "برای گشودن قفل پیام‌های قدیمیتان، لطفا کلید بازیابی‌ای که در یک نشست پیشین تولید شده را وارد کنید. کلید بازیابی شما، رمز عبور شما نیست.", + "@pleaseEnterRecoveryKeyDescription": {}, + "confirmEventUnpin": "آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟", + "@confirmEventUnpin": {}, + "indexedDbErrorLong": "متاسفانه فضای ذخیره‌سازی پیام‌ها، به صورت پیش‌فرض در حالت خصوصی فعال نیست.\nلطفا آدرس زیر را باز کنید:\nabout:config\nمقدار «dom.indexedDB.privateBrowsing.enabled» را به «true» تغییر دهید\nدر غیر این صورت، امکان اجرای فلافی‌چت وجود ندارد.", + "@indexedDbErrorLong": {}, + "widgetEtherpad": "یادداشت متنی", + "@widgetEtherpad": {}, + "youKickedAndBanned": "🙅 شما {user} را بیرون و محروم کردید", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "statusExampleMessage": "امروز حالتان چطور است؟", + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "submit": "ارسال", + "@submit": { + "type": "text", + "placeholders": {} + }, + "youRejectedTheInvitation": "شما دعوت را رد کردید", + "@youRejectedTheInvitation": {}, + "youAcceptedTheInvitation": "👍 شما دعوت را پذیرفتید", + "@youAcceptedTheInvitation": {}, + "emailOrUsername": "رایانامه(ایمیل) یا نام کاربری", + "@emailOrUsername": {}, + "transferFromAnotherDevice": "انتقال از دستگاهی دیگر", + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "videoCallsBetaWarning": "لطفا توجه داشته باشید که تماس‌های تصویری در حال حاضر آزمایشی هستند. ممکن است طبق انتظار کار نکنند یا روی همه پلتفرم‌ها اصلا کار نکنند.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "تماس‌های تصویری آزمایشی", + "@experimentalVideoCalls": {}, + "placeCall": "برقراری تماس", + "@placeCall": {}, + "unsupportedAndroidVersionLong": "این ویژگی به نسخه تازه‌تری از اندروید نیاز دارد. لطفا به‌روزرسانی یا پشتیبانی لینیج‌اواس(LineageOS) را بررسی کنید.", + "@unsupportedAndroidVersionLong": {}, + "sharedTheLocation": "{username} وضعیت مکانی خود را به اشتراک گذاشت", + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} گپ خوانده نشده}}", + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "status": "وضعیت", + "@status": { + "type": "text", + "placeholders": {} + }, + "unknownDevice": "دستگاه ناشناس", + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "markAsRead": "علامت‌گذاشتن به عنوان خوانده شده", + "@markAsRead": {}, + "reportUser": "گزارش دادن کاربر", + "@reportUser": {}, + "pinMessage": "سنجاق کردن به اتاق", + "@pinMessage": {}, + "emojis": "شکلک‌ها", + "@emojis": {}, + "voiceCall": "تماس صوتی", + "@voiceCall": {}, + "indexedDbErrorTitle": "اشکالات حالت خصوصی", + "@indexedDbErrorTitle": {}, + "switchToAccount": "تغییر به حساب {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "previousAccount": "حساب قبلی", + "@previousAccount": {}, + "addWidget": "افزودن ویجت", + "@addWidget": {}, + "widgetCustom": "سفارشی", + "@widgetCustom": {}, + "widgetName": "نام", + "@widgetName": {}, + "widgetUrlError": "این آدرس وب معتبر نیست.", + "@widgetUrlError": {}, + "widgetNameError": "لطفا یک نام نمایشی مشخص کنید.", + "@widgetNameError": {}, + "errorAddingWidget": "بروز خطا هنگام افزودن ویجت.", + "@errorAddingWidget": {}, + "youJoinedTheChat": "شما به گپ پیوستید", + "@youJoinedTheChat": {}, + "youBannedUser": "شما {user} را محروم کردید", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "شما دعوت {user} را پس‌گرفتید", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 شما توسط {user} دعوت شده‌اید", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youKicked": "👞 شما {user} را بیرون کردید", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "users": "کاربرها", + "@users": {}, + "storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.", + "@storeInSecureStorageDescription": {}, + "jump": "پرش", + "@jump": {}, + "allRooms": "تمام چت‌های گروهی", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "report": "گزارش", + "@report": {}, + "openLinkInBrowser": "بازکردن پیوند در مرورگر", + "@openLinkInBrowser": {}, + "reportErrorDescription": "اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.", + "@reportErrorDescription": {}, + "signInWithPassword": "ورود با رمزعبور", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "notAnImage": "یک فایل تصویری نیست.", + "@notAnImage": {} } diff --git a/assets/l10n/intl_fi.arb b/assets/l10n/intl_fi.arb index 8cca2bae80..f710a59090 100644 --- a/assets/l10n/intl_fi.arb +++ b/assets/l10n/intl_fi.arb @@ -1,17 +1,6 @@ { - "passwordsDoNotMatch": "Salasanat eivät täsmää!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Syötä kelvollinen sähköpostiosoite.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Salasana uudelleen", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Käytä vähintään {min} merkkiä.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "about": "Tietoa FluffyChatista", "@about": { "type": "text", @@ -27,11 +16,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Tilitiedot", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "acceptedTheInvitation": "{username} hyväksyi kutsun", "@acceptedTheInvitation": { "type": "text", @@ -39,7 +23,7 @@ "username": {} } }, - "activatedEndToEndEncryption": "{username} otti käyttöön päästä-päähän salauksen", + "activatedEndToEndEncryption": "🔐 {username} otti käyttöön päästä-päähän salauksen", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -61,17 +45,7 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Lisää ryhmän kuvaus", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Lisää uusi ystävä", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Lisää Spaceen", + "addToSpace": "Lisää tilaan", "@addToSpace": {}, "admin": "Ylläpitäjä", "@admin": { @@ -93,11 +67,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Onko sinulla jo tunnus?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} vastasi puheluun", "@answeredTheCall": { "type": "text", @@ -115,11 +84,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arkistoitu huone", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Sallitaanko vieraiden liittyminen", "@areGuestsAllowedToJoin": { "type": "text", @@ -140,16 +104,6 @@ "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Profiilikuva vaihdettu", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Syötä turvavaraston salalause tai palautusavain varmistaaksesi istuntosi.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Hyväksytäänkö tämä varmennuspyyntö käyttäjältä {username}?", "@askVerificationRequest": { "type": "text", @@ -157,21 +111,6 @@ "username": {} } }, - "audioPlayerPause": "Keskeytä", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Toista", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Tunnistaminen", - "@authentication": { - "type": "text", - "placeholders": {} - }, "sendOnEnter": "Lähetä painamalla rivinvaihtonäppäintä", "@sendOnEnter": {}, "badServerVersionsException": "Kotipalvelin tukee Matrix Spec versio(it)a:\n{serverVersions}, mutta tämä sovellus tukee vain versio(it)a {supportedVersions}", @@ -315,26 +254,11 @@ "username": {} } }, - "changelog": "Muutosloki", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Vaihda salasana", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Muutokset on tallennettu", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Avaimet ovat välimuistissa", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "changedTheRoomAliases": "{username} muutti huoneen aliaksia", "@changedTheRoomAliases": { "type": "text", @@ -369,12 +293,6 @@ "type": "text", "placeholders": {} }, - "yourUserId": "Käyttäjätunnuksesi:", - "@yourUserId": {}, - "setupChatBackup": "Aseta keskustelun varmuuskopiointi", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Kirjoitin avaimen paperille", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Keskustelujesi varmuuskopiointi on asetettu.", "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "Keskustelun varmuuskopiointi", @@ -382,7 +300,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "Keskustelujesi varmuskopio on suojattu turva-avaimella. Varmistathan ettet hävitä sitä.", + "chatBackupDescription": "Vanhat viestisi on suojattu palautusavaimella. Varmistathan ettet hävitä sitä.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -392,7 +310,7 @@ "type": "text", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Keskustelu on lisätty tähän Spaceen", + "chatHasBeenAddedToThisSpace": "Keskustelu on lisätty tähän tilaan", "@chatHasBeenAddedToThisSpace": {}, "chats": "Keskustelut", "@chats": { @@ -404,11 +322,6 @@ "type": "text", "placeholders": {} }, - "clearText": "Tyhjennä teksti", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Sulje", "@close": { "type": "text", @@ -464,11 +377,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Luo tunnus nyt", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} loi keskustelun", "@createdTheChat": { "type": "text", @@ -476,12 +384,7 @@ "username": {} } }, - "createNewGroup": "Luo uusi ryhmä", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Uusi Space", + "createNewSpace": "Uusi tila", "@createNewSpace": { "type": "text", "placeholders": {} @@ -521,7 +424,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Oikeuksien oletustaso", + "defaultPermissionLevel": "Uusien käyttäjien oikeuksien oletustaso", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -541,11 +444,6 @@ "type": "text", "placeholders": {} }, - "deny": "Kieltäydy", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Laite", "@device": { "type": "text", @@ -561,46 +459,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Salaus on turvallinen vain kaikkien laitteiden ollessa varmennettuja.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Suorat keskustelut", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Hylkää kuva", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Löydä", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Löydä ryhmiä", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Näyttönimi on vaihdettu", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Lahjoita", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Peruuta äläkä kysy uudelleen", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Lataa tiedosto", "@downloadFile": { "type": "text", @@ -616,21 +484,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Muokkaa keskustelun oikeuksia", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Muokkaa näyttönimeä", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Muokkaa Jitsi-instanssia", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Muokkaa huoneen aliaksia", "@editRoomAliases": { "type": "text", @@ -681,21 +539,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Salausalgoritmi", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Salaus ei ole käytössä", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Päästä-päähän-salauksen asetukset", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} päätti puhelun", "@endedTheCall": { "type": "text", @@ -703,21 +551,11 @@ "senderName": {} } }, - "enterAUsername": "Syötä käyttäjätunnus", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Syötä sähköposti-osoite", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAGroupName": "Syötä huoneen nimi", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "homeserver": "Kotipalvelin", "@homeserver": {}, "enterYourHomeserver": "Syötä kotipalvelimesi", @@ -747,11 +585,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Tiedostokoko", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Alkaen liittymisestä", "@fromJoining": { "type": "text", @@ -772,16 +605,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Ryhmän kuvaus", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Ryhmän kuvaus muutettu", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Ryhmä on julkinen", "@groupIsPublic": { "type": "text", @@ -832,11 +655,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Kotipalvelin ei ole yhteensopiva", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Kuinka loukkaavaa tämä sisältö on?", "@howOffensiveIsThisContent": { "type": "text", @@ -862,21 +680,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Voit jättää sinulle häiriöksi olevat käyttäjät huomioitta. Et pysty vastaanottamaan viestejä tai huonekutsuja henkilökohtaisella huomioimatta jättämislistallasi olevilta käyttäjiltä.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Jätä käyttäjätunnus huomioitta", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Epäkelpo sähköposti-osoite", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Kutsu yhteystieto", "@inviteContact": { "type": "text", @@ -887,7 +690,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} kutsui käyttäjän {targetName}", + "invitedUser": "📩 {username} kutsui käyttäjän {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -905,7 +708,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} kutsui sinutFluffyChattiin. \n1. Asenna FluffyChat osoitteesta: https://fluffychat.im \n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki: {link}", + "inviteText": "{username} kutsui sinut FluffyChattiin.\n1. Viereaile sivulla: https://fluffychat.im ja asenna sovellus\n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -913,12 +716,7 @@ "link": {} } }, - "keysMissing": "Avaimet puuttuvat", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} potki käyttäjän {targetName}", + "kicked": "👞 {username} potki käyttäjän {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -926,7 +724,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} potki ja antoi porttikiellon käyttäjälle {targetName}", + "kickedAndBanned": "🙅 {username} potki ja antoi porttikiellon käyttäjälle {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -946,16 +744,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Viimeksi nähty IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Nähty kauan sitten", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Poistu", "@leave": { "type": "text", @@ -1015,28 +803,11 @@ "homeserver": {} } }, - "loginWithOneClick": "Kirjaudu sisään yhdellä klikkauksella", - "@loginWithOneClick": {}, "logout": "Kirjaudu ulos", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Tee valvojaksi", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Tee ylläpitäjäksi", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Varmista tunnisteen kelvollisuus", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "mention": "Mainitse", "@mention": { "type": "text", @@ -1047,28 +818,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Viesti poistetaan kaikilta osallistujilta", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Valvoja", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "maanantaina", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, other{{count} tapahtumaa lisää}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Vaienna keskustelu", "@muteChat": { "type": "text", @@ -1079,7 +833,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Uusi viesti FluffyChätissä", + "newMessageInFluffyChat": "💬 Uusi viesti FluffyChätissä", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1104,11 +858,6 @@ "type": "text", "placeholders": {} }, - "noDescription": "Ei kuvausta", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEncryptionForPublicRooms": "Voit ottaa salauksen käyttöön vasta kun huone ei ole julkisesti liityttävissä.", "@noEncryptionForPublicRooms": { "type": "text", @@ -1122,12 +871,6 @@ "server2": {} } }, - "createNewChatExplaination": "Skannaa QR-koodi tai jaa kutsulinkkisi jos ette ole vierekkäin.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Jaa kutsulinkkisi", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Kirjoita kutsulinkki käsin...", - "@typeInInviteLinkManually": {}, "scanQrCode": "Skannaa QR-koodi", "@scanQrCode": {}, "none": "Ei yhtään", @@ -1135,10 +878,6 @@ "type": "text", "placeholders": {} }, - "newPasswordDescription": "Voidaksesi palauttaa salasanasi myöhemmin, lisääthän tunnuksellesi myöhemmin sähköposti-osoitteen.", - "@newPasswordDescription": {}, - "newUsernameDescription": "Käyttäjätunnuksellasi tulee olemaan muoto @käyttäjätunnus:palvelinnimi", - "@newUsernameDescription": {}, "noPasswordRecoveryDescription": "Et ole vielä lisännyt tapaa salasanasi palauttamiseksi.", "@noPasswordRecoveryDescription": { "type": "text", @@ -1149,28 +888,11 @@ "type": "text", "placeholders": {} }, - "noStatusesFound": "Tiloja ei löytynyt vielä.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Ilmoitukset", "@notifications": { "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Ei tuettu verkkoversiossa", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} valittu", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} käyttäjää kirjoittavat…", "@numUsersTyping": { "type": "text", @@ -1213,31 +935,16 @@ "type": "text", "placeholders": {} }, - "changeWallpaper": "Vaihda taustakuva", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Vaihda profiilikuvasi", "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "crossSigningEnabled": "Ristiinvarmennus on käytössä", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "chat": "Keskustelu", "@chat": { "type": "text", "placeholders": {} }, - "chooseAUsername": "Valitse käyttäjätunnus", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Tyhjennä arkisto", "@clearArchive": {}, "forward": "Edelleenlähetä", @@ -1245,11 +952,6 @@ "type": "text", "placeholders": {} }, - "friends": "Ystävät", - "@friends": { - "type": "text", - "placeholders": {} - }, "commandHint_join": "Liity syötettyyn huoneeseen", "@commandHint_join": { "type": "text", @@ -1260,7 +962,7 @@ "type": "text", "description": "Usage hint for the command /me" }, - "compareEmojiMatch": "Vertaile ja varmista emojien olevan samat molemmilla laitteilla:", + "compareEmojiMatch": "Vertaa hymiöitä", "@compareEmojiMatch": { "type": "text", "placeholders": {} @@ -1270,21 +972,11 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Yhteysyritys epäonnistui", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "containsUserName": "Sisältää käyttäjätunnuksen", "@containsUserName": { "type": "text", "placeholders": {} }, - "couldNotSetDisplayname": "Näyttönimen asettaminen ei onnistunut", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} osallistujaa", "@countParticipants": { "type": "text", @@ -1292,11 +984,6 @@ "count": {} } }, - "crossSigningDisabled": "Ristiinvarmennus ei ole käytössä", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Vaihda kotipalvelinta", "@changeTheHomeserver": { "type": "text", @@ -1307,23 +994,11 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Vaihda palvelinta", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "Salaus on korruptoitunut", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "setupChatBackupDescription": "Suojellaksemme viestejäsi olemme luoneet sinulle turva-avaimen.\nPidäthän tätä turvallisessa paikassa, kuten salasanamanagerissasi.", - "@setupChatBackupDescription": {}, - "chatHasBeenRemovedFromThisSpace": "Keskustelu on poistettu tästä Spacesta", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "commandHint_kick": "Poista syötetty käyttäjä huoneesta", "@commandHint_kick": { "type": "text", @@ -1351,7 +1026,7 @@ "@commandInvalid": { "type": "text" }, - "compareNumbersMatch": "Vertaile ja varmista numeroiden olevan samat molemmilla laitteilla:", + "compareNumbersMatch": "Vertaa numeroita", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -1393,11 +1068,6 @@ "error": {} } }, - "couldNotSetAvatar": "Profiilikuvan asetus ei onnistunut", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, "encrypted": "Salattu", "@encrypted": { "type": "text", @@ -1408,8 +1078,6 @@ "type": "text", "placeholders": {} }, - "enterASpacepName": "Syötä Spacen nimi", - "@enterASpacepName": {}, "inoffensive": "Loukkaamatonta", "@inoffensive": { "type": "text", @@ -1422,21 +1090,11 @@ "groupName": {} } }, - "isDeviceKeyCorrect": "Onko seuraava laiteavain oikea?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "kirjoittaa…", "@isTyping": { "type": "text", "placeholders": {} }, - "contentViewer": "Sisällön katselin", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Ota emote-paketti käyttöön kaikkialla", "@enableEmotesGlobally": { "type": "text", @@ -1447,11 +1105,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Ottaa keskustelun varmuuskopioinnin käyttöön, jottet koskaan menetä pääsyä keskusteluihisi.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEncryption": "Ota salaus käyttöön", "@enableEncryption": { "type": "text", @@ -1467,11 +1120,6 @@ "type": "text", "placeholders": {} }, - "friday": "perjantaina", - "@friday": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Olen klikannut linkkiä", "@iHaveClickedOnLink": { "type": "text", @@ -1482,28 +1130,13 @@ "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} liittyi keskusteluun", + "joinedTheChat": "👋 {username} liittyi keskusteluun", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "keysCached": "Avaimet ovat välimuistissa", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat ei toistaiseksi tue ristiinvarmennuksen käyttöönottoa. Otathan sen käyttöön Elementistä.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Otathan verkkoavainvarmuuskopion käyttöön Elementistä.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "notificationsEnabledForThisAccount": "Tämän tunnuksen ilmoitukset ovat käytössä", "@notificationsEnabledForThisAccount": { "type": "text", @@ -1529,12 +1162,7 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Julkisia huoneita ei löytynyt…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Vaikuttaa siltä, ettei puhelimessasi ole Google-palveluita. Se on hyvä päätös yksityisyytesi kannalta! Vastaanottaaksesi push-notifikaatioita FluffyChätissä suosittelemme https://microg.org/ tai https://unifiedpush.org/ käyttämistä.", + "noGoogleServicesWarning": "Firebase Cloud Messaging -palvelu ei vaikuta olevan saatavilla laitteellasi. Saadaksesi push-ilmoituksia silti, suosittelemme Ntfy-sovelluksen asentamista. Käyttämällä Ntfy-sovellusta tai muuta Unified Push -tarjoajaa, saat push-ilmoitukset tietoturvallisella tavalla. Voit ladata Ntfy-sovelluksen Play Kaupasta tai F-Droidista.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1546,11 +1174,6 @@ }, "enableMultiAccounts": "(BETA) Ota käyttöön tuki usealle tilille tällä laitteella", "@enableMultiAccounts": {}, - "onlineKeyBackupDisabled": "Verkkoavainvarmuuskopio on pois käytöstä", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Verkkkoavainvarmuuskopio on käytössä", "@onlineKeyBackupEnabled": { "type": "text", @@ -1603,11 +1226,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Osallistuvat käyttäjän laitteet", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "password": "Salasana", "@password": { "type": "text", @@ -1655,11 +1273,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Valitse käyttäjätunnus", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Klikkaa linkkiä sähköpostissa ja sitten jatka.", "@pleaseClickOnLink": { "type": "text", @@ -1690,16 +1303,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Julkiset ryhmät", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Julkinen avain", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "recording": "Tallenne", "@recording": { "type": "text", @@ -1766,29 +1369,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Poista viesti", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Kadonnut turva-avain?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{Nähnyt {username} ja {count} muuta}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "securityKey": "Turva-avain", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Nähnyt {username}", "@seenByUser": { "type": "text", @@ -1801,14 +1381,6 @@ "type": "text", "placeholders": {} }, - "seenByUserAndUser": "Nähnyt {username} ja {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Lähetä", "@send": { "type": "text", @@ -1823,11 +1395,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Salli bugiraporttien lähettäminen sentry.io -palvelun kautta", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Lähetä tiedosto", "@sendFile": { "type": "text", @@ -1848,16 +1415,6 @@ "type": "text", "placeholders": {} }, - "sessionVerified": "Istunto on varmennettu", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Aseta profiilikuva", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Aseta pääalias", "@setAsCanonicalAlias": { "type": "text", @@ -1868,11 +1425,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Aseta ryhmän kuvaus", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Aseta kutsulinkki", "@setInvitationLink": { "type": "text", @@ -1915,22 +1467,17 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Ääni, värinä, LEDin väri", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Lähdekoodi", "@sourceCode": { "type": "text", "placeholders": {} }, - "spaceIsPublic": "Space on julkinen", + "spaceIsPublic": "Tila on julkinen", "@spaceIsPublic": { "type": "text", "placeholders": {} }, - "spaceName": "Spacen nimi", + "spaceName": "Tilan nimi", "@spaceName": { "type": "text", "placeholders": {} @@ -1950,16 +1497,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Napauta laitetta varmistaaksesi", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Napauta näyttääksesi kuvan", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Ne eivät täsmää", "@theyDontMatch": { "type": "text", @@ -1970,16 +1507,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Tämä huone on arkistoitu.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "torstaina", - "@thursday": { - "type": "text", - "placeholders": {} - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2041,18 +1568,6 @@ "type": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 lukematon viesti} other{{unreadEvents} lukematonta viestiä}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Käytetäänkö AMOLED-yhteensopivia värejä?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} ja {count} muuta kirjoittavat…", "@userAndOthersAreTyping": { "type": "text", @@ -2076,23 +1591,13 @@ "username": {} } }, - "userLeftTheChat": "{username} poistui keskustelusta", + "userLeftTheChat": "🚪 {username} poistui keskustelusta", "@userLeftTheChat": { "type": "text", "placeholders": { "username": {} } }, - "timeOfDay": "{hours24}.{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "userSentUnknownEvent": "{username} lähetti {type}-tapahtuman", "@userSentUnknownEvent": { "type": "text", @@ -2101,11 +1606,6 @@ "type": {} } }, - "userVerified": "Käyttäjä on varmistettu", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "unverified": "Varmistamaton", "@unverified": {}, "verified": "Varmistettu", @@ -2163,7 +1663,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Taustakuva", + "wallpaper": "Taustakuva:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2173,26 +1673,11 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Päästä-päähän salaus on toistaiseksi Beta-vaiheessa! Käytä omalla vastuullasi!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "keskiviikkona", - "@wednesday": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Lähetimme sinulle sähköpostia", "@weSentYouAnEmail": { "type": "text", "placeholders": {} }, - "welcomeText": "Tervetuloa Matrix-verkon söpöimpään pikaviestimeen.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "whoCanPerformWhichAction": "Kuka voi suorittaa minkä toimenpiteen", "@whoCanPerformWhichAction": { "type": "text", @@ -2208,7 +1693,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Pyyhi keskusteluvarmuuskopio luodaksesi uuden turva-avaimen?", + "wipeChatBackup": "Pyyhi keskusteluvarmuuskopio luodaksesi uuden palautusavaimen?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2218,67 +1703,24 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Sinut on kutsuttu tähän keskusteluun", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Et enää osallistu tähän keskusteluun", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Et voi kutsua itseäsi", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Sinulle on annettu porttikielto tähän keskusteluun", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Keskustelujasi synkronoidaan…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Sinut yhdistetään palvelimeen {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomOut": "Loitonna", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "removeFromSpace": "Poista Spacesta", + "removeFromSpace": "Poista tilasta", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Tämä poistaa keskustelun nykyisestä Spacesta. Se tulee yhä näkymään kategoriassa \"Kaikki keskustelut\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Valitse Space, jonne tämä keskustelu lisätään.", + "addToSpaceDescription": "Valitse tila, johon tämä keskustelu lisätään.", "@addToSpaceDescription": {}, "start": "Aloita", "@start": {}, - "setupChatBackupNow": "Määritä keskusteluvarmuuskopiosi nyt", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Avataksesi keskusteluvarmuuskopiosi, syötä turva-avain, joka luotiin edellisessä istunnossa. Turva-avaimesi EI OLE salasanasi.", - "@pleaseEnterSecurityKeyDescription": {}, "serverRequiresEmail": "Tämän palvelimen täytyy tarkistaa sähköposti-osoitteesi rekisteröitymistä varten.", "@serverRequiresEmail": {}, - "unknownSessionVerify": "Tuntematon istunto, varmennathan sen", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Istunto varmennettu onnistuneesti!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "roomVersion": "Huoneen versio", "@roomVersion": { "type": "text", @@ -2296,26 +1738,11 @@ "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "Syötä turva-avaimesi:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Hae keskustelua", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "verify": "Varmista", "@verify": { "type": "text", "placeholders": {} }, - "optionalGroupName": "(Vapaaehtoinen) ryhmän nimi", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "salalause tai palautusavain", "@passphraseOrKey": { "type": "text", @@ -2331,24 +1758,19 @@ "type": "text", "placeholders": {} }, - "saturday": "lauantaina", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "Hae", "@search": { "type": "text", "placeholders": {} }, - "sentAFile": "{username} lähetti tiedoston", + "sentAFile": "📁 {username} lähetti tiedoston", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} lähetti ääniviestin", + "sentAnAudio": "🎤 {username} lähetti ääniviestin", "@sentAnAudio": { "type": "text", "placeholders": { @@ -2362,11 +1784,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Syötä Matrix-ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Poista profiilikuvasi", "@removeYourAvatar": { "type": "text", @@ -2392,11 +1809,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Pyydä vanhempien viestien lukemista", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, "saveFile": "Tallenna tiedosto", "@saveFile": { "type": "text", @@ -2412,21 +1824,11 @@ "type": "text", "placeholders": {} }, - "signUp": "Rekisteröidy", - "@signUp": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Julkiset huoneet", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Julkinen Space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Push-säännöt", "@pushRules": { "type": "text", @@ -2442,54 +1844,32 @@ "type": "text", "placeholders": {} }, - "revokeAllPermissions": "Mitätöi kaikki oikeudet", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Tallennettu nimellä {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFileToFolder": "Tallenna tiedosto tähän kansioon", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "sendVideo": "Lähetä video", "@sendVideo": { "type": "text", "placeholders": {} }, - "sentAPicture": "{username} lähetti kuvan", + "sentAPicture": "🖼️ {username} lähetti kuvan", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} lähetti tarran", + "sentASticker": "😊 {username} lähetti tarran", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} lähetti videon", + "sentAVideo": "🎥 {username} lähetti videon", "@sentAVideo": { "type": "text", "placeholders": { "username": {} } }, - "sentryInfo": "Tietoa yksityisyydestäsi: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, "shareLocation": "Jaa sijainti", "@shareLocation": { "type": "text", @@ -2500,21 +1880,11 @@ "type": "text", "placeholders": {} }, - "startYourFirstChat": "Aloita ensimmäinen juttelusi juuri nyt! 🙂\n- Paina 'Uusi keskustelu'\n- Skannaa ystävän QR-koodi\n- Pidä hauskaa jutustellen", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "Millainen on vointisi?", "@statusExampleMessage": { "type": "text", "placeholders": {} }, - "sunday": "sunnuntaina", - "@sunday": { - "type": "text", - "placeholders": {} - }, "unreadChats": "{unreadCount, plural, =1{1 lukematon keskustelu} other{{unreadCount} lukematonta keskustelua}}", "@unreadChats": { "type": "text", @@ -2541,26 +1911,11 @@ "type": "text", "placeholders": {} }, - "tapToShowMenu": "Napauta näyttääksesi valikon", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "toggleFavorite": "Suosikki-kytkin", "@toggleFavorite": { "type": "text", "placeholders": {} }, - "tuesday": "tiistaina", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Avaa keskustelun varmuuskopion lukitus", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Poista keskustelun mykistys", "@unmuteChat": { "type": "text", @@ -2580,26 +1935,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Käyttäjä ei ole varmennettu", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Käyttäjän varmistus on tuntemattomassa tilassa", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Varmista manuaalisesti", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Varmista käyttäjä", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "writeAMessage": "Kirjoita viesti…", "@writeAMessage": { "type": "text", @@ -2615,27 +1950,15 @@ "type": "text", "placeholders": {} }, - "yourOwnUsername": "Oma käyttäjätunnuksesi", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Julkinen avaimesi", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "zoomIn": "Lähennä", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, "messageInfo": "Viestin tiedot", "@messageInfo": {}, "openGallery": "Avaa galleria", "@openGallery": {}, - "saveTheSecurityKeyNow": "Tallenna turva-avain nyt", - "@saveTheSecurityKeyNow": {}, "commandHint_clearcache": "Tyhjennä välimuisti", "@commandHint_clearcache": { "type": "text", @@ -2651,18 +1974,6 @@ "type": "text", "description": "Usage hint for the command /dm" }, - "yourStory": "Sinun tarinasi", - "@yourStory": {}, - "replyHasBeenSent": "Vastaus on lähetetty", - "@replyHasBeenSent": {}, - "storyFrom": "Tarina ajalta {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, "commandHint_discardsession": "Hylkää istunto", "@commandHint_discardsession": { "type": "text", @@ -2680,35 +1991,12 @@ "size": {} } }, - "whoCanSeeMyStoriesDesc": "Huomaathan, että ihmiset voivat nähdä ja olla yhteydessä toisiinsa tarinassasi.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Lisää tarinaan", - "@addToStory": {}, "publish": "Julkaise", "@publish": {}, - "whoCanSeeMyStories": "Kuka voi nähdä tarinani?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Poista tarinoiden tilaus", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Tämä käyttäjä ei ole vielä julkaissut mitään tarinassaan", - "@thisUserHasNotPostedAnythingYet": {}, - "iUnderstand": "Ymmärrän", - "@iUnderstand": {}, - "storyPrivacyWarning": "Huomaathan ihmisten pystyvän näkemään ja olemaan yhteydessä toisiinsa tarinassasi. Tarinasi tulevat olemaan näkyvissä 24 tuntia, mutta niiden poistamisesta kaikilta laitteilta ja palvelimilta ei ole takeita.", - "@storyPrivacyWarning": {}, - "whatIsGoingOn": "Mitä on meneillään?", - "@whatIsGoingOn": {}, - "addDescription": "Lisää kuvaus", - "@addDescription": {}, "markAsRead": "Merkitse luetuksi", "@markAsRead": {}, "dismiss": "Hylkää", "@dismiss": {}, - "bubbleSize": "Kuplan koko", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "emojis": "Hymiöt", "@emojis": {}, "unsupportedAndroidVersionLong": "Tämä ominaisuus vaatii uudemman Android-version. Tarkista päivitykset tai LineageOS-tuki.", @@ -2723,12 +2011,6 @@ "@videoCallsBetaWarning": {}, "placeCall": "Soita", "@placeCall": {}, - "matrixWidgets": "Matrix-pienoisohjelmat", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Pienoisohjelmien ja integraatioiden muokkaus ei vielä ole mahdollista.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Muokkaa pienoisohjelmia ja integraatioita", - "@editIntegrations": {}, "reactedWith": "{sender} reagoi {reaction}", "@reactedWith": { "type": "text", @@ -2741,12 +2023,8 @@ "@openChat": {}, "pinMessage": "Kiinnitä huoneeseen", "@pinMessage": {}, - "pinnedEventsError": "Virhe ladattaessa kiinnitettyjä viestejä", - "@pinnedEventsError": {}, "confirmEventUnpin": "Haluatko varmasti irrottaa tapahtuman pysyvästi?", "@confirmEventUnpin": {}, - "editWidgets": "Muokkaa pienoissovelluksia", - "@editWidgets": {}, "widgetVideo": "Video", "@widgetVideo": {}, "widgetJitsi": "Jitsi Meet", @@ -2780,18 +2058,11 @@ "@widgetNameError": {}, "addWidget": "Lisää pienoissovellus", "@addWidget": {}, - "showSpaces": "Näytä Space-luettelo", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Näytä Spaceihin kuuluvat suorat keskustelut niissä", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "youRejectedTheInvitation": "Kieltäydyit kutsusta", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Liityit keskusteluun", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Hyväksyit kutsun", + "youAcceptedTheInvitation": "👍 Hyväksyit kutsun", "@youAcceptedTheInvitation": {}, "youBannedUser": "Annoit porttikiellon käyttäjälle {user}", "@youBannedUser": { @@ -2805,25 +2076,25 @@ "user": {} } }, - "youInvitedBy": "{user} kutsui sinut", + "youInvitedBy": "📩 {user} kutsui sinut", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youKicked": "Poistit käyttäjän {user} keskustelusta", + "youKicked": "👞 Potkit käyttäjän {user} keskustelusta", "@youKicked": { "placeholders": { "user": {} } }, - "youInvitedUser": "Kutsuit käyttäjän {user}", + "youInvitedUser": "📩 Kutsuit käyttäjän {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Poistit ja annoit porttikiellon käyttäjälle {user}", + "youKickedAndBanned": "🙅 Potkit ja annoit porttikiellon käyttäjälle {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2835,11 +2106,309 @@ "user": {} } }, - "separateChatTypes": "Erota suorat keskustelut, ryhmät ja Spacet", + "separateChatTypes": "Erota yksityiskeskustelut ryhmistä", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "noEmailWarning": "Syötä oikea sähköposti-osoite. Muutoin et voi palauttaa salasanaasi. Jollet halua, paina näppäintä uudelleen jatkaaksesi.", - "@noEmailWarning": {} + "dehydrateTor": "TOR-käyttäjät: vie istunto", + "@dehydrateTor": {}, + "hydrateTor": "TOR-käyttäjät: tuo viety istunto", + "@hydrateTor": {}, + "hydrateTorLong": "Veitkö edellisen istuntosi käyttäessäsi TORia? Tuo se nopeasti ja jatka jutustelua.", + "@hydrateTorLong": {}, + "pleaseEnterRecoveryKey": "Syötä palautusavaimesi:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Palautusavain", + "@recoveryKey": {}, + "recoveryKeyLost": "Kadonnut palautusavain?", + "@recoveryKeyLost": {}, + "dehydrateTorLong": "Tor-käyttäjille suositellaan istunnon vientiä ennen ikkunan sulkemista.", + "@dehydrateTorLong": {}, + "hydrate": "Palauta varmuuskopiotiedostosta", + "@hydrate": {}, + "dehydrate": "Vie istunto ja tyhjennä laite", + "@dehydrate": {}, + "dehydrateWarning": "Tätä toimenpidettä ei voi kumota.\nVarmista varmuuskopiotiedoston turvallinen tallennus.", + "@dehydrateWarning": {}, + "users": "Käyttäjät", + "@users": {}, + "storeSecurlyOnThisDevice": "Tallenna turvallisesti tälle laitteelle", + "@storeSecurlyOnThisDevice": {}, + "pleaseEnterRecoveryKeyDescription": "Avataksesi vanhojen viestiesi salauksen, syötä palautusavaimesi, joka luotiin edellisessä istunnossa. Palautusavaimesi EI OLE salasanasi.", + "@pleaseEnterRecoveryKeyDescription": {}, + "unlockOldMessages": "Pura vanhojen viestien salaus", + "@unlockOldMessages": {}, + "indexedDbErrorLong": "Viestivarasto ei ole käytössä yksityisselauksessa oletuksena.\nKäythän osoitteessa\n - about:config\n - Aseta dom.indexedDB.privateBrowsing.enabled arvoon true\nMuuten FluffyChatin käyttäminen ei ole mahdollista.", + "@indexedDbErrorLong": {}, + "saveKeyManuallyDescription": "Tallenna tämä avain manuaalisesti käyttäen järjestelmän jakodialogia tai leikepöytää.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Tallenna Android KeyStoreen", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Tallenna Applen avainnippuun", + "@storeInAppleKeyChain": {}, + "countFiles": "{count} tiedostoa", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "storeInSecureStorageDescription": "Tallenna palautusavain tämän laitteen turvavarastoon.", + "@storeInSecureStorageDescription": {}, + "indexedDbErrorTitle": "Yksityisen selauksen ongelmat", + "@indexedDbErrorTitle": {}, + "user": "Käyttäjä", + "@user": {}, + "custom": "Mukautettu", + "@custom": {}, + "confirmMatrixId": "Kirjoita Matrix IDsi uudelleen poistaaksesi tunnuksesi.", + "@confirmMatrixId": {}, + "supposedMxid": "Tämän pitäisi olla {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasgroup": "Merkitse ryhmäksi", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Miksei tätä viestiä voida lukea?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Tämä voi tapahtua mikäli viesti lähetettiin ennen sisäänkirjautumistasi tälle laitteelle.\n\nOn myös mahdollista, että lähettäjä on estänyt tämän laitteen tai jokin meni pieleen verkkoyhteyden kanssa.\n\nPystytkö lukemaan viestin toisella istunnolla? Siinä tapauksessa voit siirtää viestin siltä! Mene Asetukset > Laitteet ja varmista, että laitteesi ovat varmistaneet toisensa. Seuraavankerran avatessasi huoneen ja molempien istuntojen ollessa etualalla, avaimet siirretään automaattisesti.\n\nHaluatko varmistaa ettet menetä avaimia uloskirjautuessa tai laitteita vaihtaessa? Varmista avainvarmuuskopion käytössäolo asetuksista.", + "@noKeyForThisMessage": {}, + "commandHint_markasdm": "Merkitse yksityiskeskusteluksi syötetyn Matrix IDn kanssa", + "@commandHint_markasdm": {}, + "foregroundServiceRunning": "Tämä ilmoitus näkyy etualapalvelun ollessa käynnissä.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Puheluoikeudet", + "@callingPermissions": {}, + "callingAccount": "Soittamistunnus", + "@callingAccount": {}, + "callingAccountDetails": "Sallii FluffyChatin käyttää Androidin omaa Puhelut-sovellusta.", + "@callingAccountDetails": {}, + "appearOnTop": "Näy päällä", + "@appearOnTop": {}, + "appearOnTopDetails": "Sallii sovelluksen näkyä muiden sovellusten päällä (tätä ei tarvita, mikäli olet jo määrittänyt FluffyChatin puhelin-tunnukseksi)", + "@appearOnTopDetails": {}, + "newSpace": "Uusi tila", + "@newSpace": {}, + "enterSpace": "Siirry tilaan", + "@enterSpace": {}, + "enterRoom": "Siirry huoneeseen", + "@enterRoom": {}, + "allSpaces": "Kaikki tilat", + "@allSpaces": {}, + "screenSharingTitle": "ruudunjako", + "@screenSharingTitle": {}, + "otherCallingPermissions": "Mikrofoni, kamera ja muut FluffyChatin oikeudet", + "@otherCallingPermissions": {}, + "newGroup": "Uusi ryhmä", + "@newGroup": {}, + "screenSharingDetail": "Jaat ruutuasi FluffyChatissä", + "@screenSharingDetail": {}, + "hugContent": "{senderName} halaa sinua", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} kokovartalohalaa sinua", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_hug": "Lähetä halaus", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} lähettää askartelusilmiä", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "numChats": "{number} keskustelua", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "commandHint_googly": "Lähetä askartelusilmiä", + "@commandHint_googly": {}, + "commandHint_cuddle": "Lähetä kokovartaluhalaus", + "@commandHint_cuddle": {}, + "hideUnimportantStateEvents": "Piilota ei-niin-tärkeät tilatapahtumat", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Älä näytä uudelleen", + "@doNotShowAgain": {}, + "fileHasBeenSavedAt": "Tiedosto on tallennettu sijaintiin {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "disableEncryptionWarning": "Turvallisuuden vuoksi et voi poistaa salausta käytöstä huoneista, joissa se on aiemmin otettu käyttöön.", + "@disableEncryptionWarning": {}, + "allRooms": "Kaikki ryhmäkeskustelut", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "Aloita ensimmäinen keskustelusi", + "@startFirstChat": {}, + "newSpaceDescription": "Tilat mahdollistavat keskusteluidesi keräämisen ja yksityisten tai julkisten yhteisöjen rakentamisen.", + "@newSpaceDescription": {}, + "deviceKeys": "Laite-avaimet:", + "@deviceKeys": {}, + "reopenChat": "Avaa keskustelu uudelleen", + "@reopenChat": {}, + "noOtherDevicesFound": "Muita laitteita ei löytynyt", + "@noOtherDevicesFound": {}, + "jumpToLastReadMessage": "Hyppää viimeiseen luettuun viestiin", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Luettu tähän asti", + "@readUpToHere": {}, + "jump": "Hyppää", + "@jump": {}, + "openLinkInBrowser": "Avaa linkki selaimessa", + "@openLinkInBrowser": {}, + "report": "ilmoita", + "@report": {}, + "encryptThisChat": "Salaa tämä keskustelu", + "@encryptThisChat": {}, + "noBackupWarning": "Varoitus! Ilman avainvarmuuskopion käyttöönottoa menetät pääsyn salattuihin viesteihisi. Suosittelemme ehdottomasti avainvarmuuskopion käyttöönottoa ennen uloskirjautumista.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Ei voi lähettää! Palvelin tukee liitetiedostoja vain enintään {max}.", + "@fileIsTooBigForServer": {}, + "reportErrorDescription": "😭 Voi ei. Jokin meni pieleen. Halutessasi voit ilmoittaa ongelman kehittäjille.", + "@reportErrorDescription": {}, + "wasDirectChatDisplayName": "Tyhjä keskustelu (oli {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "sorryThatsNotPossible": "Anteeksi... se ei ole mahdollista", + "@sorryThatsNotPossible": {}, + "signInWithPassword": "Kirjaudu sisään salasanalla", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Yritä myöhemmin uudelleen tai valitse toinen palvelin.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "setColorTheme": "Aseta väriteema:", + "@setColorTheme": {}, + "tryAgain": "Yritä uudelleen", + "@tryAgain": {}, + "messagesStyle": "Viestit:", + "@messagesStyle": {}, + "chatDescription": "Keskustelun kuvaus", + "@chatDescription": {}, + "invalidServerName": "Virheellinen palvelimen nimi", + "@invalidServerName": {}, + "chatPermissions": "Keskustelun oikeudet", + "@chatPermissions": {}, + "setChatDescription": "Asetti keskustelun kuvauksen", + "@setChatDescription": {}, + "importFromZipFile": "Tuo .zip -tiedostosta", + "@importFromZipFile": {}, + "redactedBy": "Poistanut {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "signInWith": "Kirjaudu sisään palvelulla {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "optionalRedactReason": "(Vapaaehtoinen) Syy tämän viestin poistamiselle...", + "@optionalRedactReason": {}, + "archiveRoomDescription": "Keskustelu siirretään arkistoon. Muut käyttäjät näkevät sinun poistuneen keskustelusta.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Vie emotepaketti .zip-tiedostona", + "@exportEmotePack": {}, + "inviteContactToGroupQuestion": "Tahdotko kutsua yhteystiedon {contact} keskusteluun \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Poistanut {username} syystä: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "redactMessageDescription": "Viesti poistetaan kaikilta keskustelun osallistujilta. Tätä ei voida kumota.", + "@redactMessageDescription": {}, + "invalidInput": "Virheellinen syöte!", + "@invalidInput": {}, + "addChatDescription": "Lisää keskustelulle kuvaus...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user} on koputtanut", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "directChat": "Yksityiskeskustelu", + "@directChat": {}, + "wrongPinEntered": "Väärä pin-koodi! Yritä uudelleen {seconds} sekuntin kuluttua...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Lähetä kirjoitusilmoituksia", + "@sendTypingNotifications": {}, + "inviteGroupChat": "Kutsu ryhmäkeskusteluun", + "@inviteGroupChat": {}, + "invitePrivateChat": "Kutsu yksityiskeskusteluun", + "@invitePrivateChat": {}, + "importEmojis": "Tuo emojit", + "@importEmojis": {}, + "noChatDescriptionYet": "Keskustelun kuvausta ei ole vielä luotu.", + "@noChatDescriptionYet": {}, + "notAnImage": "Tämä ei ole kuvatiedosto.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "Keskustelun kuvaus muutettu", + "@chatDescriptionHasBeenChanged": {}, + "roomUpgradeDescription": "Keskustelu luodaan uudelleen uudella huoneversiolla. Kaikille osallistujille ilmoitetaan, että heidän tulee siirtyä uuteen keskusteluun. Voit lukea lisää huoneversioista osoitteesta https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Syötä suurempi luku kuin 0", + "@pleaseEnterANumber": {}, + "profileNotFound": "Käyttäjää ei löydy palvelimelta. Tämä voi olla yhteysongelma tai käyttäjä ei ole olemassa.", + "@profileNotFound": {}, + "shareInviteLink": "Jaa kutsulinkki", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Viimeaikoina käytetyt emotet tulevat näkymään täällä...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Aseta teema:", + "@setTheme": {}, + "replace": "Korvaa", + "@replace": {}, + "createGroup": "Luo ryhmä", + "@createGroup": {}, + "importNow": "Tuo nyt", + "@importNow": {}, + "invite": "Kutsu", + "@invite": {}, + "swipeRightToLeftToReply": "Vastaa pyyhkäisemällä oikealta vasemmalle", + "@swipeRightToLeftToReply": {}, + "accessAndVisibility": "Pääsy ja näkyvyys", + "@accessAndVisibility": {}, + "unread": "Lukemattomat", + "@unread": {}, + "noMoreChatsFound": "Lisää keskusteluja ei löytynyt...", + "@noMoreChatsFound": {} } diff --git a/assets/l10n/intl_fil.arb b/assets/l10n/intl_fil.arb new file mode 100644 index 0000000000..07ef652180 --- /dev/null +++ b/assets/l10n/intl_fil.arb @@ -0,0 +1,870 @@ +{ + "remove": "Tanggalin", + "@remove": { + "type": "text", + "placeholders": {} + }, + "importNow": "I-import ngayon", + "@importNow": {}, + "importEmojis": "I-import ang mga Emoji", + "@importEmojis": {}, + "importFromZipFile": "Mag-import mula sa .zip file", + "@importFromZipFile": {}, + "exportEmotePack": "I-export ang Emote pack bilang .zip", + "@exportEmotePack": {}, + "accept": "Tanggapin", + "@accept": { + "type": "text", + "placeholders": {} + }, + "account": "Account", + "@account": { + "type": "text", + "placeholders": {} + }, + "addEmail": "Magdagdag ng email", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "confirmMatrixId": "Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.", + "@confirmMatrixId": {}, + "addChatDescription": "Magdagdag ng deskripsyon ng chat...", + "@addChatDescription": {}, + "admin": "Admin", + "@admin": { + "type": "text", + "placeholders": {} + }, + "alias": "alyas", + "@alias": { + "type": "text", + "placeholders": {} + }, + "all": "Lahat", + "@all": { + "type": "text", + "placeholders": {} + }, + "allChats": "Lahat ng mga chat", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "Magpadala ng mga googly eye", + "@commandHint_googly": {}, + "commandHint_cuddle": "Magpadala ng yakap", + "@commandHint_cuddle": {}, + "cuddleContent": "Niyakap ka ni {senderName}", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "Niyakap ka ni {senderName}", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "anyoneCanJoin": "Pwede sumali ang anumang tao", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "appLock": "Lock ng app", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "archive": "Archive", + "@archive": { + "type": "text", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Pwede ba sumali ang mga bisita", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "areYouSure": "Sigurado ka?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "askVerificationRequest": "Tanggapin ang hiling ng verification mula sa {username}?", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "autoplayImages": "Awtomatikong i-play ang mga gumagalaw na sticker at emote", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "sendTypingNotifications": "Ipadala ang mga typing notification", + "@sendTypingNotifications": {}, + "blockDevice": "I-block ang Device", + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "blocked": "Na-block", + "@blocked": { + "type": "text", + "placeholders": {} + }, + "changeDeviceName": "Palitan ang pangalan ng device", + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "changedTheChatAvatar": "Pinalitan ni {username} ang avatar ng chat", + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheGuestAccessRules": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita", + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheHistoryVisibility": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history", + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheHistoryVisibilityTo": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history sa: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheRoomAliases": "Pinalitan ni {username} ang mga alias ng room", + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changePassword": "Palitan ang password", + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "changeYourAvatar": "Palitan ang iyong avatar", + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Nasira ang encryption", + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "text", + "placeholders": {} + }, + "chatBackup": "Pag-backup ng chat", + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "Mga detalye ng chat", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Nadagdag ang chat sa space na ito", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Mga Chat", + "@chats": { + "type": "text", + "placeholders": {} + }, + "chooseAStrongPassword": "Pumili ng malakas na password", + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "clearArchive": "I-clear ang archive", + "@clearArchive": {}, + "close": "Isara", + "@close": { + "type": "text", + "placeholders": {} + }, + "commandHint_markasgroup": "Markahan bilang grupo", + "@commandHint_markasgroup": {}, + "commandHint_ban": "Pagbawalan ang ibinigay na user sa room na ito", + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "repeatPassword": "Ulitin ang password", + "@repeatPassword": {}, + "notAnImage": "Hindi isang file na larawan.", + "@notAnImage": {}, + "replace": "Palitan", + "@replace": {}, + "about": "Tungkol sa", + "@about": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 Tinanggap ni {username} ang imbitasyon", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "activatedEndToEndEncryption": "🔐 Na-activate ni {username} ang end to end encryption", + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "supposedMxid": "Dapat ito ay {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "addToSpace": "Idagdag sa space", + "@addToSpace": {}, + "commandHint_hug": "Magpadala ng yakap", + "@commandHint_hug": {}, + "googlyEyesContent": "Nagpadala si {senderName} ng googly eyes", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "answeredTheCall": "Sinagot ni {senderName} ang tawag", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "areYouSureYouWantToLogout": "Sigurado kang gusto mong mag-log out?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "askSSSSSign": "Para i-sign ang isa pang tao, pakilagay ang iyong secure store passphrase o recovery key.", + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "Ang homeserver ay sinusuportahan ang sumusunod na uri ng login:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "sendOnEnter": "Ipadala sa pagpindot ng enter", + "@sendOnEnter": {}, + "badServerVersionsException": "Ang homeserver ay sinusuportahan ang mga Spec bersyon:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "banFromChat": "Pagbawalan sa chat", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "banned": "Pinagbawalan", + "@banned": { + "type": "text", + "placeholders": {} + }, + "botMessages": "Mga mensahe ng bot", + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "cancel": "Kanselahin", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "bannedUser": "Pinagbawalan ni {username} si {targetName}", + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "cantOpenUri": "Hindi mabuksan ang URI na {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "changedTheJoinRules": "Pinalitan ni {username} ang mga tuntunin sa pagsali", + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheJoinRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pagsali sa: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "changedTheChatDescriptionTo": "Pinalitan ni {username} ang deskripsyon ng chat sa: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar", + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheChatNameTo": "Pinalitan ni {username} ang pangalan ng chat sa: '{chatname}'", + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon", + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changeTheHomeserver": "Palitan ang homeserver", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "changeTheme": "Palitan ang iyong istilio", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "changedTheChatPermissions": "Pinalitan ni {username} ang mga pahintulot ng chat", + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changeTheNameOfTheGroup": "Palitan ng pangalan ng grupo", + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "changedTheDisplaynameTo": "Pinalitan ni {username} ang kanilang displayname sa: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "yourChatBackupHasBeenSetUp": "Na-set up na ang iyong chat backup.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackupDescription": "Naka-secure ang iyong mga lumang mensahe gamit ng recovery key. Siguraduhing hindi mo ito mawalan.", + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "commandHint_markasdm": "Markahan bilang direktang mensahe na room para sa ibinigay na Matrix ID", + "@commandHint_markasdm": {}, + "changedTheGuestAccessRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita sa: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "commandHint_clearcache": "I-clear ang cache", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Iwaksi ang sesyon", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_create": "Gumawa ng walang lamang group chat\nGumamit ng --no-encryption para i-disable ang encryption", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "configureChat": "I-configure ang chat", + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "confirm": "Kumpirmahin", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "compareNumbersMatch": "Paki-kumpara ang mga numero", + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "copiedToClipboard": "Kinopya sa clipboard", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "copy": "Kopyahin", + "@copy": { + "type": "text", + "placeholders": {} + }, + "copyToClipboard": "Kopyahin sa clipboard", + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "countParticipants": "{count} mga kasali", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "createdTheChat": "💬 Ginawa ni {username} ang chat", + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "createGroup": "Gumawa ng grupo", + "@createGroup": {}, + "createNewSpace": "Bagong space", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "currentlyActive": "Kasalukuyang aktibo", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "darkTheme": "Madilim", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Pinalitan na ang display name", + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "directChats": "Mga Direktang Chat", + "@directChats": { + "type": "text", + "placeholders": {} + }, + "allRooms": "Lahat ng Mga Group Chat", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "downloadFile": "I-download ang file", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "editBlockedServers": "I-edit ang mga naka-block na server", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "chatPermissions": "Mga pahintulot ng chat", + "@chatPermissions": {}, + "editDisplayname": "I-edit ang display name", + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "editRoomAliases": "I-edit ang mga alyas ng room", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "edit": "I-edit", + "@edit": { + "type": "text", + "placeholders": {} + }, + "editRoomAvatar": "I-edit ang avatar ng room", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "emoteExists": "Umiiral na ang emote!", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "emptyChat": "Walang lamang chat", + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "enableEncryption": "I-enable ang encryption", + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "encryption": "Pag-encrypt", + "@encryption": { + "type": "text", + "placeholders": {} + }, + "encrypted": "Naka-encrypt", + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "encryptionNotEnabled": "Hindi naka-enable ang encryption", + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "everythingReady": "Handa na ang lahat!", + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "appLockDescription": "I-lock ang app kapag hindi ginagamit sa pamamagitan ng pin code", + "@appLockDescription": {}, + "commandHint_dm": "Magsimula ng direktong chat\nGumamit ng --no-encryptiom para i-disable ang encryption", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Magpadala ng HTML-formatted na text", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Imbitahan ang ibinigay na user sa room na ito", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Sumali sa ibinigay na room", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Tanggalin ang ibinigay na user sa room na ito", + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Umalis sa room na ito", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Ilarawan ang iyong sarili", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ilapat ang iyong larawan para sa room na ito (bilang mxc-uri)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Ilapat ang iyong display name para sa room na ito", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Ilapat ang level ng lakas sa ibinigay na user (default: 50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Magpadala ng reply bilang reaksyon", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Magpadala ng text", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "I-unban ang ibinigay na user sa room na ito", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Hindi wastong command", + "@commandInvalid": { + "type": "text" + }, + "compareEmojiMatch": "Paki-kumpara ang mga emoji", + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "connect": "Kumonekta", + "@connect": { + "type": "text", + "placeholders": {} + }, + "containsDisplayName": "Naglalaman ng display name", + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "create": "Gumawa", + "@create": { + "type": "text", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "dateWithoutYear": "{month}/{day}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "dateWithYear": "{month}/{day}/{year}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "deactivateAccountWarning": "Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?", + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "delete": "Burahin", + "@delete": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "Burahin ang mensahe", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "device": "Device", + "@device": { + "type": "text", + "placeholders": {} + }, + "deviceId": "ID ng Device", + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "devices": "Mga Device", + "@devices": { + "type": "text", + "placeholders": {} + }, + "emoteInvalid": "Hindi wastong shortcode ng emote!", + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Ang mga kamakailang ginamit na emote ay lalabas dito...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "calls": "Mga Tawag", + "@calls": {}, + "customEmojisAndStickers": "Mga custom emoji at sticker", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Magdagdag o magbahagi ng mga custom emoji o sticker na maaring gamitin sa anumang chat.", + "@customEmojisAndStickersBody": {}, + "emoteShortcode": "Shortcode ng emoji", + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Kailangan mong pumili ng emote shortcode at isang larawan!", + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "enableEmotesGlobally": "I-enable ang emote pack globally", + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "endedTheCall": "Tinapos ni {senderName} ang tawag", + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "enterAnEmailAddress": "Maglagay ng email address", + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "homeserver": "Homeserver", + "@homeserver": {}, + "enterYourHomeserver": "Ilagay ang iyong homeserver", + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "extremeOffensive": "Lubhang nakakasakit", + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "commandHint_plain": "Magpadala ng hindi na-format na text", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "commandMissing": "Hindi isang command ang {command}.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "Inimbita ang contact sa group", + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "containsUserName": "Naglalaman ng username", + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "contentHasBeenReported": "Inulat ang nilalaman sa mga pangangasiwa ng server", + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "couldNotDecryptMessage": "Hindi ma-decrypt ang mensahe: {error}", + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "defaultPermissionLevel": "Default na antas ng pahintulot", + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "deleteAccount": "Burahin ang account", + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "emotePacks": "Mga emote pack para sa room", + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "emoteSettings": "Mga Setting ng Emote", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "globalChatId": "Global chat ID", + "@globalChatId": {}, + "accessAndVisibility": "Pag-access at visibility", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Sino ang pinapayagang sumali sa chat at paano matutuklas ang chat.", + "@accessAndVisibilityDescription": {}, + "enableEncryptionWarning": "Hindi mo madi-disable ang encryption. Sigurado ka ba?", + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "errorObtainingLocation": "Hindi makuha ang lokasyon: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "fileName": "Pangalan ng file", + "@fileName": { + "type": "text", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "fontSize": "Laki ng font", + "@fontSize": { + "type": "text", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_fr.arb b/assets/l10n/intl_fr.arb index f9b8fbb749..7c8c317e2e 100644 --- a/assets/l10n/intl_fr.arb +++ b/assets/l10n/intl_fr.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} a accepté l'invitation", + "acceptedTheInvitation": "👍 {username} a accepté l'invitation", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informations sur le compte", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} a activé le chiffrement de bout en bout", + "activatedEndToEndEncryption": "🔐 {username} a activé le chiffrement de bout en bout", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Ajouter une description au groupe", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Ajouter un·e nouvel·le ami·e", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Ajouter à l'espace", "@addToSpace": {}, "admin": "Administrateur", @@ -72,11 +57,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Vous avez déjà un compte ?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} a répondu à l'appel", "@answeredTheCall": { "type": "text", @@ -99,11 +79,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Salon archivé", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Les invités peuvent-i·e·ls rejoindre", "@areGuestsAllowedToJoin": { "type": "text", @@ -119,21 +94,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Veuillez saisir la phrase de passe de votre trousseau sécurisé ou votre clé de récupération pour mettre vos clés en cache.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Pour pouvoir faire signer l'autre personne, veuillez entrer la phrase de passe de votre trousseau sécurisé ou votre clé de récupération.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Veuillez saisir la phrase de passe de votre trousseau sécurisé ou votre clé de récupération pour vérifier votre session.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Accepter cette demande de vérification de la part de {username} ?", "@askVerificationRequest": { "type": "text", @@ -141,31 +106,11 @@ "username": {} } }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Lire", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authentification", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Lire automatiquement les autocollants et les émojis animés", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "L'image de profil a été changée", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Le serveur d'accueil prend en charge les types de connexion :\n{serverVersions}\nMais cette application ne prend en charge que :\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -215,11 +160,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Clés mises en cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Annuler", "@cancel": { "type": "text", @@ -341,21 +281,11 @@ "username": {} } }, - "changelog": "Journal des modifications", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Changer de mot de passe", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Les changements ont été sauvegardés", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Changer le serveur d'accueil", "@changeTheHomeserver": { "type": "text", @@ -371,16 +301,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Changer de serveur", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Changer l'image de fond", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Changer votre avatar", "@changeYourAvatar": { "type": "text", @@ -401,7 +321,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "La sauvegarde de votre discussion est sécurisée par une clé de sécurité. Veillez à ne pas la perdre.", + "chatBackupDescription": "Vos anciens messages sont sécurisés par une clé de récupération. Veillez à ne pas la perdre.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -413,11 +333,6 @@ }, "chatHasBeenAddedToThisSpace": "La discussion a été ajoutée à cet espace", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "La discussion a été retirée de cet espace", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "Discussions", "@chats": { "type": "text", @@ -428,18 +343,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Choisissez un nom d'utilisateur·ice", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Effacer les archives", "@clearArchive": {}, - "clearText": "Effacer le texte", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Fermer", "@close": { "type": "text", @@ -527,12 +432,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Comparez les emojis suivants avec ceux de l'autre appareil et assurez-vous qu'ils correspondent :", + "compareEmojiMatch": "Veuillez comparer les émojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Comparez les chiffres suivants avec ceux de l'autre appareil et assurez-vous qu'ils correspondent :", + "compareNumbersMatch": "Veuillez comparer les chiffres", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -552,11 +457,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Tentative de connexion echouée", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Le contact a été invité au groupe", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -577,11 +477,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Visionneuse de contenu", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copié dans le presse-papier", "@copiedToClipboard": { "type": "text", @@ -604,16 +499,6 @@ "error": {} } }, - "couldNotSetAvatar": "Impossible de changer d'image de profil", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Impossible de changer de nom d'affichage", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participant(s)", "@countParticipants": { "type": "text", @@ -626,38 +511,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Créer un compte", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} a créé la discussion", + "createdTheChat": "💬 {username} a créé la discussion", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Créer un nouveau groupe", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Nouvel espace", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "La signature croisée est désactivée", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "La signature croisée est activée", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Actif en ce moment", "@currentlyActive": { "type": "text", @@ -718,11 +583,6 @@ "type": "text", "placeholders": {} }, - "deny": "Refuser", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Appareil", "@device": { "type": "text", @@ -738,46 +598,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Le chiffrement n'est sécurisé que lorsque tous les appareils ont été vérifiés.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Discussions directes", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Abandonner l'image", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Découvrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Découvrez des groupes", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Renommage effectué", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Faire un don", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Annuler et ne plus me redemander", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Télécharger le fichier", "@downloadFile": { "type": "text", @@ -793,21 +623,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Modifier les permissions de la discussion", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Changer de nom d'affichage", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Changer d'instance Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Modifier les adresses du salon", "@editRoomAliases": { "type": "text", @@ -853,11 +673,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Activez la sauvegarde des discussions pour ne jamais perdre l'accès à celles-ci.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Activer globalement le pack d'émoticônes", "@enableEmotesGlobally": { "type": "text", @@ -883,21 +698,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algorithme de chiffrement", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Le chiffrement n'est pas activé", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Paramètres du chiffrement de bout en bout", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} a mis fin à l'appel", "@endedTheCall": { "type": "text", @@ -905,23 +710,11 @@ "senderName": {} } }, - "enterAGroupName": "Entrez un nom de groupe", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Saisissez une adresse de courriel", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Entrer un nom d'espace", - "@enterASpacepName": {}, - "enterAUsername": "Entrez un nom d'utilisateur·ice", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Renseignez votre serveur d'accueil", "@enterYourHomeserver": { "type": "text", @@ -949,11 +742,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Taille du fichier", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -969,16 +757,6 @@ "type": "text", "placeholders": {} }, - "friday": "Vendredi", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Ami·e·s", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "À partir de l'entrée dans le salon", "@fromJoining": { "type": "text", @@ -999,16 +777,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Description du groupe", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "La description du groupe a été modifiée", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Le groupe est public", "@groupIsPublic": { "type": "text", @@ -1059,11 +827,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Le serveur d'accueil n'est pas compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "À quel point ce contenu est-il offensant ?", "@howOffensiveIsThisContent": { "type": "text", @@ -1089,16 +852,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Vous pouvez ignorer les utilisateur·ices qui vous dérangent en les mettant dans votre liste à ignorer personnelle. Vous ne recevrez plus de messages ou d'invitations à participer à un salon de discussion de la part des utilisateur·ices figurant sur cette liste.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorer l'utilisateur·ice", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "J'ai cliqué sur le lien", "@iHaveClickedOnLink": { "type": "text", @@ -1114,11 +867,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Courriel invalide", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Inviter un contact", "@inviteContact": { "type": "text", @@ -1136,7 +884,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} a invité {targetName}", + "invitedUser": "📩 {username} a invité {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1154,7 +902,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} vous a invité·e sur FluffyChat. \n1. Installez FluffyChat : https://fluffychat.im \n2. Inscrivez-vous ou connectez-vous \n3. Ouvrez le lien d'invitation : {link}", + "inviteText": "{username} vous a invité·e sur FluffyChat.\n1. Visiter fluffychat.im et installer l'application\n2. Inscrivez-vous ou connectez-vous\n3. Ouvrez le lien d'invitation :\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -1162,17 +910,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "La clé de l'appareil ci-dessous est-elle correcte ?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "est en train d'écrire…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} a rejoint la discussion", + "joinedTheChat": "👋 {username} a rejoint la discussion", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1184,17 +927,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Les clés sont mises en cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Les clés sont manquantes", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} a expulsé {targetName}", + "kicked": "👞 {username} a expulsé {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1202,7 +935,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} a expulsé et banni {targetName}", + "kickedAndBanned": "🙅 {username} a expulsé et banni {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1222,16 +955,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Dernière adresse IP utilisée", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vu pour la dernière fois il y a longtemps", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Partir", "@leave": { "type": "text", @@ -1291,33 +1014,11 @@ "homeserver": {} } }, - "loginWith": "Se connecter avec {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Se déconnecter", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Promouvoir comme modérateur·rice", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Promouvoir comme administrateur·ice", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Vérifiez que l'identifiant est valide", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Changements de membres", "@memberChanges": { "type": "text", @@ -1333,28 +1034,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Le message sera supprimé pour tous les participants", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Modérateur·rice", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Lundi", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 évènement en plus} other{{count} évènements en plus}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Mettre la discussion en sourdine", "@muteChat": { "type": "text", @@ -1370,7 +1054,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nouveau message dans FluffyChat", + "newMessageInFluffyChat": "💬 Nouveau message dans FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1395,16 +1079,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat ne prend pas encore en charge l'activation de la signature croisée. Veuillez l'activer depuis Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Pas de description", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Aucune émoticône trouvée. 😕", "@noEmotesFound": { "type": "text", @@ -1415,7 +1089,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Il semble que vous n'ayez aucun service Google sur votre téléphone. C'est une bonne décision pour votre vie privée ! Pour recevoir des notifications dans FluffyChat, nous vous recommandons d'utiliser https://microg.org/ ou https://unifiedpush.org/.", + "noGoogleServicesWarning": "Firebase Cloud Messaging ne semble pas être disponible sur votre appareil. Pour continuer à recevoir des notifications poussées, nous vous recommandons d'installer ntfy. Avec ntfy ou un autre fournisseur Unified Push, vous pouvez recevoir des notifications poussées de manière sécurisée. Vous pouvez télécharger ntfy sur le PlayStore ou sur F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1428,11 +1102,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Veuillez plutôt activer la sauvegarde des clés en ligne à partir d'Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Aucun", "@none": { "type": "text", @@ -1448,21 +1117,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Aucun salon public n'a été trouvé…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Aucun salon trouvé…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Aucun statut n'a été trouvé jusqu'à présent.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notifications", "@notifications": { "type": "text", @@ -1473,18 +1132,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Non supporté par l'application web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} sélectionné(s)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} utilisateur·ices écrivent…", "@numUsersTyping": { "type": "text", @@ -1517,11 +1164,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "La sauvegarde des clés en ligne est désactivée", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "La sauvegarde en ligne des clés est activée", "@onlineKeyBackupEnabled": { "type": "text", @@ -1552,16 +1194,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Facultatif) Votre adresse électronique", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optionnel) Nom du groupe", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Ou", "@or": { "type": "text", @@ -1572,11 +1204,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Appareils participants", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "Phrase de passe ou clé de récupération", "@passphraseOrKey": { "type": "text", @@ -1634,11 +1261,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Choisissez un nom d'utilisateur·ice", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Veuillez cliquer sur le lien contenu dans le courriel puis continuez.", "@pleaseClickOnLink": { "type": "text", @@ -1649,16 +1271,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Renseignez un identifiant Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Veuillez saisir votre clé de sécurité :", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Renseignez votre mot de passe", "@pleaseEnterYourPassword": { "type": "text", @@ -1684,26 +1296,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Groupes publics", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Clé publique", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Salons publics", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Espace public", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Règles de notifications", "@pushRules": { "type": "text", @@ -1780,11 +1377,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Supprimer le message", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Supprimer votre avatar", "@removeYourAvatar": { "type": "text", @@ -1815,16 +1407,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Demander à lire les anciens messages", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Révoquer toutes les permissions", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Le salon a été mis à niveau", "@roomHasBeenUpgraded": { "type": "text", @@ -1835,53 +1417,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Samedi", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Enregistrement du fichier sous {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Enregistrer le fichier", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Enregistrer le fichier dans ce dossier", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Rechercher", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Rechercher une discussion", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Sécurité", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Clé de sécurité", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Clé de sécurité perdue ?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Vu par {username}", "@seenByUser": { "type": "text", @@ -1889,22 +1439,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Vu par {username} et {count} autres}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Vu par {username} et {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Envoyer", "@send": { "type": "text", @@ -1924,11 +1458,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Autoriser l'envoi de rapports d'anomalies via sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Envoyer un fichier", "@sendFile": { "type": "text", @@ -1959,35 +1488,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} a envoyé un fichier", + "sentAFile": "📁 {username} a envoyé un fichier", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} a envoyé un fichier audio", + "sentAnAudio": "🎤 {username} a envoyé un fichier audio", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} a envoyé une image", + "sentAPicture": "🖼️ {username} a envoyé une image", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} a envoyé un autocollant", + "sentASticker": "😊 {username} a envoyé un autocollant", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} a envoyé une vidéo", + "sentAVideo": "🎥 {username} a envoyé une vidéo", "@sentAVideo": { "type": "text", "placeholders": { @@ -2001,21 +1530,6 @@ "senderName": {} } }, - "sentryInfo": "Informations relatives à votre vie privée : https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "La session est vérifiée", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Définir une image de profil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Définir comme adresse principale", "@setAsCanonicalAlias": { "type": "text", @@ -2026,11 +1540,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Définir une description du groupe", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Créer un lien d'invitation", "@setInvitationLink": { "type": "text", @@ -2073,11 +1582,6 @@ "type": "text", "placeholders": {} }, - "signUp": "S'inscrire", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Authentification unique", "@singlesignon": { "type": "text", @@ -2088,11 +1592,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Son, vibration, couleur diode", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Code source", "@sourceCode": { "type": "text", @@ -2115,11 +1614,6 @@ "senderName": {} } }, - "startYourFirstChat": "Commencez votre première discussion maintenant ! 🙂\n- Appuyez sur « Nouvelle discussion »\n- Scannez le code QR d’un·e ami·e\n- Bonne discussion", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Statut", "@status": { "type": "text", @@ -2135,11 +1629,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Dimanche", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Synchronisation... Veuillez patienter.", "@synchronizingPleaseWait": { "type": "text", @@ -2150,21 +1639,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Appuyez sur un appareil pour le vérifier", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Appuyez pour afficher l'image", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Appuyez pour afficher le menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Elles ne correspondent pas", "@theyDontMatch": { "type": "text", @@ -2175,26 +1649,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Ce salon a été archivé.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Jeudi", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2231,11 +1685,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Mardi", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Indisponible", "@unavailable": { "type": "text", @@ -2271,16 +1720,6 @@ "type": {} } }, - "unknownSessionVerify": "Session inconnue, veuillez vérifier", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Déverrouiller la sauvegarde de la discussion", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Retirer la sourdine de la discussion", "@unmuteChat": { "type": "text", @@ -2298,18 +1737,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 message non lu} other{{unreadEvents} messages non lus}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Utiliser des couleurs compatibles AMOLED ?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} et {count} autres sont en train d'écrire…", "@userAndOthersAreTyping": { "type": "text", @@ -2333,7 +1760,7 @@ "username": {} } }, - "userLeftTheChat": "{username} a quitté la discussion", + "userLeftTheChat": "🚪 {username} a quitté la discussion", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2345,11 +1772,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "L'utilisateur/trice n'est pas vérifié(e)", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} a envoyé un évènement de type {type}", "@userSentUnknownEvent": { "type": "text", @@ -2358,36 +1780,16 @@ "type": {} } }, - "userUnknownVerification": "L'utilisateur/trice a un statut de vérification inconnu", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "L'utilisateur/trice est vérifié(e)", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Vérifié", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Session vérifiée avec succès !", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Vérifier", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Vérifier manuellement", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Commencer la vérification", "@verifyStart": { "type": "text", @@ -2403,11 +1805,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Vérifier l'utilisateur·ice", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Appel vidéo", "@videoCall": { "type": "text", @@ -2448,7 +1845,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Image de fond", + "wallpaper": "Image de fond :", "@wallpaper": { "type": "text", "placeholders": {} @@ -2458,21 +1855,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Le chiffrement de bout en bout est actuellement en bêta ! Utilisez cette fonctionnalité à vos propres risques !", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Mercredi", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bienvenue dans la messagerie instantanée la plus mignonne du réseau Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Nous vous avons envoyé un courriel", "@weSentYouAnEmail": { "type": "text", @@ -2493,7 +1875,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Effacer la sauvegarde de votre discussion pour créer une nouvelle clé de sécurité ?", + "wipeChatBackup": "Effacer la sauvegarde de votre discussion pour créer une nouvelle clé de récupération ?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2518,76 +1900,29 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Vous êtes invité·e à cette discussion", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Vous ne participez plus à cette discussion", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Vous ne pouvez pas vous inviter vous-même", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Vous avez été banni·e de cette discussion", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "La synchronisation de vos discussions est en cours…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Votre propre nom d'utilisateur·ice", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Votre clé publique", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Vous serez connecté·e à {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Zoomer", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Dézoomer", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "scanQrCode": "Scanner un code QR", "@scanQrCode": {}, - "typeInInviteLinkManually": "Entrer le lien d'invitation manuellement...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Partager votre lien d'invitation", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Scannez le code QR ou partagez votre lien d'invitation si vous n'êtes pas au même endroit.", - "@createNewChatExplaination": {}, "sendOnEnter": "Envoyer avec Entrée", "@sendOnEnter": {}, "homeserver": "Serveur d'accueil", "@homeserver": {}, "serverRequiresEmail": "Ce serveur doit valider votre adresse électronique pour l'inscription.", "@serverRequiresEmail": {}, - "newUsernameDescription": "Votre identifiant utilisateur aura alors le format @username:servername", - "@newUsernameDescription": {}, - "newPasswordDescription": "Afin de pouvoir récupérer votre mot de passe, vous devez ajouter ultérieurement une adresse électronique à votre compte.", - "@newPasswordDescription": {}, "enableMultiAccounts": "(BETA) Activer les comptes multiples sur cet appareil", "@enableMultiAccounts": {}, "bundleName": "Nom du groupe", @@ -2604,31 +1939,12 @@ "@oneClientLoggedOut": {}, "link": "Lien", "@link": {}, - "setupChatBackup": "Configurer la sauvegarde de la discussion", - "@setupChatBackup": {}, - "iWroteDownTheKey": "J'ai écrit la clé", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Votre sauvegarde de la discussion a été mise en place.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Pour protéger vos messages, nous avons généré une clé de sécurité pour vous.\nVeuillez la garder dans un endroit sûr, par exemple un gestionnaire de mots de passe.", - "@setupChatBackupDescription": {}, - "yourUserId": "Votre identifiant utilisateur :", - "@yourUserId": {}, "unverified": "Non vérifié", "@unverified": {}, - "passwordsDoNotMatch": "Les mots de passe ne correspondent pas !", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Veuillez saisir une adresse électronique valide.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Répétez le mot de passe", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Veuillez choisir au moins {min} caractères.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageType": "Type de message", "@messageType": {}, "openGallery": "Ouvrir dans la Galerie", @@ -2643,18 +1959,8 @@ "@removeFromSpace": {}, "addToSpaceDescription": "Sélectionnez un espace pour y ajouter cette discussion.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Se connecter en un clic", - "@loginWithOneClick": {}, - "removeFromSpaceDescription": "Cela supprime cette discussion de l’espace actuel. Elle sera alors toujours visible sous « Toutes les discussions ».", - "@removeFromSpaceDescription": {}, "start": "Commencer", "@start": {}, - "setupChatBackupNow": "Configurez votre sauvegarde de discussion maintenant", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Enregistrer la clé de sécurité maintenant", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Pour déverrouiller votre sauvegarde de discussion, veuillez entrer votre clé de sécurité qui a été générée lors d'une session précédente. Votre clé de sécurité n'est PAS votre mot de passe.", - "@pleaseEnterSecurityKeyDescription": {}, "commandHint_create": "Créer un groupe de discussion vide\nUtilisez --no-encryption pour désactiver le chiffrement", "@commandHint_create": { "type": "text", @@ -2680,28 +1986,8 @@ "type": "text", "placeholders": {} }, - "addToStory": "Ajouter à la story", - "@addToStory": {}, - "whoCanSeeMyStories": "Qui peut voir mes stories ?", - "@whoCanSeeMyStories": {}, "publish": "Publier", "@publish": {}, - "unsubscribeStories": "Se désinscrire des stories", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Cet(te) utilisateur(trice) n'a encore rien posté dans sa story", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Votre story", - "@yourStory": {}, - "replyHasBeenSent": "La réponse a été envoyée", - "@replyHasBeenSent": {}, - "storyFrom": "Story du {date} : \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, "videoWithSize": "Vidéo ({size})", "@videoWithSize": { "type": "text", @@ -2709,21 +1995,6 @@ "size": {} } }, - "whoCanSeeMyStoriesDesc": "Veuillez noter que les personnes peuvent se voir et se contacter dans votre story.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Que se passe-t-il ?", - "@whatIsGoingOn": {}, - "addDescription": "Ajouter une description", - "@addDescription": {}, - "bubbleSize": "Taille de la bulle", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Je comprends", - "@iUnderstand": {}, - "storyPrivacyWarning": "Veuillez noter que les personnes peuvent se voir et se contacter dans votre story. Vos stories seront visibles pendant 24 heures, mais il n'y a aucune garantie qu'elles seront supprimées de tous les appareils et de tous les serveurs.", - "@storyPrivacyWarning": {}, "dismiss": "Rejeter", "@dismiss": {}, "markAsRead": "Marquer comme lu", @@ -2732,12 +2003,6 @@ "@reportUser": {}, "openChat": "Ouvrir la discussion", "@openChat": {}, - "matrixWidgets": "Widgets Matrix", - "@matrixWidgets": {}, - "integrationsNotImplemented": "La modification des widgets et des intégrations n'est pas encore possible.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Modifier les widgets et les intégrations", - "@editIntegrations": {}, "reactedWith": "{sender} a réagi avec {reaction}", "@reactedWith": { "type": "text", @@ -2758,8 +2023,6 @@ "@unsupportedAndroidVersionLong": {}, "pinMessage": "Épingler au salon", "@pinMessage": {}, - "pinnedEventsError": "Erreur lors du chargement des messages épinglés", - "@pinnedEventsError": {}, "confirmEventUnpin": "Voulez-vous vraiment désépingler définitivement l'événement ?", "@confirmEventUnpin": {}, "videoCallsBetaWarning": "Veuillez noter que les appels vidéo sont actuellement en version bêta. Ils peuvent ne pas fonctionner comme prévu ou ne oas fonctionner du tout sur toutes les plateformes.", @@ -2789,8 +2052,6 @@ "@widgetNameError": {}, "errorAddingWidget": "Erreur lors de l'ajout du widget.", "@errorAddingWidget": {}, - "editWidgets": "Modifier les widgets", - "@editWidgets": {}, "widgetEtherpad": "Note textuelle", "@widgetEtherpad": {}, "addWidget": "Ajouter un widget", @@ -2809,12 +2070,7 @@ "user": {} } }, - "showDirectChatsInSpaces": "Afficher les discussions directes associées dans les espaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youAcceptedTheInvitation": "Vous avez accepté l'invitation", + "youAcceptedTheInvitation": "👍 Vous avez accepté l'invitation", "@youAcceptedTheInvitation": {}, "youBannedUser": "Vous avez banni {user}", "@youBannedUser": { @@ -2822,25 +2078,25 @@ "user": {} } }, - "youInvitedBy": "Vous avez été invité par {user}", + "youInvitedBy": "📩 Vous avez été invité par {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "Vous avez invité {user}", + "youInvitedUser": "📩 Vous avez invité {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "Vous avez dégagé {user}", + "youKicked": "👞 Vous avez dégagé {user}", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Vous avez dégagé et banni {user}", + "youKickedAndBanned": "🙅 Vous avez dégagé et banni {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2852,9 +2108,634 @@ "user": {} } }, - "separateChatTypes": "Séparer les discussions directes, les groupes et les espaces", + "separateChatTypes": "Séparer les discussions directes et les groupes", "@separateChatTypes": { "type": "text", "placeholders": {} + }, + "users": "Utilisateurs/trices", + "@users": {}, + "storeInAndroidKeystore": "Stocker dans Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Stocker dans Apple KeyChain", + "@storeInAppleKeyChain": {}, + "user": "Utilisateur/trice", + "@user": {}, + "custom": "Personnalisé", + "@custom": {}, + "hydrate": "Restaurer à partir du fichier de sauvegarde", + "@hydrate": {}, + "dehydrateWarning": "Cette action ne peut pas être annulée. Assurez-vous d'enregistrer convenablement le fichier de sauvegarde.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "Pour les utilisateurs/trices de TOR, il est recommandé d'exporter la session avant de fermer la fenêtre.", + "@dehydrateTorLong": {}, + "recoveryKey": "Clé de récupération", + "@recoveryKey": {}, + "recoveryKeyLost": "Clé de récupération perdue ?", + "@recoveryKeyLost": {}, + "indexedDbErrorLong": "Le stockage des messages n'est malheureusement pas activé par défaut en mode privé.\nVeuillez consulter :\n - about:config\n - Définir dom.indexedDB.privateBrowsing.enabled à « vrai ».\nSinon, il n'est pas possible d'exécuter FluffyChat.", + "@indexedDbErrorLong": {}, + "saveKeyManuallyDescription": "Enregistrer cette clé manuellement en déclenchant la boîte de dialogue de partage du système ou le presse-papiers.", + "@saveKeyManuallyDescription": {}, + "storeInSecureStorageDescription": "Stocker la clé de récupération dans un espace sécurisé de cet appareil.", + "@storeInSecureStorageDescription": {}, + "indexedDbErrorTitle": "Problèmes relatifs au mode privé", + "@indexedDbErrorTitle": {}, + "dehydrate": "Exporter la session et effacer l'appareil", + "@dehydrate": {}, + "dehydrateTor": "Utilisateurs/trices de TOR : Exporter la session", + "@dehydrateTor": {}, + "hydrateTor": "Utilisateurs/trices de TOR : Importer une session exportée", + "@hydrateTor": {}, + "hydrateTorLong": "Vous avez exporté votre session la dernière fois sur TOR ? Importez-la rapidement et continuez à discuter.", + "@hydrateTorLong": {}, + "pleaseEnterRecoveryKey": "Veuillez saisir votre clé de récupération :", + "@pleaseEnterRecoveryKey": {}, + "pleaseEnterRecoveryKeyDescription": "Pour déverrouiller vos anciens messages, veuillez entrer votre clé de récupération qui a été générée lors d'une session précédente. Votre clé de récupération n'est PAS votre mot de passe.", + "@pleaseEnterRecoveryKeyDescription": {}, + "unlockOldMessages": "Déverrouiller les anciens messages", + "@unlockOldMessages": {}, + "storeSecurlyOnThisDevice": "Stocker de manière sécurisé sur cet appareil", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} fichiers", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noKeyForThisMessage": "Cela peut se produire si le message a été envoyé avant que vous ne vous soyez connecté à votre compte sur cet appareil.\n\nIl est également possible que l'expéditeur ait bloqué votre appareil ou qu'un problème de connexion Internet se soit produit.\n\nÊtes-vous capable de lire le message sur une autre session ? Vous pouvez alors transférer le message à partir de celle-ci ! Allez dans Paramètres > Appareils et assurez-vous que vos appareils se sont vérifiés mutuellement. Lorsque vous ouvrirez le salon la fois suivante et que les deux sessions seront au premier plan, les clés seront transmises automatiquement.\n\nVous ne voulez pas perdre les clés en vous déconnectant ou en changeant d'appareil ? Assurez-vous que vous avez activé la sauvegarde de la discussion dans les paramètres.", + "@noKeyForThisMessage": {}, + "enterRoom": "Entrer dans le salon", + "@enterRoom": {}, + "allSpaces": "Tous les espaces", + "@allSpaces": {}, + "commandHint_markasdm": "Marquer comme salon de messages directs pour l'identifiant Matrix indiqué", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marquer comme groupe", + "@commandHint_markasgroup": {}, + "confirmMatrixId": "Veuillez confirmer votre identifiant Matrix afin de supprimer votre compte.", + "@confirmMatrixId": {}, + "supposedMxid": "Cela devrait être {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "whyIsThisMessageEncrypted": "Pourquoi ce message est-il illisible ?", + "@whyIsThisMessageEncrypted": {}, + "foregroundServiceRunning": "Cette notification s’affiche lorsque le service au premier plan est en cours d’exécution.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "Partage d'écran", + "@screenSharingTitle": {}, + "screenSharingDetail": "Vous partagez votre écran dans FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Permissions d'appel", + "@callingPermissions": {}, + "callingAccount": "Compte d'appel", + "@callingAccount": {}, + "callingAccountDetails": "Permet à FluffyChat d'utiliser l'application de numérotation native d'Android.", + "@callingAccountDetails": {}, + "appearOnTop": "Apparaître en haut", + "@appearOnTop": {}, + "appearOnTopDetails": "Permet à l'application d'apparaître en haut de l'écran (non nécessaire si vous avez déjà configuré Fluffychat comme compte d'appel)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microphone, caméra et autres autorisations de FluffyChat", + "@otherCallingPermissions": {}, + "newGroup": "Nouveau groupe", + "@newGroup": {}, + "newSpace": "Nouvel espace", + "@newSpace": {}, + "enterSpace": "Entrer dans l’espace", + "@enterSpace": {}, + "numChats": "{number} discussions", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Masquer les événements d'état sans importance", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Ne plus afficher", + "@doNotShowAgain": {}, + "commandHint_googly": "Envoyer des yeux écarquillés", + "@commandHint_googly": {}, + "commandHint_cuddle": "Envoyer un câlin", + "@commandHint_cuddle": {}, + "commandHint_hug": "Envoyer une accolade", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} vous envoie des yeux écarquillés", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} vous fait un câlin", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} vous fait une accolade", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "wasDirectChatDisplayName": "Discussion vide (était {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "encryptThisChat": "Chiffrer cette discussion", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "Désolé, ce n'est pas possible", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Clés de l’appareil :", + "@deviceKeys": {}, + "startFirstChat": "Commencez votre première discussion", + "@startFirstChat": {}, + "newSpaceDescription": "Les espaces vous permettent de consolider vos conversations et de construire des communautés privées ou publiques.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "Pour des raisons de sécurité, vous ne pouvez pas désactiver le chiffrement dans une discussion s'il a été activé avant.", + "@disableEncryptionWarning": {}, + "reopenChat": "Rouvrir la discussion", + "@reopenChat": {}, + "noOtherDevicesFound": "Aucun autre appareil trouvé", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Attention ! Sans l'activation de la sauvegarde de la discussion, vous perdrez l'accès à vos messages chiffrés. Il est fortement recommandé d'activer la sauvegarde de la discussion avant de se déconnecter.", + "@noBackupWarning": {}, + "fileHasBeenSavedAt": "Le fichier a été enregistré dans {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "fileIsTooBigForServer": "Le serveur signale que le fichier est trop volumineux pour être envoyé.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "Aller au dernier message lu", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Lisez jusqu’ici", + "@readUpToHere": {}, + "allRooms": "Tous les groupes de discussion", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "chatPermissions": "Permissions du salon", + "@chatPermissions": {}, + "importFromZipFile": "Importer depuis un fichier .zip", + "@importFromZipFile": {}, + "inviteContactToGroupQuestion": "Voulez-vous inviter {contact} au salon \"{groupName}\" ?", + "@inviteContactToGroupQuestion": {}, + "importEmojis": "Importer des Emojis", + "@importEmojis": {}, + "notAnImage": "Pas un fichier image.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "La description du salon a changé", + "@chatDescriptionHasBeenChanged": {}, + "createGroup": "Créer un groupe", + "@createGroup": {}, + "importNow": "Importer maintenant", + "@importNow": {}, + "tryAgain": "Nouvelle tentative", + "@tryAgain": {}, + "blockedUsers": "Utilisateurs/trices bloqués", + "@blockedUsers": {}, + "redactMessageDescription": "Le message sera modifié pour tous les participants de cette conversation. Il n'est pas possible de revenir en arrière.", + "@redactMessageDescription": {}, + "redactedBy": "Modifié par {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "Discussion directe", + "@directChat": {}, + "optionalRedactReason": "(Facultatif) Raison de la modification de ce message...", + "@optionalRedactReason": {}, + "subspace": "Sous-espace", + "@subspace": {}, + "sendTypingNotifications": "Envoyer des notifications de frappe", + "@sendTypingNotifications": {}, + "replace": "Remplacer", + "@replace": {}, + "emoteKeyboardNoRecents": "Les émoticônes récemment utilisées apparaîtront ici...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "nothingFound": "Rien n'a été trouvé...", + "@nothingFound": {}, + "chatDescription": "Description de la discussion", + "@chatDescription": {}, + "invalidServerName": "Nom de serveur invalide", + "@invalidServerName": {}, + "addChatDescription": "Ajouter une description à la discussion...", + "@addChatDescription": {}, + "shareInviteLink": "Partager un lien d'invitation", + "@shareInviteLink": {}, + "openLinkInBrowser": "Ouvrir le lien dans le navigateur", + "@openLinkInBrowser": {}, + "setTheme": "Définir le thème :", + "@setTheme": {}, + "setColorTheme": "Définir la couleur du thème :", + "@setColorTheme": {}, + "databaseMigrationBody": "Veuillez patienter. Cela peut prendre un moment.", + "@databaseMigrationBody": {}, + "searchForUsers": "Rechercher des @utilisateurs/trices...", + "@searchForUsers": {}, + "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Votre mot de passe saisi est erroné", + "@passwordIsWrong": {}, + "publicLink": "Lien public", + "@publicLink": {}, + "joinSpace": "Rejoindre l'espace", + "@joinSpace": {}, + "publicSpaces": "Espaces publics", + "@publicSpaces": {}, + "addChatOrSubSpace": "Ajouter une discussion ou un sous-espace", + "@addChatOrSubSpace": {}, + "thisDevice": "Cet appareil :", + "@thisDevice": {}, + "sendReadReceipts": "Envoyer des accusés de réception", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Les autres participants à une discussion peuvent voir que vous êtes en train de taper un nouveau message.", + "@sendTypingNotificationsDescription": {}, + "verifyOtherDevice": "🔐 Vérifier l'autre appareil", + "@verifyOtherDevice": {}, + "databaseBuildErrorBody": "La base de données SQlite ne peut pas être créée. L'application essaie d'utiliser la base de données existante pour le moment. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "startConversation": "Démarrer la conversation", + "@startConversation": {}, + "formattedMessagesDescription": "Affichez le contenu formaté des messages comme du texte en gras à l'aide de markdown.", + "@formattedMessagesDescription": {}, + "incomingMessages": "Messages entrants", + "@incomingMessages": {}, + "acceptedKeyVerification": "{sender} a accepté la vérification de clé", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "pleaseTryAgainLaterOrChooseDifferentServer": "Veuillez réessayer plus tard ou choisir un autre serveur.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "inviteGroupChat": "📨 Inviter à une discussion de groupe", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Inviter à une discussion privée", + "@invitePrivateChat": {}, + "jump": "Sauter", + "@jump": {}, + "signInWithPassword": "Se connecter avec mot de passe", + "@signInWithPassword": {}, + "hideMemberChangesInPublicChats": "Masquer les modifications de membres dans les discussions publiques", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Ne pas afficher dans la chronologie de la discussion si quelqu'un rejoint ou quitte une discussion publique afin d'améliorer la lisibilité.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Aperçu", + "@overview": {}, + "notifyMeFor": "Me notifier pour", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Paramètres de récupération de mot de passe", + "@passwordRecoverySettings": {}, + "hasKnocked": "🚪 {user} a frappé", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "canceledKeyVerification": "{sender} a annulé la vérification de clé", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "unreadChatsInApp": "{appname} : {unread} discussions non lus", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "requestedKeyVerification": "{sender} a demandé une vérification de clé", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} a lancé la vérification de clé", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "discover": "Découvrir", + "@discover": {}, + "usersMustKnock": "Les utilisateurs/trices doivent frapper", + "@usersMustKnock": {}, + "noOneCanJoin": "Personne ne peut rejoindre", + "@noOneCanJoin": {}, + "knock": "Frapper à la porte", + "@knock": {}, + "hidePresences": "Cacher la liste des statuts ?", + "@hidePresences": {}, + "appLockDescription": "Verrouiller l'application avec un code PIN lorsqu'elle n'est pas utilisée", + "@appLockDescription": {}, + "globalChatId": "Identifiant global de la discussion", + "@globalChatId": {}, + "accessAndVisibility": "Accès et visibilité", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Qui est autorisé à rejoindre cette discussion et comment la discussion peut être découverte.", + "@accessAndVisibilityDescription": {}, + "calls": "Appels", + "@calls": {}, + "customEmojisAndStickers": "Émoticônes et autocollants personnalisés", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "Cacher les messages édités", + "@hideRedactedMessages": {}, + "pleaseEnterYourCurrentPassword": "Veuillez saisir votre mot de passe actuel", + "@pleaseEnterYourCurrentPassword": {}, + "swipeRightToLeftToReply": "Glisser de droite à gauche pour répondre", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "hideRedactedMessagesBody": "Si quelqu'un modifie un message, celui-ci ne sera plus visible dans la discussion.", + "@hideRedactedMessagesBody": {}, + "customEmojisAndStickersBody": "Ajoutez ou partagez des émoticônes ou autocollants personnalisés qui peuvent être utilisés dans n'importe quelle discussion.", + "@customEmojisAndStickersBody": {}, + "blockListDescription": "Vous pouvez bloquer des utilisateurs/trices qui vous dérangent. Vous ne pourrez plus recevoir aucun message ou invitation à un salon d'utilisateurs/trices figurant sur votre liste de blocage personnelle.", + "@blockListDescription": {}, + "blockUsername": "Ignorer le nom d'utilisateur/trice", + "@blockUsername": {}, + "hideInvalidOrUnknownMessageFormats": "Masquer les formats de message invalides ou inconnus", + "@hideInvalidOrUnknownMessageFormats": {}, + "messagesStyle": "Messages :", + "@messagesStyle": {}, + "redactedByBecause": "Modifié par {username} car : \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "setChatDescription": "Définir la description de la discussion", + "@setChatDescription": {}, + "presenceStyle": "Statut :", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Afficher les messages de statut des autres utilisateurs/trices", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "youInvitedToBy": "📩 Vous avez été invité par lien à :\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "userWouldLikeToChangeTheChat": "{user} souhaite rejoindre la discussion.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Aucun lien public n'a encore été crée", + "@noPublicLinkHasBeenCreatedYet": {}, + "gallery": "Galerie", + "@gallery": {}, + "files": "Fichiers", + "@files": {}, + "sessionLostBody": "Votre session est perdue. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "searchIn": "Rechercher dans la discussion \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "forwardMessageTo": "Transférer le message à {roomName} ?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceiptsDescription": "Les autres participants à une discussion peuvent voir si vous avez lu un message.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Messages formatés", + "@formattedMessages": {}, + "verifyOtherUser": "🔐 Vérifier l'autre utilisateur/trice", + "@verifyOtherUser": {}, + "searchMore": "Rechercher davantage...", + "@searchMore": {}, + "verifyOtherUserDescription": "Si vous vérifiez un autre utilisateur/trice, vous pouvez être sûr de savoir à qui vous écrivez réellement. 💪\n\nLorsque vous lancez une vérification, vous et l'autre utilisateur/trice verrez une fenêtre contextuelle dans l'application. Vous y verrez alors une série d'émoticônes ou de chiffres que vous devrez comparer.\n\nLa meilleure façon de procéder est de se rencontrer ou de lancer un appel vidéo. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Lorsque vous vérifiez un autre appareil, ces appareils peuvent échanger des clés, ce qui augmente votre sécurité globale. 💪 Lorsque vous lancez une vérification, une fenêtre contextuelle s'affiche dans l'application sur les deux appareils. Vous y verrez alors une série d'émoticônes ou de chiffres que vous devrez comparer. Il est préférable d'avoir les deux appareils à portée de main avant de lancer la vérification. 🤳", + "@verifyOtherDeviceDescription": {}, + "completedKeyVerification": "{sender} a terminé la vérification de clé", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} est prêt pour la vérification de clé", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Transparent", + "@transparent": {}, + "stickers": "Autocollants", + "@stickers": {}, + "noDatabaseEncryption": "Le chiffrement de la base de données n'est pas supporté sur cette plateforme", + "@noDatabaseEncryption": {}, + "commandHint_ignore": "Ignorer l'identifiant Matrix indiqué", + "@commandHint_ignore": {}, + "commandHint_unignore": "Ne plus ignorer l'identifiant Matrix indiqué", + "@commandHint_unignore": {}, + "thereAreCountUsersBlocked": "Actuellement, il y a {count} utilisateurs/trices bloqués.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "restricted": "Limité", + "@restricted": {}, + "knockRestricted": "Frapper à la porte limité", + "@knockRestricted": {}, + "signInWith": "Se connecter avec {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "groupCanBeFoundViaSearch": "Le groupe peut être trouvé via la recherche", + "@groupCanBeFoundViaSearch": {}, + "groupName": "Nom du groupe", + "@groupName": {}, + "invalidInput": "Entrée invalide !", + "@invalidInput": {}, + "block": "Bloquer", + "@block": {}, + "removeDevicesDescription": "Vous serez déconnecté de cet appareil et ne pourrez plus recevoir de messages.", + "@removeDevicesDescription": {}, + "userRole": "Rôle de l'utilisateur/trice", + "@userRole": {}, + "createNewAddress": "Créer une nouvelle adresse", + "@createNewAddress": {}, + "publicChatAddresses": "Addresses de discussion publiques", + "@publicChatAddresses": {}, + "countChatsAndCountParticipants": "{chats} discussions et {participants} participants", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "space": "Espace", + "@space": {}, + "spaces": "Espaces", + "@spaces": {}, + "noMoreChatsFound": "Aucune autre discussion trouvée...", + "@noMoreChatsFound": {}, + "unread": "Non lu", + "@unread": {}, + "joinedChats": "Discussions rejointes", + "@joinedChats": {}, + "commandHint_sendraw": "Envoyer du JSON brut", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "La base de données est optimisée", + "@databaseMigrationTitle": {}, + "leaveEmptyToClearStatus": "Laisser vide pour effacer votre statut.", + "@leaveEmptyToClearStatus": {}, + "select": "Sélectionner", + "@select": {}, + "reportErrorDescription": "😭 Oh non. Quelque chose s'est mal passé. Si vous le souhaitez, vous pouvez signaler ce bogue aux développeurs.", + "@reportErrorDescription": {}, + "report": "signaler", + "@report": {}, + "wrongPinEntered": "Mauvais code PIN saisi ! Veuillez réessayer dans {seconds} secondes...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "pushNotificationsNotAvailable": "Notifications poussées indisponibles", + "@pushNotificationsNotAvailable": {}, + "yourGlobalUserIdIs": "Votre identifiant utilisateur global est : ", + "@yourGlobalUserIdIs": {}, + "chatCanBeDiscoveredViaSearchOnServer": "La discussion peut être découverte via la recherche sur {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "knocking": "Frapper", + "@knocking": {}, + "banUserDescription": "L'utilisateur/trice sera banni de la discussion et ne pourra plus y accéder jusqu'à ce qu'il/elle soit débanni.", + "@banUserDescription": {}, + "unbanUserDescription": "L'utilisateur/trice pourra entrer à nouveau dans la discussion si il/elle le souhaite.", + "@unbanUserDescription": {}, + "kickUserDescription": "L'utilisateur/trice est expulsé de la discussion mais n'est pas banni. Dans les discussions publiques, l'utilisateur/trice peut revenir à tout moment.", + "@kickUserDescription": {}, + "makeAdminDescription": "Une fois que vous aurez nommé cet utilisateur/trice administrateur, vous ne pourrez peut-être plus annuler cette opération, car il disposera alors des mêmes autorisations que vous.", + "@makeAdminDescription": {}, + "newPassword": "Nouveau mot de passe", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Veuillez choisir un mot de passe fort", + "@pleaseChooseAStrongPassword": {}, + "decline": "Refuser", + "@decline": {}, + "initAppError": "Une erreur est survenue pendant l'initialisation de l'application", + "@initAppError": {}, + "markAsUnread": "Marquer comme non lu", + "@markAsUnread": {}, + "wrongRecoveryKey": "Désolé... il ne semble pas s'agir de la bonne clé de récupération.", + "@wrongRecoveryKey": {}, + "searchChatsRooms": "Rechercher des #discussions, @utilisateurs/trices...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Créer un groupe et inviter des utilisateurs/trices", + "@createGroupAndInviteUsers": {}, + "goToSpace": "Aller dans l'espace : {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "exportEmotePack": "Exporter le pack d'émoticônes au format .zip", + "@exportEmotePack": {}, + "noChatDescriptionYet": "Aucune description de discussion n'a encore été créée.", + "@noChatDescriptionYet": {}, + "invite": "Inviter", + "@invite": {}, + "pleaseEnterANumber": "Veuillez saisir un nombre supérieur à 0", + "@pleaseEnterANumber": {}, + "roomUpgradeDescription": "La discussion sera alors recréé avec la nouvelle version de salon. Tous les participants seront informés qu'ils doivent passer à la nouvelle discussion. Pour en savoir plus sur les versions des salons, consultez le site https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "learnMore": "En savoir plus", + "@learnMore": {}, + "minimumPowerLevel": "{level} est le niveau minimum de droits.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "restoreSessionBody": "L'application tente maintenant de restaurer votre session depuis la sauvegarde. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "profileNotFound": "Cet utilisateur/trice n'a pu être trouvé sur le serveur. Peut-être est-ce un problème de connexion ou l'utilisateur/trice n'existe pas.", + "@profileNotFound": {}, + "archiveRoomDescription": "La discussion sera déplacée dans les archives. Les autres utilisateurs/trices pourront voir que vous avez quitté la discussion.", + "@archiveRoomDescription": {}, + "noUsersFoundWithQuery": "Malheureusement, aucun utilisateur/trice n'a pu être trouvé avec \"{query}\". Veuillez vérifier si vous n'avez pas fait de faute de frappe.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } } } diff --git a/assets/l10n/intl_ga.arb b/assets/l10n/intl_ga.arb index e6871e8d58..e0ab9a9ab7 100644 --- a/assets/l10n/intl_ga.arb +++ b/assets/l10n/intl_ga.arb @@ -1,21 +1,4 @@ { - "zoomOut": "Zúmáil amach", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Zúmáil isteach", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Beidh tú ceangailte le {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "you": "Tú", "@you": { "type": "text", @@ -26,17 +9,12 @@ "type": "text", "placeholders": {} }, - "wednesday": "Dé Céadaoin", - "@wednesday": { - "type": "text", - "placeholders": {} - }, "warning": "Rabhadh!", "@warning": { "type": "text", "placeholders": {} }, - "wallpaper": "Cúlbhrat", + "wallpaper": "Cúlbhrat:", "@wallpaper": { "type": "text", "placeholders": {} @@ -66,42 +44,17 @@ "type": "text", "placeholders": {} }, - "tuesday": "Dé Máirt", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "title": "FluffyChat", "@title": { "description": "Title for the application", "type": "text", "placeholders": {} }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "thursday": "Déardaoin", - "@thursday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Córas", "@systemTheme": { "type": "text", "placeholders": {} }, - "sunday": "Dé Domhnaigh", - "@sunday": { - "type": "text", - "placeholders": {} - }, "submit": "Cuir isteach", "@submit": { "type": "text", @@ -147,11 +100,6 @@ "type": "text", "placeholders": {} }, - "saturday": "Dé Sathairn", - "@saturday": { - "type": "text", - "placeholders": {} - }, "reply": "Freagair", "@reply": { "type": "text", @@ -232,16 +180,6 @@ "type": "text", "placeholders": {} }, - "crossSigningEnabled": "Tá cros-shíniú tosaithe", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Cros-síniú casta as", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Spás nua", "@createNewSpace": { "type": "text", @@ -264,7 +202,7 @@ "type": "text", "placeholders": {} }, - "ok": "togha", + "ok": "Ceart go leor", "@ok": { "type": "text", "placeholders": {} @@ -299,11 +237,6 @@ "type": "text", "placeholders": {} }, - "monday": "Dé Luain", - "@monday": { - "type": "text", - "placeholders": {} - }, "moderator": "Modhnóir", "@moderator": { "type": "text", @@ -384,16 +317,6 @@ "type": "text", "placeholders": {} }, - "friends": "Cairde", - "@friends": { - "type": "text", - "placeholders": {} - }, - "friday": "Dé hAoine", - "@friday": { - "type": "text", - "placeholders": {} - }, "forward": "Seol ar aghaidh", "@forward": { "type": "text", @@ -421,16 +344,6 @@ "type": "text", "placeholders": {} }, - "donate": "Bronn", - "@donate": { - "type": "text", - "placeholders": {} - }, - "discover": "Tar ar", - "@discover": { - "type": "text", - "placeholders": {} - }, "devices": "Gléasanna", "@devices": { "type": "text", @@ -441,11 +354,6 @@ "type": "text", "placeholders": {} }, - "deny": "Diúltaigh", - "@deny": { - "type": "text", - "placeholders": {} - }, "delete": "Scrios", "@delete": { "type": "text", @@ -476,11 +384,6 @@ "timeOfDay": {} } }, - "contentViewer": "Amharcóir ábhair", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "containsUserName": "Coinníonn sé ainm úsáideora", "@containsUserName": { "type": "text", @@ -505,11 +408,6 @@ "type": "text", "description": "Usage hint for the command /me" }, - "clearText": "Glan an téacs", - "@clearText": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Glan an cartlann", "@clearArchive": {}, "chatDetails": "Sonraí comhrá", @@ -522,11 +420,6 @@ "type": "text", "placeholders": {} }, - "changeWallpaper": "Athraigh cúlbhrat", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changedTheChatAvatar": "D'athraigh {username} abhatár an chomhrá", "@changedTheChatAvatar": { "type": "text", @@ -551,11 +444,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Eochracha i dtaisce", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "botMessages": "Teachtaireachtaí bota", "@botMessages": { "type": "text", @@ -591,21 +479,6 @@ }, "sendOnEnter": "Seol ar iontráil", "@sendOnEnter": {}, - "avatarHasBeenChanged": "D'athraigh abhatár", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "authentication": "Fíordheimhniú", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Seomra cartlainne", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "archive": "Cartlann", "@archive": { "type": "text", @@ -628,11 +501,6 @@ "senderName": {} } }, - "alreadyHaveAnAccount": "An bhfuil cuntas agat cheana féin?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "allChats": "Gach comhrá", "@allChats": { "type": "text", @@ -655,39 +523,24 @@ }, "addToSpace": "Cuir go spás", "@addToSpace": {}, - "addNewFriend": "Cuir cara nua", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Cuir tuairisc grúpa", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "addEmail": "Cuir ríomhphoist", "@addEmail": { "type": "text", "placeholders": {} }, - "activatedEndToEndEncryption": "Thosaigh {username} an criptiú ó dheireadh go deireadh", + "activatedEndToEndEncryption": "🔐 {username} criptithe deireadh go deireadh gníomhachtaithe", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "accountInformation": "Faisnéis cuntais", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "account": "Cuntas", "@account": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "Ghlac {username} leis an cuireadh", + "acceptedTheInvitation": "👍 Ghlac {username} leis an gcuireadh", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -704,16 +557,6 @@ "type": "text", "placeholders": {} }, - "audioPlayerPlay": "Seinn", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Cuir ar sos", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Glac leis an iarratas fíoraithe seo ó {username}?", "@askVerificationRequest": { "type": "text", @@ -721,11 +564,6 @@ "username": {} } }, - "askSSSSCache": "Cuir isteach do phasfrása stóir sábháilte nó d'eochair téarnaimh chun na heochracha a thaisceadh le do thoil.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "areYouSureYouWantToLogout": "An bhfuil tú cinnte gur mhaith leat logáil amach?", "@areYouSureYouWantToLogout": { "type": "text", @@ -741,7 +579,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "Thug {username} cuireadh do {targetName}", + "invitedUser": "📩 thug {username} cuireadh do {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -776,11 +614,6 @@ "type": "text", "placeholders": {} }, - "groupDescriptionHasBeenChanged": "D'athraigh cur síos an ghrúpa", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "fromTheInvitation": "Ón gcuireadh", "@fromTheInvitation": { "type": "text", @@ -791,16 +624,6 @@ "type": "text", "placeholders": {} }, - "enterAUsername": "Cuir isteach ainm úsáideora", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Socruithe criptithe ó dheireadh go deireadh", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "emoteInvalid": "Gearrchód emote neamhbhailí!", "@emoteInvalid": { "type": "text", @@ -821,22 +644,12 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "Cuir ásc Jitsi in eagar", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Cuir ceadanna an chomhrá in eagar", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editBlockedServers": "Cuir freastalaí blocáilte in eagar", "@editBlockedServers": { "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Leibhéal ceada réamhshocraithe", + "defaultPermissionLevel": "Leibhéal ceada réamhshocraithe d'úsáideoirí nua", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -851,12 +664,12 @@ "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Déan comparáid idir na huimhreacha seo a leanas agus déan cinnte go bhfuil na huimhreacha seo a leanas ag teacht le huimhreacha an ghléis eile:", + "compareNumbersMatch": "Cuir na huimhreacha i gcomparáid le do thoil", "@compareNumbersMatch": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Déan comparáid agus déan cinnte go bhfuil an emoji seo a leanas comhoiriúnach le emoji an ghléis eile:", + "compareEmojiMatch": "Cuir na emojis i gcomparáid le do thoil", "@compareEmojiMatch": { "type": "text", "placeholders": {} @@ -914,14 +727,9 @@ "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "Baineadh comhrá as an spás seo", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Cuireadh comhrá leis an spás seo", "@chatHasBeenAddedToThisSpace": {}, - "chatBackupDescription": "Tá do chúltaca comhrá daingnithe le heochair slándála. Déan cinnte nach gcaillfidh tú é.", + "chatBackupDescription": "Tá do sheanteachtaireachtaí slán le eochair athshlánaithe. Le do thoil déan cinnte nach gcaillfidh tú é.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -936,11 +744,6 @@ "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Sábháladh athruithe", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changedTheRoomInvitationLink": "D'athraigh {username} nasc an chuiridh", "@changedTheRoomInvitationLink": { "type": "text", @@ -1028,23 +831,13 @@ "type": "text", "placeholder": {} }, - "createdTheChat": "Rinne {username} an comhrá", + "createdTheChat": "💬 chruthaigh {username} an comhrá", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Déan grúpa nua", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Déan cuntas anois", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "copyToClipboard": "Cóipeáil ar an ghearrthaisce", "@copyToClipboard": { "type": "text", @@ -1060,11 +853,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Theip ar iarracht an naisc", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "commandHint_plain": "Seol téacs neamhfhoirmithe", "@commandHint_plain": { "type": "text", @@ -1080,21 +868,11 @@ "type": "text", "description": "Usage hint for the command /html" }, - "chooseAUsername": "Roghnaigh ainm úsáideora", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Athraigh do abhatár", "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "changeTheServer": "Athraigh an freastalaí", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, "changeTheme": "Athraigh do stíl", "@changeTheme": { "type": "text", @@ -1115,21 +893,11 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Fíoraigh Úsáideoir", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Tosaigh Fíorú", "@verifyStart": { "type": "text", "placeholders": {} }, - "verifyManual": "Fíoraigh de láimh", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Neamhciúnaigh comhrá", "@unmuteChat": { "type": "text", @@ -1175,11 +943,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Cláraigh Cuntas", - "@signUp": { - "type": "text", - "placeholders": {} - }, "showPassword": "Taispeáin pasfhocal", "@showPassword": { "type": "text", @@ -1230,11 +993,6 @@ "type": "text", "placeholders": {} }, - "securityKey": "Eochair slándála", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "saveFile": "Sábháil comhad", "@saveFile": { "type": "text", @@ -1255,11 +1013,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Bain teachtaireacht", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeDevice": "Bain gléas", "@removeDevice": { "type": "text", @@ -1275,26 +1028,11 @@ "type": "text", "placeholders": {} }, - "publicSpace": "Spás poiblí", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Seomraí Poiblí", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicKey": "Eochair Phoiblí", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grúpaí Poiblí", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "pleaseChoose": "Roghnaigh le do thoil", "@pleaseChoose": { "type": "text", @@ -1327,23 +1065,11 @@ "type": "text", "placeholders": {} }, - "numberSelected": "{number} roghnaithe", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "noPermission": "Gan cead", "@noPermission": { "type": "text", "placeholders": {} }, - "noDescription": "Gan cuntas", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "newChat": "Comhrá nua", "@newChat": { "type": "text", @@ -1379,26 +1105,11 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Ríomhphost neamhbhailí", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Tabhair neamhaird ar ainm úsáideora", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "ignoredUsers": "Úsáideoirí a dtugann tú neamhaird orthu", "@ignoredUsers": { "type": "text", "placeholders": {} }, - "groupDescription": "Cur síos ar an ngrúpa", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Ó tar isteach", "@fromJoining": { "type": "text", @@ -1409,11 +1120,6 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algartam criptithe", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "enableEncryption": "Tosaigh criptiú", "@enableEncryption": { "type": "text", @@ -1424,31 +1130,11 @@ "type": "text", "placeholders": {} }, - "discoverGroups": "Tar ar ghrúpaí", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Scrios pictiúr", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Gníomhach faoi láthair", "@currentlyActive": { "type": "text", "placeholders": {} }, - "changelog": "Loga na n-athruithe", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Méid an chomhaid", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fileName": "Ainm an chomhaid", "@fileName": { "type": "text", @@ -1526,11 +1212,7 @@ }, "scanQrCode": "Scan cód QR", "@scanQrCode": {}, - "typeInInviteLinkManually": "Clóscríobh an nasc cuiridh de láimh...", - "@typeInInviteLinkManually": {}, - "createNewChatExplaination": "Ní gá duit ach an cód QR a scanadh nó do nasc cuiridh a roinnt mura bhfuil sibh in aice lena chéile.", - "@createNewChatExplaination": {}, - "inviteText": "Thug {username} cuireadh duit chuig FluffyChat.\n1. Suiteáil FluffyChat: https://fluffychat.im\n2. Cláraigh nó sínigh isteach\n3. Oscail an nasc cuiridh: {link}", + "inviteText": "Thug {username} cuireadh duit chuig FluffyChat.\n1. Tabhair cuairt ar fluffychat.im agus a shuiteáil an app\n2. Cláraigh nó sínigh isteach\n3. Oscail an nasc cuirí:\n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1538,8 +1220,6 @@ "link": {} } }, - "shareYourInviteLink": "Roinn do nasc cuiridh", - "@shareYourInviteLink": {}, "noMatrixServer": "Níl {server1} freastalaí Matrix. Úsáid {server2} ina áit sin?", "@noMatrixServer": { "type": "text", @@ -1548,7 +1228,7 @@ "server2": {} } }, - "noGoogleServicesWarning": "Dealraíonn sé nach bhfuil aon seirbhísí google agat ar do ghuthán. Sin cinneadh maith le do phríobháideacht! Chun fógraí brú a fháil i FluffyChat molaimid https://microg.org/ nó https://unifiedpush.org/ a úsáid.", + "noGoogleServicesWarning": "Is cosúil nach bhfuil Firebase Cloud Messaging ar fáil ar do ghléas. Chun fógraí brú a fháil fós, molaimid ntfy a shuiteáil. Le ntfy nó soláthraí Unified Push eile is féidir leat fógraí brú a fháil ar bhealach atá slán ó thaobh sonraí. Is féidir leat ntfy a íoslódáil ón PlayStore nó ó F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1563,11 +1243,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Níl Tras-Síniú ar fáil i Fluffychat ag an am seo. Cumasaigh é in Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noConnectionToTheServer": "Gan aon nasc leis an bhfreastalaí", "@noConnectionToTheServer": { "type": "text", @@ -1578,7 +1253,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Teachtaireacht nua i FluffyChat", + "newMessageInFluffyChat": "💬 Teachtaireacht nua in FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1588,40 +1263,6 @@ "type": "text", "placeholders": {} }, - "moreEvents": "{count,plural, =1{1 imeacht níos mó} other{{count} níos mó imeachtaí}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "messageWillBeRemovedWarning": "Bainfear an teachtaireacht do na rannpháirtithe go léir", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Cinntigh go bhfuil an t-aitheantóir bailí", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Ceap modhnóir", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Ceap riarachán", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Sínigh isteach le {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logInTo": "Logáil isteach chuig {homeserver}", "@logInTo": { "type": "text", @@ -1656,16 +1297,6 @@ "type": "text", "placeholders": {} }, - "lastSeenLongTimeAgo": "Le feiceáil i bhfad ó shin", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "lastSeenIp": "IP le feiceáil go deireanach", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, "lastActiveAgo": "Gníomhach deireanach: {localizedTimeShort}", "@lastActiveAgo": { "type": "text", @@ -1678,7 +1309,7 @@ "type": "text", "placeholders": {} }, - "kicked": "Chaith {username} {targetName} amach", + "kicked": "👞 chiceáil {username} {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1686,7 +1317,7 @@ "targetName": {} } }, - "kickedAndBanned": "Chaith {username} amach agus chuir cosc ar {targetName} freisin", + "kickedAndBanned": "🙅 chiceáil {username} agus chuir sé cosc ar {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1694,28 +1325,13 @@ "targetName": {} } }, - "keysMissing": "Tá na heochracha ar iarraidh", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Cuirtear eochracha i dtaisce", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "Tháinig {username} isteach sa chomhrá", + "joinedTheChat": "Tháinig 👋 {username} isteach sa chomhrá", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "isDeviceKeyCorrect": "An bhfuil an eochair gléis seo a leanas ceart?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "invitedUsersOnly": "Úsáideoirí le cuireadh amháin", "@invitedUsersOnly": { "type": "text", @@ -1748,11 +1364,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Níl an freastalaí baile comhoiriúnach", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "hasWithdrawnTheInvitationFor": "Tharraing {username} an cuireadh do {targetName} siar", "@hasWithdrawnTheInvitationFor": { "type": "text", @@ -1773,18 +1384,11 @@ "error": {} } }, - "enterASpacepName": "Cuir isteach ainm spáis", - "@enterASpacepName": {}, "enterAnEmailAddress": "Cuir isteach seoladh ríomhphoist", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAGroupName": "Iontráil ainm grúpa", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "Chuir {senderName} deireadh leis an nglao", "@endedTheCall": { "type": "text", @@ -1807,11 +1411,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Cumasaigh an cúltaca comhrá chun do chuid comhráite a chailleadh riamh.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "emoteWarnNeedToPick": "Caithfidh tú gearrchód straoiseoige agus íomhá a roghnú!", "@emoteWarnNeedToPick": { "type": "text", @@ -1822,36 +1421,16 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "Cealaigh agus ná fiafraigh arís", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Athraíodh an t-ainm taispeána", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Níl an criptiú slán ach amháin nuair a fhíoraítear gach gléas.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "deactivateAccountWarning": "Díghníomhachtaeoidh sé seo do chuntas úsáideora. Ní féidir é seo a chealú! An bhfuil tú cinnte?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} }, - "couldNotSetDisplayname": "Níorbh fhéidir an t-ainm taispeána a shocrú", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Níorbh fhéidir abhatár a shocrú", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, "couldNotDecryptMessage": "Níorbh fhéidir teachtaireacht a dhíchriptiú: {error}", "@couldNotDecryptMessage": { "type": "text", @@ -1900,11 +1479,6 @@ "supportedVersions": {} } }, - "askSSSSVerify": "Cuir isteach do phasfrása stóir sábháilte nó d'eochair téarnaimh chun do sheisiún a fhíorú le do thoil.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Chun a bheith in ann an duine eile a shíniú, cuir isteach do phasfhrása stóir sábháilte nó d'eochair téarnaimh.", "@askSSSSSign": { "type": "text", @@ -1915,36 +1489,16 @@ "type": "text", "placeholders": {} }, - "yourOwnUsername": "D'ainm úsáideora féin", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Tá do chuid comhráite á sioncronú…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Cuireadh cosc ort ón gcomhrá seo", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Ní féidir leat cuireadh a thabhairt duit féin", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Níl tú ag glacadh páirte sa chomhrá seo a thuilleadh", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Tugtar cuireadh duit chuig an gcomhrá seo", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "writeAMessage": "Scríobh teachtaireacht…", "@writeAMessage": { "type": "text", @@ -1955,7 +1509,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Glan do cúltaca comhrá a chruthú eochair slándála nua?", + "wipeChatBackup": "An bhfuil fonn ort cúltaca do chomhrá a scriosadh chun eochair athshlánaithe nua a chruthú?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -1975,32 +1529,12 @@ "type": "text", "placeholders": {} }, - "welcomeText": "Fáilte chuig an teachtaire meandarach is gleoite sa líonra Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "verifySuccess": "D'fhíoraigh tú go rathúil!", "@verifySuccess": { "type": "text", "placeholders": {} }, - "verifiedSession": "Fíoraíodh an seisiún go rathúil!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Níl an t-úsáideoir fíoraithe", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Tá an t-úsáideoir fíoraithe", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userLeftTheChat": "D'fhág {username} an comhrá", + "userLeftTheChat": "🚪 D'fhág {username} an comhrá", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2023,18 +1557,6 @@ "count": {} } }, - "useAmoledTheme": "Úsáid dathanna comhoiriúnacha le AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "unreadMessages": "{unreadEvents, plural, =1{1 teachtaireacht neamhléite} other{{unreadCount} teachtaireachtaí neamhléite}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, "unreadChats": "{unreadCount, plural, =1{1 comhrá neamhléite} other{{unreadCount} comhráite neamhléite}}", "@unreadChats": { "type": "text", @@ -2042,11 +1564,6 @@ "unreadCount": {} } }, - "unknownSessionVerify": "Seisiún anaithnid, fíoraigh é le do thoil", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unknownEncryptionAlgorithm": "Algartam criptithe anaithnid", "@unknownEncryptionAlgorithm": { "type": "text", @@ -2075,22 +1592,12 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Tá an seomra seo curtha i gcartlann.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Níl siad céanna", "@theyDontMatch": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "Tapáil chun an roghchlár a thaispeáint", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "Roinn {username} an suíomh", + "sharedTheLocation": "Roinn {username} a suíomh", "@sharedTheLocation": { "type": "text", "placeholders": { @@ -2107,11 +1614,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Socraigh cur síos ar an ngrúpa", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "Socraigh straoiseoga saincheaptha", "@setCustomEmotes": { "type": "text", @@ -2122,21 +1624,6 @@ "type": "text", "placeholders": {} }, - "setAProfilePicture": "Socraigh pictiúr próifíle", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Tá an seisiún fíoraithe", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "Eolas faoi do phríobháideacht: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, "sentCallInformations": "Sheol {senderName} faisnéis maidir le glaonna", "@sentCallInformations": { "type": "text", @@ -2144,65 +1631,27 @@ "senderName": {} } }, - "sentAVideo": "Sheol {username} físeán", + "sentAVideo": "🎥 sheol {username} físeán", "@sentAVideo": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "Sheol {username} greamán", + "sentASticker": "😊 sheol {username} greamán", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "Sheol {username} pictiúr", + "sentAPicture": "🖼️ sheol {username} pictiúr", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "seenByUserAndUser": "Le feiceáil ag {username} agus {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Le feiceáil ag {username} agus {count} daoine eile}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "saveFileToFolder": "Sábháil comhad chuig an bhfillteán seo", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Sábháladh comhad mar {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "revokeAllPermissions": "Cúlghair gach cead", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Iarraidh teachtaireachtaí níos sine a léamh", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, "replaceRoomWithNewerVersion": "Cuir leagan seomra níos nuaí in ionad an tseomra", "@replaceRoomWithNewerVersion": { "type": "text", @@ -2269,16 +1718,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "Iontráil d'eochair slándála le do thoil:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Iontráil ID Matrix le do thoil.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseEnter4Digits": "Iontráil 4 dhigit le do thoil nó fág folamh chun glas aipe a dhíchumasú.", "@pleaseEnter4Digits": { "type": "text", @@ -2289,11 +1728,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Roghnaigh ainm úsáideora le do thoil", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseChooseAPasscode": "Roghnaigh paschód le do thoil", "@pleaseChooseAPasscode": { "type": "text", @@ -2314,16 +1748,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Gléasanna úsáideora rannpháirteacha", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optional) Ainm an ghrúpa", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "serverRequiresEmail": "Ní mór don fhreastalaí seo do sheoladh ríomhphoist a bhailíochtú le haghaidh clárúcháin.", "@serverRequiresEmail": {}, "openInMaps": "Oscail i léarscáileanna", @@ -2351,11 +1775,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Tá Cúltaca Eochair Ar Líne díchumasaithe", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "numUsersTyping": "Tá {count} úsáideoirí ag clóscríobh…", "@numUsersTyping": { "type": "text", @@ -2363,65 +1782,31 @@ "count": {} } }, - "notSupportedInWeb": "Gan tacaíocht i ngréasán", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, "notificationsEnabledForThisAccount": "Fógraí cumasaithe don chuntas seo", "@notificationsEnabledForThisAccount": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Níl aon stádas le fáil go dtí seo.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Níor aimsíodh aon seomraí…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Níor aimsíodh aon seomraí poiblí…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noPasswordRecoveryDescription": "Níor chuir tú bealach leis do phasfhocal a aisghabháil fós.", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} }, - "newUsernameDescription": "Ansin beidh an fhormáid @ainmúsáideora:ainmfreastalaí ag d'aitheantas úsáideora", - "@newUsernameDescription": {}, - "newPasswordDescription": "D'fhonn a bheith in ann do phasfhocal a ghnóthú, ba cheart duit seoladh ríomhphoist a chur le do chuntas ina dhiaidh sin.", - "@newPasswordDescription": {}, - "noMegolmBootstrap": "Cas air cúltaca eochair ar líne ó laistigh de Element ina ionad.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "inviteForMe": "Tabhair cuireadh dom", "@inviteForMe": { "type": "text", "placeholders": {} }, - "ignoreListDescription": "Is féidir leat neamhaird a dhéanamh d'úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann aon teachtaireachtaí nó cuireadh seomra a fháil ó na húsáideoirí ar do liosta neamhaird phearsanta.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Sheolamar ríomhphost chugat", "@weSentYouAnEmail": { "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Tá criptiú ó dheireadh go deireadh i mBéite faoi láthair! Úsáid ar do phriacal féin!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, "waitingPartnerNumbers": "Ag fanacht le comhpháirtí glacadh leis na huimhreacha …", "@waitingPartnerNumbers": { "type": "text", @@ -2457,11 +1842,6 @@ "type": "text", "placeholders": {} }, - "userUnknownVerification": "Tá stádas fíoraithe anaithnid ag an úsáideoir", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "Sheol {username} imeacht {type}", "@userSentUnknownEvent": { "type": "text", @@ -2477,11 +1857,6 @@ "username": {} } }, - "unlockChatBackup": "Díghlasáil cúltaca comhrá", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unknownEvent": "Imeacht anaithnid '{type}'", "@unknownEvent": { "type": "text", @@ -2489,26 +1864,11 @@ "type": {} } }, - "tapToShowImage": "Tapáil chun íomhá a thaispeáint", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tapáil ar ghléas le fíorú", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Ag sioncrónú... Fan, le do thoil.", "@synchronizingPleaseWait": { "type": "text", "placeholders": {} }, - "startYourFirstChat": "Tosaigh do chéad chomhrá anois! 🙂\n- Tapáil ar an gcnaipe teachtaireachta\n- Cuir isteach ainm úsáideora cara\n- Bíodh spraoi agat ag comhrá", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "startedACall": "Thosaigh {senderName} glao", "@startedACall": { "type": "text", @@ -2521,35 +1881,25 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Fuaim, tonnchrith LED-dath", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Sínigh Aonair ar", "@singlesignon": { "type": "text", "placeholders": {} }, - "sentAnAudio": "Sheol {username} fuaim", + "sentAnAudio": "🎤 sheol {username} fuaim", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAFile": "Sheol {username} comhad", + "sentAFile": "📁 sheol {username} comhad", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sendBugReports": "Ceadaigh tuairiscí fabhtanna a sheoladh le sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendAsText": "Seol mar théacs", "@sendAsText": { "type": "text" @@ -2566,16 +1916,6 @@ "username": {} } }, - "securityKeyLost": "Ar chaill tú d'eochair slándála?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Cuardaigh comhrá", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Uasghrádaíodh an seomra", "@roomHasBeenUpgraded": { "type": "text", @@ -2592,8 +1932,6 @@ }, "link": "Nasc", "@link": {}, - "iWroteDownTheKey": "Scríobh mé an eochair", - "@iWroteDownTheKey": {}, "commandHint_clearcache": "Glan an taisce", "@commandHint_clearcache": { "type": "text", @@ -2603,33 +1941,961 @@ "@videoCallsBetaWarning": {}, "emailOrUsername": "Ríomhphost nó ainm úsáideora", "@emailOrUsername": {}, - "passwordsDoNotMatch": "Níl na pasfhocail chéanna!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Iontráil ríomhphost bailí le do thoil.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Scríobh an pasfhocal arís", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Roghnaigh {min} carachtar ar a laghad.", - "@pleaseChooseAtLeastChars": { + "yourChatBackupHasBeenSetUp": "Bunaíodh do chúltaca comhrá.", + "@yourChatBackupHasBeenSetUp": {}, + "openVideoCamera": "Oscail físcheamara", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Sábháladh an comhad ag {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "editBundlesForAccount": "Cuir cuachta in eagar don chuntas seo", + "@editBundlesForAccount": {}, + "globalChatId": "Aitheantas comhrá domhanda", + "@globalChatId": {}, + "hideMemberChangesInPublicChatsBody": "Ná taispeáin san amlíne comhrá má théann duine isteach i gcomhrá poiblí nó má fhágann sé nó sí é chun inléiteacht a fheabhsú.", + "@hideMemberChangesInPublicChatsBody": {}, + "pleaseEnterRecoveryKey": "Cuir isteach d'eochair athshlánaithe le do thoil:", + "@pleaseEnterRecoveryKey": {}, + "sender": "Seoltóir", + "@sender": {}, + "noOneCanJoin": "Ní féidir le duine ar bith páirt a ghlacadh", + "@noOneCanJoin": {}, + "noOtherDevicesFound": "Níor aimsíodh aon ghléas eile", + "@noOtherDevicesFound": {}, + "profileNotFound": "Níorbh fhéidir an t-úsáideoir a aimsiú ar an bhfreastalaí. B'fhéidir go bhfuil fadhb nasctha ann nó nach bhfuil an t-úsáideoir ann.", + "@profileNotFound": {}, + "inviteGroupChat": "📨 Tabhair cuireadh comhrá grúpa", + "@inviteGroupChat": {}, + "knocking": "Cnagadh", + "@knocking": {}, + "addChatOrSubSpace": "Cuir comhrá nó fo-spás leis", + "@addChatOrSubSpace": {}, + "thisDevice": "An gléas seo:", + "@thisDevice": {}, + "formattedMessages": "Teachtaireachtaí formáidithe", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 Fíoraigh gléas eile", + "@verifyOtherDevice": {}, + "commandHint_ignore": "Déan neamhaird d'aitheantas na maitríse sonraithe", + "@commandHint_ignore": {}, + "completedKeyVerification": "{sender} fíorú eochair críochnaithe", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "changeTheCanonicalRoomAlias": "Athraigh an príomhsheoladh comhrá poiblí", + "@changeTheCanonicalRoomAlias": {}, + "importEmojis": "Iompórtáil Emoji", + "@importEmojis": {}, + "start": "Tosaigh", + "@start": {}, + "commandHint_dm": "Cuir tús le comhrá díreach\nÚsáid --no-cription chun criptiúchán a dhíchumasú", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "invalidServerName": "Ainm freastalaí neamhbhailí", + "@invalidServerName": {}, + "addToBundle": "Cuir le bundle", + "@addToBundle": {}, + "redactedBy": "Arna chur in eagar ag {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "addToSpaceDescription": "Roghnaigh spás chun an comhrá seo a chur leis.", + "@addToSpaceDescription": {}, + "markAsRead": "Marcáil mar léite", + "@markAsRead": {}, + "enterRoom": "Iontráil seomra", + "@enterRoom": {}, + "deviceKeys": "Eochracha gléis:", + "@deviceKeys": {}, + "allSpaces": "Gach spás", + "@allSpaces": {}, + "searchForUsers": "Cuardaigh @users...", + "@searchForUsers": {}, + "removeFromBundle": "Bain as an mbeart seo", + "@removeFromBundle": {}, + "recoveryKeyLost": "Eochair athshlánaithe caillte?", + "@recoveryKeyLost": {}, + "reactedWith": "D'fhreagair {sender} le {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "youInvitedBy": "📩 Thug {user} cuireadh duit", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "doNotShowAgain": "Ná taispeáin arís", + "@doNotShowAgain": {}, + "pleaseEnterANumber": "Iontráil uimhir níos mó ná 0", + "@pleaseEnterANumber": {}, + "unbanUserDescription": "Beidh an t-úsáideoir in ann dul isteach sa chomhrá arís má dhéanann siad iarracht.", + "@unbanUserDescription": {}, + "pleaseEnterYourCurrentPassword": "Iontráil do phasfhocal reatha le do thoil", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Pasfhocal nua", + "@newPassword": {}, + "subspace": "Fospás", + "@subspace": {}, + "decline": "Meath", + "@decline": {}, + "forwardMessageTo": "Seol teachtaireacht ar aghaidh chuig {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceipts": "Seol admhálacha léite", + "@sendReadReceipts": {}, + "formattedMessagesDescription": "Taispeáin ábhar saibhir teachtaireachta cosúil le téacs trom ag baint úsáide as marcáil síos.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Fíoraigh úsáideoir eile", + "@verifyOtherUser": {}, + "dehydrateTorLong": "Maidir le húsáideoirí TOR, moltar an seisiún a onnmhairiú roimh dhúnadh an fhuinneog.", + "@dehydrateTorLong": {}, + "numChats": "Comhráite {number}", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hidePresences": "Folaigh Liosta Stádais?", + "@hidePresences": {}, + "jump": "Léim", + "@jump": {}, + "reportErrorDescription": "😭 Ó, a mhac go deo. Chuaigh rud éigin mícheart. Más mian leat, is féidir leat an fabht seo a thuairisciú do na forbróirí.", + "@reportErrorDescription": {}, + "setTheme": "Socraigh téama:", + "@setTheme": {}, + "invalidInput": "Ionchur neamhbhailí!", + "@invalidInput": {}, + "kickUserDescription": "Ciceáiltear an t-úsáideoir as an gcomhrá ach níl cosc air. I gcomhráite poiblí, is féidir leis an úsáideoir teacht ar ais ag am ar bith.", + "@kickUserDescription": {}, + "startConversation": "Tosaigh comhrá", + "@startConversation": {}, + "commandHint_sendraw": "Seol json amh", + "@commandHint_sendraw": {}, + "leaveEmptyToClearStatus": "Fág folamh chun do stádas a ghlanadh.", + "@leaveEmptyToClearStatus": {}, + "pleaseChooseAStrongPassword": "Roghnaigh pasfhocal láidir", + "@pleaseChooseAStrongPassword": {}, + "publicLink": "Nasc poiblí", + "@publicLink": {}, + "joinSpace": "Glac páirt sa spás", + "@joinSpace": {}, + "initAppError": "Tharla earráid agus an feidhmchlár á thosú", + "@initAppError": {}, + "requestedKeyVerification": "D'iarr {sender} fíorú eochrach", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "incomingMessages": "Teachtaireachtaí isteach", + "@incomingMessages": {}, + "transparent": "Trédhearcach", + "@transparent": {}, + "voiceCall": "Glao gutha", + "@voiceCall": {}, + "widgetVideo": "Físeán", + "@widgetVideo": {}, + "errorAddingWidget": "Earráid agus an ghiuirléid á cur leis.", + "@errorAddingWidget": {}, + "emojis": "Emojis", + "@emojis": {}, + "reportUser": "Déan tuairisc ar úsáideoir", + "@reportUser": {}, + "custom": "Saincheaptha", + "@custom": {}, + "supposedMxid": "Ba cheart go mbeadh sé seo {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasgroup": "Marcáil mar ghrúpa", + "@commandHint_markasgroup": {}, + "dismiss": "Díbhe", + "@dismiss": {}, + "newGroup": "Grúpa nua", + "@newGroup": {}, + "newSpace": "Spás nua", + "@newSpace": {}, + "compressBeforeSending": "Comhbhrú roimh sheoladh", + "@compressBeforeSending": {}, + "confirmMatrixId": "Deimhnigh d’ID Maitrís chun do chuntas a scriosadh.", + "@confirmMatrixId": {}, + "hideMemberChangesInPublicChats": "Cuir athruithe ball i gcomhráite poiblí i bhfolach", + "@hideMemberChangesInPublicChats": {}, + "confirmEventUnpin": "An bhfuil tú cinnte an t-imeacht a dhíphionnáil go buan?", + "@confirmEventUnpin": {}, + "hugContent": "Tugann {senderName} barróg duit", + "@hugContent": { "type": "text", "placeholders": { - "min": {} + "senderName": {} } }, - "setupChatBackup": "Bunaigh cúltaca comhrá", - "@setupChatBackup": {}, - "bubbleSize": "Méid na mbolgán cainte", - "@bubbleSize": { + "unread": "Neamhléite", + "@unread": {}, + "noChatsFoundHere": "Níor aimsíodh aon chomhrá anseo fós. Cuir tús le comhrá nua le duine éigin tríd an gcnaipe thíos a úsáid. ⤵️", + "@noChatsFoundHere": {}, + "separateChatTypes": "Comhráite Díreacha agus Grúpaí ar Leith", + "@separateChatTypes": { "type": "text", "placeholders": {} }, - "yourUserId": "D'aitheantas úsáideora:", - "@yourUserId": {}, - "yourChatBackupHasBeenSetUp": "Bunaíodh do chúltaca comhrá.", - "@yourChatBackupHasBeenSetUp": {}, - "openVideoCamera": "Oscail físcheamara", - "@openVideoCamera": { + "videoWithSize": "Físeán ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "messageInfo": "Eolas teachtaireachta", + "@messageInfo": {}, + "messageType": "Cineál Teachtaireachta", + "@messageType": {}, + "pleaseEnterRecoveryKeyDescription": "Chun do sheanteachtaireachtaí a dhíghlasáil, cuir isteach d'eochair athshlánaithe a gineadh i seisiún eile. NÍ do phasfhocal í d'eochair athshlánaithe.", + "@pleaseEnterRecoveryKeyDescription": {}, + "openChat": "Oscail Comhrá", + "@openChat": {}, + "unsupportedAndroidVersionLong": "Éilíonn an ghné seo leagan Android níos nuaí. Seiceáil le haghaidh nuashonruithe nó tacaíocht Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "experimentalVideoCalls": "Glaonna físe turgnamhacha", + "@experimentalVideoCalls": {}, + "switchToAccount": "Athraigh go cuntas {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "addWidget": "Cuir giuirléid leis", + "@addWidget": {}, + "widgetUrlError": "Ní URL bailí é seo.", + "@widgetUrlError": {}, + "invitedBy": "📩 Cuireadh ó {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "youKicked": "👞 Chiceáil tú {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "Unbanned tú {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "userWouldLikeToChangeTheChat": "Ba mhaith le {user} páirt a ghlacadh sa chomhrá.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "knock": "Cnoc Mhuire", + "@knock": {}, + "storeInSecureStorageDescription": "Stóráil an eochair aisghabhála i stóráil slán an ghléis seo.", + "@storeInSecureStorageDescription": {}, + "countFiles": "Comhaid {count}", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "foregroundServiceRunning": "Tá an fógra seo le feiceáil nuair atá an tseirbhís tulra ag rith.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "Tá do scáileán á roinnt agat i FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Ceadanna a ghlaoch", + "@callingPermissions": {}, + "callingAccount": "Cuntas ag glaoch", + "@callingAccount": {}, + "callingAccountDetails": "Ceadaíonn FluffyChat an aip dhiailiú android dúchais a úsáid.", + "@callingAccountDetails": {}, + "appearOnTopDetails": "Ceadaíonn sé don aip a bheith ar bharr (ní gá má tá socrú Fluffychat agat cheana féin mar chuntas glao)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Micreafón, ceamara agus ceadanna FluffyChat eile", + "@otherCallingPermissions": {}, + "hideUnimportantStateEvents": "Folaigh imeachtaí stáit gan tábhacht", + "@hideUnimportantStateEvents": {}, + "disableEncryptionWarning": "Ar chúiseanna slándála ní féidir leat criptiú a dhíchumasú i gcomhrá, áit ar cumasaíodh é roimhe seo.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Tá brón orm... nach féidir a dhéanamh", + "@sorryThatsNotPossible": {}, + "reopenChat": "Comhrá a athoscailt", + "@reopenChat": {}, + "noBackupWarning": "Rabhadh! Gan cúltaca comhrá a chumasú, caillfidh tú rochtain ar do theachtaireachtaí criptithe. Moltar go mór an cúltaca comhrá a chumasú ar dtús sula logálann tú amach.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Ní féidir seol! Ní thacaíonn an freastalaí ach le ceangaltáin suas le {max}.", + "@fileIsTooBigForServer": { + "type": "text", + "placeholders": { + "max": {} + } + }, + "jumpToLastReadMessage": "Léim go dtí an teachtaireacht léite is déanaí", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Léigh suas go dtí seo", + "@readUpToHere": {}, + "openLinkInBrowser": "Oscail nasc sa bhrabhsálaí", + "@openLinkInBrowser": {}, + "signInWithPassword": "Sínigh isteach le pasfhocal", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Bain triail eile as níos déanaí nó roghnaigh freastalaí eile.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Sínigh isteach le {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "invitePrivateChat": "📨 Tabhair cuireadh comhrá príobháideach", + "@invitePrivateChat": {}, + "wrongPinEntered": "Tháinig biorán mícheart isteach! Bain triail eile as i {seconds} soicind...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "archiveRoomDescription": "Bogfar an comhrá go dtí an chartlann. Beidh úsáideoirí eile in ann a fheiceáil gur fhág tú an comhrá.", + "@archiveRoomDescription": {}, + "removeDevicesDescription": "Beidh tú logáilte amach as an ngléas seo agus ní bheidh tú in ann teachtaireachtaí a fháil a thuilleadh.", + "@removeDevicesDescription": {}, + "roomUpgradeDescription": "Déanfar an comhrá a athchruthú ansin leis an leagan seomra nua. Cuirfear in iúl do gach rannpháirtí go gcaithfidh siad aistriú chuig an gcomhrá nua. Is féidir leat tuilleadh eolais a fháil faoi leaganacha seomra ag https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "banUserDescription": "Beidh cosc ar an úsáideoir ón gcomhrá agus ní bheidh sé in ann dul isteach sa chomhrá arís go dtí go mbeidh siad gan chosc.", + "@banUserDescription": {}, + "makeAdminDescription": "Nuair a dhéanann tú an riarachán úsáideora seo, b'fhéidir nach mbeidh tú in ann é seo a chealú mar go mbeidh na ceadanna céanna acu agus atá agat.", + "@makeAdminDescription": {}, + "learnMore": "Faigh tuilleadh eolais", + "@learnMore": {}, + "yourGlobalUserIdIs": "Is é d'aitheantas úsáideora domhanda: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "Ar an drochuair ní fhéadfaí aon úsáideoir a aimsiú le \"{query}\". Seiceáil le do thoil an ndearna tú typo.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "searchChatsRooms": "Cuardaigh #chats, @users...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Cruthaigh grúpa agus tabhair cuireadh d'úsáideoirí", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Is féidir teacht ar ghrúpa trí chuardach", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Tá brón orm... Ní cosúil gurb é seo an eochair aisghabhála ceart.", + "@wrongRecoveryKey": {}, + "databaseMigrationBody": "Fan, le do thoil. B'fhéidir go dtógfaidh sé seo nóiméad.", + "@databaseMigrationBody": {}, + "select": "Roghnaigh", + "@select": {}, + "passwordsDoNotMatch": "Ní mheaitseálann pasfhocail", + "@passwordsDoNotMatch": {}, + "searchIn": "Cuardaigh i gcomhrá \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "passwordIsWrong": "Tá do phasfhocal iontrála mícheart", + "@passwordIsWrong": {}, + "files": "Comhaid", + "@files": {}, + "databaseBuildErrorBody": "Ní féidir bunachar sonraí SQlite a thógáil. Déanann an aip iarracht an bunachar sonraí oidhreachta a úsáid anois. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sessionLostBody": "Cailltear do sheisiún. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Déanann an aip iarracht anois do sheisiún a chur ar ais ón gcúltaca. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "verifyOtherUserDescription": "Má fhíoraíonn tú úsáideoir eile, is féidir leat a bheith cinnte go bhfuil a fhios agat cé leis a bhfuil tú ag scríobh i ndáiríre. 💪\n\nNuair a thosaíonn tú fíorú, feicfidh tú féin agus an t-úsáideoir eile aníos san aip. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile.\n\nIs é an bealach is fearr chun é seo a dhéanamh ná bualadh le chéile nó glao físe a thosú. 👭", + "@verifyOtherUserDescription": {}, + "sendTypingNotificationsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair atá teachtaireacht nua á clóscríobh agat.", + "@sendTypingNotificationsDescription": {}, + "verifyOtherDeviceDescription": "Nuair a fhíoraíonn tú gléas eile, is féidir leis na gléasanna sin eochracha a mhalartú, do shlándáil fhoriomlán a mhéadú. 💪 Nuair a thosaíonn tú fíorú, beidh preabfhuinneog le feiceáil san aip ar an dá ghléas. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile. Is fearr an dá ghléas a bheith áisiúil sula dtosaíonn tú ar an bhfíorú. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} glacadh le fíorú eochair", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} cealaithe fíorú eochrach", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "commandHint_unignore": "Unignore an ID maitrís tugtha", + "@commandHint_unignore": {}, + "restricted": "Srianta", + "@restricted": {}, + "goToSpace": "Téigh go dtí an spás: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Marcáil mar gan léamh", + "@markAsUnread": {}, + "moderatorLevel": "{level} - Modhnóir", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Riarachán", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "inviteOtherUsers": "Tabhair cuireadh d'úsáideoirí eile chuig an gcomhrá seo", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Athraigh na ceadanna comhrá", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Athraigh infheictheacht stair an chomhrá", + "@changeTheVisibilityOfChatHistory": {}, + "chatPermissionsDescription": "Sainmhínigh cén leibhéal cumhachta is gá le haghaidh gníomhartha áirithe sa chomhrá seo. De ghnáth bíonn na leibhéil chumhachta 0, 50 agus 100 ag déanamh ionadaíochta d'úsáideoirí, do mhodhnóirí agus do riarthóirí, ach is féidir aon ghrádú a dhéanamh.", + "@chatPermissionsDescription": {}, + "changelog": "ChangelogName", + "@changelog": {}, + "sendCanceled": "Cealaíodh seoladh", + "@sendCanceled": {}, + "loginWithMatrixId": "Logáil isteach le Matrix-ID", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Faigh amach faoi fhreastalaithe baile", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Cad is freastalaí baile ann?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Stóráiltear do chuid sonraí go léir ar an bhfreastalaí baile, díreach cosúil le soláthraí ríomhphoist. Is féidir leat an freastalaí baile is mian leat a úsáid a roghnú, agus is féidir leat cumarsáid a dhéanamh le gach duine fós. Foghlaim níos mó ag https://matrix.org.", + "@homeserverDescription": {}, + "calculatingFileSize": "Méid an chomhaid á ríomh...", + "@calculatingFileSize": {}, + "sendingAttachment": "Iatán á sheoladh...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Mionsamhail físe á cruthú...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Físeán á chomhbhrú...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Ceangaltán {index} de {length} á sheoladh...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "prepareSendingAttachment": "Ullmhaigh an t- iatán á sheoladh...", + "@prepareSendingAttachment": {}, + "serverLimitReached": "Sroicheadh teorainn an fhreastalaí! Ag fanacht {seconds} soicind...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Ní fhíoraítear ceann de do ghléasanna", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nóta: Nuair a nascann tú do ghléasanna go léir leis an gcúltaca comhrá, déantar iad a fhíorú go huathoibríoch.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Lean ar aghaidh", + "@continueText": {}, + "welcomeText": "Hey Hey 👋 Is é seo FluffyChat. Is féidir leat síniú isteach in aon fhreastalaí baile, atá comhoiriúnach leis https://matrix.org. Agus ansin comhrá a dhéanamh le duine ar bith. Is líonra teachtaireachtaí díláraithe ollmhór é!", + "@welcomeText": {}, + "blur": "Doiléirigh:", + "@blur": {}, + "opacity": "Teimhneacht:", + "@opacity": {}, + "setWallpaper": "Socraigh cúlbhrat", + "@setWallpaper": {}, + "manageAccount": "Bainistigh cuntas", + "@manageAccount": {}, + "noContactInformationProvided": "Ní sholáthraíonn an freastalaí aon fhaisnéis teagmhála bhailí", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Déan teagmháil le admin an fhreastalaí", + "@contactServerAdmin": {}, + "contactServerSecurity": "Déan teagmháil le slándáil an fhreastalaí", + "@contactServerSecurity": {}, + "supportPage": "Leathanach tacaíochta", + "@supportPage": {}, + "name": "Ainm", + "@name": {}, + "version": "Leagan", + "@version": {}, + "website": "Suíomh Gréasáin", + "@website": {}, + "messagesStyle": "Teachtaireachtaí:", + "@messagesStyle": {}, + "setColorTheme": "Socraigh téama datha:", + "@setColorTheme": {}, + "openGallery": "Oscail gailearaí", + "@openGallery": {}, + "users": "Úsáideoirí", + "@users": {}, + "youBannedUser": "Chuir tú cosc ar {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "user": "Úsáideoir", + "@user": {}, + "databaseMigrationTitle": "Tá an bunachar sonraí optamaithe", + "@databaseMigrationTitle": {}, + "hasKnocked": "🚪 Tá {user} tar éis cnagadh", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "report": "tuairisc", + "@report": {}, + "invite": "Tabhair cuireadh", + "@invite": {}, + "publicSpaces": "Spásanna poiblí", + "@publicSpaces": {}, + "whyIsThisMessageEncrypted": "Cén fáth nach féidir an teachtaireacht seo a léamh?", + "@whyIsThisMessageEncrypted": {}, + "pinMessage": "PIN go seomra", + "@pinMessage": {}, + "dehydrate": "Easpórtáil seisiún agus gléas wipe", + "@dehydrate": {}, + "dehydrateTor": "Úsáideoirí TOR: Seisiún easpórtála", + "@dehydrateTor": {}, + "commandHint_markasdm": "Marcáil mar sheomra teachtaireachta dírí don ID Maitrís tugtha", + "@commandHint_markasdm": {}, + "googlyEyesContent": "Seolann {senderName} súile googly chugat", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_cuddle": "Seol cuddle", + "@commandHint_cuddle": {}, + "commandHint_hug": "Seol barróg", + "@commandHint_hug": {}, + "startFirstChat": "Cuir tús le do chéad chomhrá", + "@startFirstChat": {}, + "encryptThisChat": "Criptigh an comhrá seo", + "@encryptThisChat": {}, + "importNow": "Iompórtáil anois", + "@importNow": {}, + "sendTypingNotifications": "Seol fógraí clóscríofa", + "@sendTypingNotifications": {}, + "addChatDescription": "Cuir cur síos ar an gcomhrá leis...", + "@addChatDescription": {}, + "chatPermissions": "Ceadanna comhrá", + "@chatPermissions": {}, + "emoteKeyboardNoRecents": "Beidh mothúcháin a úsáideadh le déanaí le feiceáil anseo ...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "chatDescriptionHasBeenChanged": "Athraíodh cur síos ar an gcomhrá", + "@chatDescriptionHasBeenChanged": {}, + "pushNotificationsNotAvailable": "Níl fógraí brú ar fáil", + "@pushNotificationsNotAvailable": {}, + "publish": "Foilsigh", + "@publish": {}, + "changeGeneralChatSettings": "Athraigh socruithe ginearálta comhrá", + "@changeGeneralChatSettings": {}, + "sendRoomNotifications": "Seol fógraí @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Athraigh an cur síos ar an gcomhrá", + "@changeTheDescriptionOfTheGroup": {}, + "aboutHomeserver": "Maidir le {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "cuddleContent": "Cuireann {senderName} do chudacht", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "countChatsAndCountParticipants": "{chats} comhrá agus {participants} rannpháirtí", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Níor aimsíodh a thuilleadh comhráite...", + "@noMoreChatsFound": {}, + "joinedChats": "Glacadh páirt i gcomhráite", + "@joinedChats": {}, + "space": "Spás", + "@space": {}, + "spaces": "Spásanna", + "@spaces": {}, + "directChat": "Comhrá díreach", + "@directChat": {}, + "redactedByBecause": "Athbhreithnithe ag {username} mar: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "recoveryKey": "Eochair athshlánaithe", + "@recoveryKey": {}, + "setChatDescription": "Socraigh cur síos ar an gcomhrá", + "@setChatDescription": {}, + "presenceStyle": "Láithreacht:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Taispeáin teachtaireachtaí stádais ó úsáideoirí eile", + "@presencesToggle": { "type": "text", "placeholders": {} + }, + "time": "Am", + "@time": {}, + "removeFromSpace": "Bain as spás", + "@removeFromSpace": {}, + "placeCall": "Cuir glaoch", + "@placeCall": {}, + "unsupportedAndroidVersion": "Leagan Android gan tacaíocht", + "@unsupportedAndroidVersion": {}, + "previousAccount": "Cuntas roimhe seo", + "@previousAccount": {}, + "widgetJitsi": "Jitsi le chéile", + "@widgetJitsi": {}, + "widgetCustom": "Saincheaptha", + "@widgetCustom": {}, + "widgetName": "Ainm", + "@widgetName": {}, + "usersMustKnock": "Ní mór d'úsáideoirí cnag a chur ar", + "@usersMustKnock": {}, + "noPublicLinkHasBeenCreatedYet": "Níor cruthaíodh aon nasc poiblí go fóill", + "@noPublicLinkHasBeenCreatedYet": {}, + "storeSecurlyOnThisDevice": "Stóráil go daingean ar an ngléas seo", + "@storeSecurlyOnThisDevice": {}, + "userLevel": "{level} - Úsáideoir", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "updateInstalled": "🎉 Nuashonraigh {version} suiteáilte!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "serverInformation": "Eolas freastalaí:", + "@serverInformation": {}, + "knockRestricted": "Cnoc Mhuire srianta", + "@knockRestricted": {}, + "createGroup": "Cruthaigh grúpa", + "@createGroup": {}, + "noChatDescriptionYet": "Níl aon chur síos ar an gcomhrá cruthaithe fós.", + "@noChatDescriptionYet": {}, + "shareInviteLink": "Roinn an nasc cuireadh", + "@shareInviteLink": {}, + "notifyMeFor": "Cuir in iúl dom le haghaidh", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Socruithe athshlánaithe pasfhocal", + "@passwordRecoverySettings": {}, + "widgetEtherpad": "Nóta téacs", + "@widgetEtherpad": {}, + "youKickedAndBanned": "🙅 Chiceáil tú agus chuir tú cosc ar {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "publicChatAddresses": "Seoltaí comhrá poiblí", + "@publicChatAddresses": {}, + "createNewAddress": "Cruthaigh seoladh nua", + "@createNewAddress": {}, + "groupName": "Ainm an ghrúpa", + "@groupName": {}, + "bundleName": "Ainm an bheartáin", + "@bundleName": {}, + "enterSpace": "Iontráil spás", + "@enterSpace": {}, + "wasDirectChatDisplayName": "Comhrá folamh (bhí {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "oneClientLoggedOut": "Tá duine de do chliaint logáilte amach", + "@oneClientLoggedOut": {}, + "overview": "Forbhreathnú", + "@overview": {}, + "unverified": "Neamhfhíoraithe", + "@unverified": {}, + "widgetNameError": "Tabhair ainm taispeána, le do thoil.", + "@widgetNameError": {}, + "youRejectedTheInvitation": "Dhiúltaigh tú don chuireadh", + "@youRejectedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Tharraing tú siar an cuireadh do {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedToBy": "📩 Tugadh cuireadh duit trí nasc chuig:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "youInvitedUser": "📩 Thug tú cuireadh do {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "unlockOldMessages": "Díghlasáil seanteachtaireachtaí", + "@unlockOldMessages": {}, + "saveKeyManuallyDescription": "Sábháil an eochair seo de láimh trí dialóg nó gearrthaisce comhroinnte an chórais a spreagadh.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Stóráil i Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Stóráil i Apple KeyChain", + "@storeInAppleKeyChain": {}, + "appearOnTop": "Le feiceáil ar an mbarr", + "@appearOnTop": {}, + "newSpaceDescription": "Ligeann spásanna duit do chomhráite a chomhdhlúthú agus pobail phríobháideacha nó phoiblí a thógáil.", + "@newSpaceDescription": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Is féidir comhrá a aimsiú tríd an gcuardach ar {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "nothingFound": "Níor aimsíodh aon rud...", + "@nothingFound": {}, + "searchMore": "Cuardaigh tuilleadh...", + "@searchMore": {}, + "gallery": "Gailearaí", + "@gallery": {}, + "alwaysUse24HourFormat": "bréagach", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "importFromZipFile": "Iompórtáil ó chomhad .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Easpórtáil Emote pacáiste mar .zip", + "@exportEmotePack": {}, + "replace": "Ionadaigh", + "@replace": {}, + "appLockDescription": "Cuir glas ar an aip nuair nach bhfuil sé in úsáid le cód bioráin", + "@appLockDescription": {}, + "swipeRightToLeftToReply": "Svaidhpeáil ar dheis ar chlé chun freagra a thabhairt", + "@swipeRightToLeftToReply": {}, + "commandHint_discardsession": "Scrios an seisiún", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "allRooms": "Gach Comhrá Grúpa", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "block": "Bloc", + "@block": {}, + "blockListDescription": "Is féidir leat bac a chur ar úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann teachtaireachtaí nó cuireadh seomra ar bith a fháil ó na húsáideoirí ar do liosta bloc pearsanta.", + "@blockListDescription": {}, + "blockUsername": "Déan neamhaird de ainm úsáideora", + "@blockUsername": {}, + "inviteContactToGroupQuestion": "Ar mhaith leat cuireadh a thabhairt do {contact} chuig an gcomhrá \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Bain triail eile as", + "@tryAgain": {}, + "optionalRedactReason": "(Roghnach) An chúis leis an teachtaireacht seo a chur in eagar...", + "@optionalRedactReason": {}, + "dehydrateWarning": "Ní féidir an gníomh seo a chealú. Cinntigh go stórálann tú an comhad cúltaca go sábháilte.", + "@dehydrateWarning": {}, + "hydrateTor": "Úsáideoirí TOR: Iompórtáil easpórtáil seisiún", + "@hydrateTor": {}, + "hydrateTorLong": "An ndearna tú do sheisiún a easpórtáil an uair dheireanach ar TOR? Iompórtáil go tapa é agus leanúint ar aghaidh ag comhrá.", + "@hydrateTorLong": {}, + "hydrate": "Athchóirigh ó chomhad cúltaca", + "@hydrate": {}, + "commandHint_googly": "Seol roinnt súile googly", + "@commandHint_googly": {}, + "notAnImage": "Ní comhad íomhá é.", + "@notAnImage": {}, + "userRole": "Ról an úsáideora", + "@userRole": {}, + "minimumPowerLevel": "Is é {level} an t-íosleibhéal cumhachta.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "isReadyForKeyVerification": "Tá {sender} réidh le haghaidh fíorú eochair", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "Thosaigh {sender} fíorú eochrach", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "stickers": "Greamáin", + "@stickers": {}, + "discover": "Faigh amach", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread} comhráite gan léamh", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "Ní thacaítear le criptiú bunachar sonraí ar an ardán seo", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Faoi láthair tá bac curtha ar úsáideoirí {count}.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "sendReadReceiptsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair a bhíonn teachtaireacht léite agat.", + "@sendReadReceiptsDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Ní cosúil gur freastalaí baile comhoiriúnach é. URL mícheart?", + "@doesNotSeemToBeAValidHomeserver": {}, + "indexedDbErrorTitle": "Saincheisteanna mód príobháideach", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "Ar an drochuair níl an stóráil teachtaireachta cumasaithe sa mhód príobháideach de réir réamhshocraithe.\nTabhair cuairt le do thoil\n - faoi: config\n - socraithe dom.indexedDB.privateBrowsing.enabled go fíor\nSeachas sin, ní féidir FluffyChat a rith.", + "@indexedDbErrorLong": {}, + "nextAccount": "An chéad chuntas eile", + "@nextAccount": {}, + "youJoinedTheChat": "Chuaigh tú isteach sa chomhrá", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Ghlac tú leis an gcuireadh", + "@youAcceptedTheInvitation": {}, + "screenSharingTitle": "comhroinnt scáileáin", + "@screenSharingTitle": {}, + "accessAndVisibility": "Rochtain agus infheictheacht", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Cé a bhfuil cead aige páirt a ghlacadh sa chomhrá seo agus conas is féidir an comhrá a aimsiú.", + "@accessAndVisibilityDescription": {}, + "calls": "Glaonna", + "@calls": {}, + "customEmojisAndStickers": "Emojis agus greamáin saincheaptha", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Cuir leis nó roinn emojis nó greamáin saincheaptha is féidir a úsáid in aon chomhrá.", + "@customEmojisAndStickersBody": {}, + "chatDescription": "Cur síos ar an gcomhrá", + "@chatDescription": {}, + "hideRedactedMessages": "Folaigh teachtaireachtaí curtha in eagar", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Má athghníomhaíonn duine éigin teachtaireacht, ní bheidh an teachtaireacht seo le feiceáil sa chomhrá a thuilleadh.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Folaigh formáidí teachtaireachta neamhbhailí nó anaithnid", + "@hideInvalidOrUnknownMessageFormats": {}, + "blockedUsers": "Úsáideoirí bactha", + "@blockedUsers": {}, + "redactMessageDescription": "Athrófar an teachtaireacht do gach rannpháirtí sa chomhrá seo. Ní féidir é seo a chealú.", + "@redactMessageDescription": {}, + "noKeyForThisMessage": "Féadfaidh sé seo tarlú má seoladh an teachtaireacht sular shínigh tú isteach ar do chuntas ag an ngléas seo.\n\nIs féidir freisin gur chuir an seoltóir bac ar do ghléas nó go ndeachaigh rud éigin mícheart leis an nasc idirlín.\n\nAn bhfuil tú in ann an teachtaireacht a léamh ar sheisiún eile? Ansin is féidir leat an teachtaireacht a aistriú uaidh! Téigh go Socruithe > Gléasanna agus cinntigh go bhfuil do ghléasanna fíoraithe a chéile. Nuair a osclaíonn tú an seomra an chéad uair eile agus an dá sheisiún sa tulra, déanfar na heochracha a tharchur go huathoibríoch.\n\nNár mhaith leat na heochracha a chailleadh agus tú ag logáil amach nó ag aistriú gléasanna? Déan cinnte go bhfuil an cúltaca comhrá cumasaithe agat sna socruithe.", + "@noKeyForThisMessage": {}, + "sendUncompressed": "Seol neamh-chomhbhrúite", + "@sendUncompressed": {}, + "boldText": "Téacs trom", + "@boldText": {}, + "italicText": "Téacs iodálach", + "@italicText": {}, + "strikeThrough": "Stailc tríd", + "@strikeThrough": {}, + "addLink": "Cuir nasc leis", + "@addLink": {}, + "pleaseFillOut": "Líon amach le do thoil", + "@pleaseFillOut": {}, + "invalidUrl": "URL neamhbhailí", + "@invalidUrl": {}, + "unableToJoinChat": "Ní féidir páirt a ghlacadh sa chomhrá. B’fhéidir go bhfuil an comhrá dúnta cheana féin ag an bpáirtí eile.", + "@unableToJoinChat": {}, + "compress": "Comhbhrúigh", + "@compress": {}, + "sendImages": "Seol {count} íomhá", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } } } diff --git a/assets/l10n/intl_gl.arb b/assets/l10n/intl_gl.arb index 83c11d9bae..dbc4d1593d 100644 --- a/assets/l10n/intl_gl.arb +++ b/assets/l10n/intl_gl.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} aceptou o convite", + "acceptedTheInvitation": "👍 {username} aceptou o convite", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Información da conta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} activou o cifrado extremo-a-extremo", + "activatedEndToEndEncryption": "🔐 {username} activou a cifraxe extremo-a-extremo", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Engade a descrición do grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Engadir nova amizade", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Admin", "@admin": { "type": "text", @@ -65,16 +50,11 @@ "type": "text", "placeholders": {} }, - "allChats": "Tódolos chats", + "allChats": "Todas as conversas", "@allChats": { "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Xa tes unha conta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} respondeu á chamada", "@answeredTheCall": { "type": "text", @@ -97,11 +77,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Sala arquivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Permitir o acceso de convidadas", "@areGuestsAllowedToJoin": { "type": "text", @@ -117,21 +92,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Escribe a frase de paso de seguridade ou chave de recuperación para almacenar as chaves.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Para poder asinar a outra persoa, escribe a túa frase de paso ou chave de recuperación.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Escribe frase de paso de almacenaxe segura ou chave de recuperación para verificar a túa sesión.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Aceptar a solicitude de verificación de {username}?", "@askVerificationRequest": { "type": "text", @@ -139,31 +104,11 @@ "username": {} } }, - "audioPlayerPause": "Deter", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Reproducir", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticación", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Reproducir automáticamente adhesivos e emotes", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "O avatar cambiou", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "O servidor soporta as seguintes formas de conexión:\n{serverVersions}\nPero esta app só soporta:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -213,11 +158,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Chaves almacenadas", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "text", @@ -235,7 +175,7 @@ "type": "text", "placeholders": {} }, - "changedTheChatAvatar": "{username} cambiou o avatar do chat", + "changedTheChatAvatar": "{username} cambiou o avatar da conversa", "@changedTheChatAvatar": { "type": "text", "placeholders": { @@ -250,7 +190,7 @@ "description": {} } }, - "changedTheChatNameTo": "{username} mudou o nome da conversa a: '{chatname}'", + "changedTheChatNameTo": "{username} mudou o nome da charla a: '{chatname}'", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -339,21 +279,11 @@ "username": {} } }, - "changelog": "Rexistro de cambios", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Mudar contrasinal", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Gardáronse os cambios", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Mudar de servidor de inicio", "@changeTheHomeserver": { "type": "text", @@ -369,47 +299,37 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Mudar de servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Mudar fondo do chat", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Cambia o avatar", "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "channelCorruptedDecryptError": "O cifrado está corrompido", + "channelCorruptedDecryptError": "A cifraxe está estragada", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "chat": "Chat", + "chat": "Conversa", "@chat": { "type": "text", "placeholders": {} }, - "chatBackup": "Copia de apoio do chat", + "chatBackup": "Copia de apoio", "@chatBackup": { "type": "text", "placeholders": {} }, - "chatBackupDescription": "A copia de apoio do chat está protexida cunha chave de seguridade. Pon coidado e non a perdas.", + "chatBackupDescription": "As mensaxes antigas están protexidas cunha chave de recuperación. Pon coidado e non a perdas.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "chatDetails": "Detalles do chat", + "chatDetails": "Detalles da conversa", "@chatDetails": { "type": "text", "placeholders": {} }, - "chats": "Chats", + "chats": "Conversas", "@chats": { "type": "text", "placeholders": {} @@ -419,18 +339,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Escolle un nome de usuaria", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Baleirar arquivo", "@clearArchive": {}, - "clearText": "Eliminar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Pechar", "@close": { "type": "text", @@ -518,17 +428,17 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Comparar e asegurarse de que estas emoticonas concordan no outro dispositivo:", + "compareEmojiMatch": "Compara estes emojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Compara e asegúrate de que os seguintes números concordan cos do outro dispositivo:", + "compareNumbersMatch": "Compara estes números", "@compareNumbersMatch": { "type": "text", "placeholders": {} }, - "configureChat": "Configurar chat", + "configureChat": "Configurar conversa", "@configureChat": { "type": "text", "placeholders": {} @@ -543,11 +453,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Fallou o intento de conexión", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "O contacto foi convidado ao grupo", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -568,11 +473,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Visor de contido", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copiado ao portapapeis", "@copiedToClipboard": { "type": "text", @@ -595,16 +495,6 @@ "error": {} } }, - "couldNotSetAvatar": "Non se estableceu o avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Non se estableceu o nome público", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participantes", "@countParticipants": { "type": "text", @@ -617,38 +507,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Crear unha conta", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} creou a conversa", + "createdTheChat": "💬 {username} creou a conversa", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Crear novo grupo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Novo espazo", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Sinatura-Cruzada desactivada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Sinatura-Cruzada activada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Actualmente activo", "@currentlyActive": { "type": "text", @@ -689,7 +559,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Nivel de permisos por omisión", + "defaultPermissionLevel": "Nivel de permisos por defecto para novas usuarias", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -709,11 +579,6 @@ "type": "text", "placeholders": {} }, - "deny": "Denegar", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Dispositivo", "@device": { "type": "text", @@ -729,46 +594,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "O cifrado só será seguro cando tódolos dispositivos estén verificados.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Chats Directos", + "directChats": "Conversas Directas", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Desbotar imaxe", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Descubrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Descubrir grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "O nome público mudou", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Doar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar e non volver a preguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Descargar ficheiro", "@downloadFile": { "type": "text", @@ -784,21 +619,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Editar permisos do chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Editar nome público", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Editar instancia Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Editar alias da sala", "@editRoomAliases": { "type": "text", @@ -839,27 +664,22 @@ "type": "text", "placeholders": {} }, - "emptyChat": "Chat baleiro", + "emptyChat": "Conversa baleira", "@emptyChat": { "type": "text", "placeholders": {} }, - "enableChatBackup": "Activa a copia de apoio dos chats para non perder o acceso ás conversas.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Activar paquete emote globalmente", "@enableEmotesGlobally": { "type": "text", "placeholders": {} }, - "enableEncryption": "Activar cifrado", + "enableEncryption": "Activar cifraxe", "@enableEncryption": { "type": "text", "placeholders": {} }, - "enableEncryptionWarning": "Non poderás desactivar o cifrado posteriormente, tes certeza?", + "enableEncryptionWarning": "Non poderás desactivar a cifraxe posteriormente, tes certeza?", "@enableEncryptionWarning": { "type": "text", "placeholders": {} @@ -869,26 +689,16 @@ "type": "text", "placeholders": {} }, - "encryption": "Cifrado", + "encryption": "Cifraxe", "@encryption": { "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritmo do cifrado", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "O cifrado non está activado", + "encryptionNotEnabled": "A cifraxe non está activada", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Axustes do cifrado extremo-a-extremo", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} rematou a chamada", "@endedTheCall": { "type": "text", @@ -896,23 +706,11 @@ "senderName": {} } }, - "enterAGroupName": "Escribe un nome para o grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Escribe un enderezo de email", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Escribe o nome para o espazo", - "@enterASpacepName": {}, - "enterAUsername": "Escribe un nome de usuaria", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Escribe o teu servidor de inicio", "@enterYourHomeserver": { "type": "text", @@ -940,11 +738,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Tamaño do ficheiro", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -960,16 +753,6 @@ "type": "text", "placeholders": {} }, - "friday": "Venres", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amizades", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Desde que se una", "@fromJoining": { "type": "text", @@ -990,16 +773,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Descrición do grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Cambiouse a descrición do grupo", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "O grupo é público", "@groupIsPublic": { "type": "text", @@ -1050,11 +823,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Servidor de inicio non compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "É moi ofensivo este contido?", "@howOffensiveIsThisContent": { "type": "text", @@ -1080,16 +848,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Podes ignorar usuarias molestas. Non recibirás ningunha mensaxe nin convites a salas da túa lista personal de usuarias ignoradas.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorar nome de usuaria", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Premín na ligazón", "@iHaveClickedOnLink": { "type": "text", @@ -1105,11 +863,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Email non válido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Convidar contacto", "@inviteContact": { "type": "text", @@ -1127,7 +880,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} convidou a {targetName}", + "invitedUser": "📩 {username} convidou a {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1145,7 +898,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} convidoute a FluffyChat.\n1. instala FluffyChat: https://fluffychat.im \n2. Rexístrate ou conéctate\n3. Abre a ligazón do convite: {link}", + "inviteText": "{username} convidoute a FluffyChat.\n1. Visita fluffychat.im e instala a app\n2. Crea unha conta ou Accede\n3. Abre a ligazón do convite: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1153,39 +906,24 @@ "link": {} } }, - "isDeviceKeyCorrect": "¿É correcta esta chave do dispositivo?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "está escribindo…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} uníuse ao chat", + "joinedTheChat": "👋 {username} uníuse á conversa", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "joinRoom": "Entrar na sala", + "joinRoom": "Unirse á sala", "@joinRoom": { "type": "text", "placeholders": {} }, - "keysCached": "Chaves almacenadas", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Faltan as chaves", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} expulsou a {targetName}", + "kicked": "👞 {username} expulsou a {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1193,7 +931,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} expulsou e vetou a {targetName}", + "kickedAndBanned": "🙅 {username} expulsou e vetou a {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1213,16 +951,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Última IP vista", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Hai moito que non aparece", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Saír", "@leave": { "type": "text", @@ -1282,33 +1010,11 @@ "homeserver": {} } }, - "loginWith": "Conecta con {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Saír", + "logout": "Pechar sesión", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Converter en moderadora", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Converter en administradora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Asegúrate de que o identificador é válido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Cambios de participantes", "@memberChanges": { "type": "text", @@ -1324,44 +1030,27 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Vai ser eliminada a mensaxe para todas as participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderadora", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Luns", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Un evento máis} other{{count} eventos máis}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Acalar chat", + "muteChat": "Acalar conversa", "@muteChat": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para o cifrado extremo-a-extremo.", + "needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para a cifraxe extremo-a-extremo.", "@needPantalaimonWarning": { "type": "text", "placeholders": {} }, - "newChat": "Novo chat", + "newChat": "Nova conversa", "@newChat": { "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nova mensaxe en FluffyChat", + "newMessageInFluffyChat": "💬 Nova mensaxe en FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1386,27 +1075,17 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Polo momento FluffyChat non soporta a activación da Sinatura-Cruzada. Actívaa desde Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sen descrición", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Non hai emotes. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noEncryptionForPublicRooms": "Só podes activar o cifrado tan pronto como a sala non sexa públicamente accesible.", + "noEncryptionForPublicRooms": "Só podes activar a cifraxe tan pronto como a sala non sexa públicamente accesible.", "@noEncryptionForPublicRooms": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Semella que non tes os servizos de google no teu dispositivo. Ben feito! a túa privacidade agradécecho! Para recibir notificacións push en FluffyChat recomendamos usar https://microg.org/ ou https://unifiedpush.org/.", + "noGoogleServicesWarning": "Semella que non tes Firebase Cloud Messaging dispoñible no teu dispositivo. Para recibir notificacións push recomendamos que instales ntfy. Con ntfy ou outro provedor Unified Push podes recibir notificacións push de xeito seguro. Podes descargar ntfy desde a PlayStore ou F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1419,11 +1098,6 @@ "server2": {} } }, - "noMegolmBootstrap": "No seu lugar activa a copia de apoio en liña desde Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ningún", "@none": { "type": "text", @@ -1439,21 +1113,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Non se atoparon salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Non se atoparon salas…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Aínda non atopamos mensaxes.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notificacións", "@notifications": { "type": "text", @@ -1464,18 +1128,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Non soportado na web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seleccionados", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} usuarias están escribindo…", "@numUsersTyping": { "type": "text", @@ -1508,11 +1160,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Copia de apoio En liña das Chaves desactivada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Copia de Apoio en liña das Chaves activada", "@onlineKeyBackupEnabled": { "type": "text", @@ -1543,16 +1190,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Optativo) O teu enderezo de email", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optativo) Nome do grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Ou", "@or": { "type": "text", @@ -1563,11 +1200,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Dispositivos das usuarias participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "frase de paso ou chave de recuperación", "@passphraseOrKey": { "type": "text", @@ -1625,11 +1257,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Escolle un nome de usuaria", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Preme na ligazón do email e segue as instrucións.", "@pleaseClickOnLink": { "type": "text", @@ -1640,16 +1267,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Escribe un ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Escribe a túa chave de seguridade:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Escribe o teu contrasinal", "@pleaseEnterYourPassword": { "type": "text", @@ -1675,26 +1292,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Grupos públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chave pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Salas públicas", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Espazo público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Regras de envío", "@pushRules": { "type": "text", @@ -1744,7 +1346,7 @@ "type": "text", "placeholders": {} }, - "remove": "Eliminar", + "remove": "Quitar", "@remove": { "type": "text", "placeholders": {} @@ -1766,16 +1368,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "Retirar veto no chat", + "unbanFromChat": "Retirar veto na conversa", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "Eliminar mensaxe", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Elimina o avatar", "@removeYourAvatar": { "type": "text", @@ -1806,16 +1403,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Solicitar ler mensaxes antigas", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revogar tódolos permisos", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "A sala foi actualizada", "@roomHasBeenUpgraded": { "type": "text", @@ -1826,53 +1413,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Ficheiro gardado como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Gardar ficheiro", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Gardar ficheiro neste cartafol", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Buscar", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Buscar un chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Seguridade", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Chave de seguridade", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Perdeches a chave de seguridade?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Visto por {username}", "@seenByUser": { "type": "text", @@ -1880,22 +1435,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Visto por {username} e {count} outras}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto por {username} e {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Enviar", "@send": { "type": "text", @@ -1915,11 +1454,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Permitir o envío de informes de fallos con sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Enviar ficheiro", "@sendFile": { "type": "text", @@ -1950,35 +1484,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} enviou un ficheiro", + "sentAFile": "📁 {username} enviou un ficheiro", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} enviou un audio", + "sentAnAudio": "🎤 {username} enviou un audio", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} enviou unha imaxe", + "sentAPicture": "🖼️ {username} enviou unha imaxe", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} enviou un adhesivo", + "sentASticker": "😊 {username} enviou un adhesivo", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} enviou un vídeo", + "sentAVideo": "🎥 {username} enviou un vídeo", "@sentAVideo": { "type": "text", "placeholders": { @@ -1992,21 +1526,6 @@ "senderName": {} } }, - "sentryInfo": "Información sobre privacidade: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesión verificada", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Establecer foto do perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Establecer como alias principal", "@setAsCanonicalAlias": { "type": "text", @@ -2017,11 +1536,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Establecer descrición do grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Establecer ligazón do convite", "@setInvitationLink": { "type": "text", @@ -2064,11 +1578,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Rexistro", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Conexión Unificada SSO", "@singlesignon": { "type": "text", @@ -2079,11 +1588,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Son, vibración, cor LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Código fonte", "@sourceCode": { "type": "text", @@ -2106,11 +1610,6 @@ "senderName": {} } }, - "startYourFirstChat": "Inicia unha conversa! 🙂\n- Toca en 'Novo chat'\n- Escanea o QR dunha amizade\n- Desfruta da conversa", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Estado", "@status": { "type": "text", @@ -2126,11 +1625,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Domingo", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Sincronizando... Agarda.", "@synchronizingPleaseWait": { "type": "text", @@ -2141,21 +1635,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Toca nun dispositivo para verificalo", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Toca para mostrar a imaxe", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toca para mostrar menú", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Non concordan", "@theyDontMatch": { "type": "text", @@ -2166,26 +1645,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "A sala foi arquivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Xoves", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2222,11 +1681,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Martes", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Non dispoñible", "@unavailable": { "type": "text", @@ -2250,7 +1704,7 @@ "type": "text", "placeholders": {} }, - "unknownEncryptionAlgorithm": "Algoritmo de cifrado descoñecido", + "unknownEncryptionAlgorithm": "Algoritmo de cifraxe descoñecido", "@unknownEncryptionAlgorithm": { "type": "text", "placeholders": {} @@ -2262,16 +1716,6 @@ "type": {} } }, - "unknownSessionVerify": "Sesión descoñecida, por favor verifícaa", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Desbloquear copia do chat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Reactivar notificacións", "@unmuteChat": { "type": "text", @@ -2282,25 +1726,13 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 chat non lido} other{{unreadCount} chats non lidos}}", + "unreadChats": "{unreadCount, plural, =1{1 conversa sen ler} other{{unreadCount} conversas sen ler}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 mensaxe non lida} other{{unreadEvents} mensaxes non lidas}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "¿Usar cores compatibles con AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} e {count} máis están escribindo…", "@userAndOthersAreTyping": { "type": "text", @@ -2324,7 +1756,7 @@ "username": {} } }, - "userLeftTheChat": "{username} deixou a conversa", + "userLeftTheChat": "🚪 {username} deixou a conversa", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2336,11 +1768,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Usuaria non verificada", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} enviou un evento {type}", "@userSentUnknownEvent": { "type": "text", @@ -2349,36 +1776,16 @@ "type": {} } }, - "userUnknownVerification": "A usuaria ten un estado de verificación descoñecido", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Usuaria verificada", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Verificado", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sesión verificada correctamente!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verificar", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verificar manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Comezar verificación", "@verifyStart": { "type": "text", @@ -2394,11 +1801,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verificar usuaria", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Chamada de vídeo", "@videoCall": { "type": "text", @@ -2439,7 +1841,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Fondo da conversa", + "wallpaper": "Imaxe de fondo:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2449,21 +1851,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "O cifrado extremo-a-extremo está en Beta! Úsao baixo a túa responsabilidade!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Mércores", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Benvida á mensaxería instantánea más cuquiña da rede Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Enviamosche un email", "@weSentYouAnEmail": { "type": "text", @@ -2484,7 +1871,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Eliminar a copia de apoio do chat e crear unha nova chave de seguridade?", + "wipeChatBackup": "Queres eliminar a copia de apoio da conversa e crear unha nova chave de recuperación?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2509,85 +1896,33 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Estás convidada a este chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Xa non participas desta conversa", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Non podes autoconvidarte", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Foches vetada nesta conversa", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Estanse sincronizando os teus chats…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "O teu nome de usuaria", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "A túa chave pública", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Vas acceder a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Aumentar zoom", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Diminuir zoom", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Eliminouse o chat deste espazo", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "O chat foi engadido a este espazo", + "chatHasBeenAddedToThisSpace": "Engadiuse a conversa a este espazo", "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Engadir ao espazo", "@addToSpace": {}, "scanQrCode": "Escanear código QR", "@scanQrCode": {}, - "typeInInviteLinkManually": "Escribe manualmente a ligazón do convite...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Comparte a túa ligazón de convite", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Simplemente escanea o código QR ou comparte a ligazón do convite se non estades preto.", - "@createNewChatExplaination": {}, "sendOnEnter": "Enter para enviar", "@sendOnEnter": {}, "homeserver": "Servidor de inicio", "@homeserver": {}, "serverRequiresEmail": "O servidor precisa validar o teu enderezo de email para rexistrarte.", "@serverRequiresEmail": {}, - "newUsernameDescription": "O ID da túa conta vai ter o formato @usuaria:nomedoservidor", - "@newUsernameDescription": {}, - "newPasswordDescription": "Para poder recuperar o teu contrasinal debes engadir máis tarde un enderezo de email á túa conta.", - "@newPasswordDescription": {}, "enableMultiAccounts": "(BETA) Activar varias contas neste dispositivo", "@enableMultiAccounts": {}, "addAccount": "Engadir conta", @@ -2596,31 +1931,12 @@ "@oneClientLoggedOut": {}, "link": "Ligazón", "@link": {}, - "setupChatBackup": "Configurar copia de apoio", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Escribo eu a chave", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Configurouse a copia de apoio do chat.", + "yourChatBackupHasBeenSetUp": "Configurouse a copia de apoio da charla.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Para protexer as túas mensaxes creamos unha chave de seguridade para ti.\nGárdaa nun lugar seguro, como nun xestor de contrasinais.", - "@setupChatBackupDescription": {}, "unverified": "Sen verificar", "@unverified": {}, - "yourUserId": "O teu ID:", - "@yourUserId": {}, - "pleaseEnterValidEmail": "Escribe un enderezo de email válido.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Os contrasinais non concordan!", - "@passwordsDoNotMatch": {}, "repeatPassword": "Repite o contrasinal", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Escribe polo menos {min} caracteres.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageInfo": "Info da mensaxe", "@messageInfo": {}, "time": "Hora", @@ -2629,30 +1945,20 @@ "@sender": {}, "openGallery": "Galería pública", "@openGallery": {}, - "removeFromSpaceDescription": "Vas retirar este chat do espazo actual, mais será visible baixo \"Tódolos chats\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Elixe un espazo ao que engadir este chat.", + "addToSpaceDescription": "Elixe un espazo ao que engadir esta conversa.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Conéctate cun click", - "@loginWithOneClick": {}, "messageType": "Tipo de mensaxe", "@messageType": {}, "removeFromSpace": "Retirar do espazo", "@removeFromSpace": {}, "start": "Comezar", "@start": {}, - "setupChatBackupNow": "Configura a copia de apoio do chat", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Para desbloquear a copia do chat, escribe a túa chave de seguridade creada nunha sesión anterior. A chave de seguridade NON é o teu contrasinal.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Garda agora a chave de seguridade", - "@saveTheSecurityKeyNow": {}, "commandHint_discardsession": "Descartar sesión", "@commandHint_discardsession": { "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar o cifrado", + "commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar a cifraxe", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" @@ -2662,7 +1968,7 @@ "type": "text", "description": "Usage hint for the command /clearcache" }, - "commandHint_dm": "Iniciar un chat directo\nUsa --no-encryption para desactivar o cifrado", + "commandHint_dm": "Iniciar unha charla directa\nUsa --no-encryption para desactivar a cifraxe", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2672,10 +1978,6 @@ "type": "text", "placeholders": {} }, - "yourStory": "A túa Historia", - "@yourStory": {}, - "replyHasBeenSent": "Enviouse a resposta", - "@replyHasBeenSent": {}, "videoWithSize": "Vídeo ({size})", "@videoWithSize": { "type": "text", @@ -2683,46 +1985,15 @@ "size": {} } }, - "storyFrom": "Historia do {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Ten en conta que as usuarias poden verse e contactar unhas coas outras na túa historia.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Engadir a historia", - "@addToStory": {}, "publish": "Publicar", "@publish": {}, - "whoCanSeeMyStories": "Quen pode ver as miñas historias?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Retirar subscrición das historias", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "A usuaria non publicou aínda ningunha historia", - "@thisUserHasNotPostedAnythingYet": {}, - "bubbleSize": "Tamaño da burbulla", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Que acontece?", - "@whatIsGoingOn": {}, - "addDescription": "Engadir descrición", - "@addDescription": {}, - "storyPrivacyWarning": "Ten en conta que outras persoas poden verse en contactar entre elas na túa historia. As historias son visibles durante 24 horas pero non hai garantía de que sexan eliminadas en tódolos dispositivos e servidores.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Comprendo", - "@iUnderstand": {}, "dismiss": "Desbotar", "@dismiss": {}, "markAsRead": "Marcar como lido", "@markAsRead": {}, "reportUser": "Denunciar usuaria", "@reportUser": {}, - "openChat": "Abrir Chat", + "openChat": "Abrir Conversa", "@openChat": {}, "voiceCall": "Chamada de voz", "@voiceCall": {}, @@ -2736,12 +2007,6 @@ "@videoCallsBetaWarning": {}, "unsupportedAndroidVersion": "Version de Android non soportada", "@unsupportedAndroidVersion": {}, - "matrixWidgets": "Widgets de Matrix", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Por agora non se poden editar os widgets e integracións.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Editar widgets e integracións", - "@editIntegrations": {}, "reactedWith": "{sender} reaccionou con {reaction}", "@reactedWith": { "type": "text", @@ -2752,8 +2017,6 @@ }, "pinMessage": "Fixar na sala", "@pinMessage": {}, - "pinnedEventsError": "Erro ao cargar mensaxes fixadas", - "@pinnedEventsError": {}, "confirmEventUnpin": "Tes a certeza de querer desafixar o evento?", "@confirmEventUnpin": {}, "experimentalVideoCalls": "Chamadas de vídeo en probas", @@ -2791,24 +2054,17 @@ "@widgetEtherpad": {}, "errorAddingWidget": "Erro ao engadir o widget.", "@errorAddingWidget": {}, - "editWidgets": "Editar widgets", - "@editWidgets": {}, "editBundlesForAccount": "Editar os feixes desta conta", "@editBundlesForAccount": {}, "addToBundle": "Engadir ao feixe", "@addToBundle": {}, "removeFromBundle": "Eliminar deste feixe", "@removeFromBundle": {}, - "separateChatTypes": "Separar Conversas directas, Grupos e Espazos", + "separateChatTypes": "Separar Conversas directas e Grupos", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Mostrar os Chats Directos nos Espazos", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "youRejectedTheInvitation": "Rexeitaches o convite", "@youRejectedTheInvitation": {}, "youBannedUser": "Vetaches a {user}", @@ -2817,7 +2073,7 @@ "user": {} } }, - "youInvitedBy": "{user} convidoute", + "youInvitedBy": "📩 {user} convidoute", "@youInvitedBy": { "placeholders": { "user": {} @@ -2825,7 +2081,7 @@ }, "youJoinedTheChat": "Unícheste á conversa", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Aceptaches o convite", + "youAcceptedTheInvitation": "👍 Aceptaches o convite", "@youAcceptedTheInvitation": {}, "youHaveWithdrawnTheInvitationFor": "Retiraches o convite para {user}", "@youHaveWithdrawnTheInvitationFor": { @@ -2833,19 +2089,19 @@ "user": {} } }, - "youInvitedUser": "Convidaches a {user}", + "youInvitedUser": "📩 Convidaches a {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "Expulsaches a {user}", + "youKicked": "👞 Expulsaches a {user}", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Expulsaches e vetaches a {user}", + "youKickedAndBanned": "🙅 Expulsaches e vetaches a {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2857,8 +2113,786 @@ "user": {} } }, - "showSpaces": "Mostrar lista de espazos", - "@showSpaces": {}, - "noEmailWarning": "Escribe un enderezo de email válido. Doutro xeito non poderás restablecer o contrasinal. Se non queres, toca outra vez no botón para continuar.", - "@noEmailWarning": {} + "saveKeyManuallyDescription": "Garda esta chave manualmente usando o sistema para compartir do dispositivo ou portapapeis.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Gardar en Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Gardar en Apple KeyChain", + "@storeInAppleKeyChain": {}, + "recoveryKeyLost": "Perdeches a chave de recuperación?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKey": "Escribe a túa chave de recuperación:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Chave de recuperación", + "@recoveryKey": {}, + "storeSecurlyOnThisDevice": "Gardar de xeito seguro no dispositivo", + "@storeSecurlyOnThisDevice": {}, + "pleaseEnterRecoveryKeyDescription": "Para desbloquear as mensaxes antigas, escribe a chave de recuperación creada nunha sesión existente. A chave de recuperación NON é o teu contrasinal.", + "@pleaseEnterRecoveryKeyDescription": {}, + "users": "Usuarias", + "@users": {}, + "storeInSecureStorageDescription": "Gardar a chave de recuperación na almacenaxe segura deste dispositivo.", + "@storeInSecureStorageDescription": {}, + "countFiles": "{count} ficheiros", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "unlockOldMessages": "Desbloquear mensaxes antigas", + "@unlockOldMessages": {}, + "dehydrateTorLong": "Para usuarias de TOR, é recomendable exportar a sesión antes de pechar a xanela.", + "@dehydrateTorLong": {}, + "hydrateTor": "Usuarias TOR: Importar a sesión exportada", + "@hydrateTor": {}, + "hydrateTorLong": "Exportaches a túa sesión a última vez en TOR? Importaa rápidamente e segue conversando.", + "@hydrateTorLong": {}, + "hydrate": "Restablecer desde copia de apoio", + "@hydrate": {}, + "dehydrateWarning": "Esta acción non é reversible. Pon coidado en gardar o ficheiro de apoio.", + "@dehydrateWarning": {}, + "dehydrate": "Exportar sesión e eliminar dispositivo", + "@dehydrate": {}, + "dehydrateTor": "Usuarias TOR: Exportar sesión", + "@dehydrateTor": {}, + "indexedDbErrorTitle": "Problemas no modo privado", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "A almacenaxe de mensaxes non está activada por defecto no modo privado.\nMira en\n- about:config\n- establece dom.indexedDB.privateBrowsing.enabled como true\nSe non, non é posible executar FluffyChat.", + "@indexedDbErrorLong": {}, + "user": "Usuaria", + "@user": {}, + "custom": "Personal", + "@custom": {}, + "confirmMatrixId": "Confirma o teu ID Matrix para poder eliminar a conta.", + "@confirmMatrixId": {}, + "supposedMxid": "Debería ser {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasdm": "Marcar como sala de mensaxe directa para o ID Matrix indicado", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marcar como grupo", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Por que non podo ler esta mensaxe?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Pode ser que a mensaxe fose enviada antes de que ti accedeses á túa conta neste dispositivo.\n\nTamén é posible que a remitente non validase o teu dispositivo ou tamén que algo fallase na conexión a internet.\n\nPodes ler a mensaxe noutro dispositivo? Entón podes transferila desde el! Vai a Axustes > Dispositivos e comproba que tes tódolos dispositivos verificados. Entón cando abras a sala a próxima vez a sincronización realizarase e as chaves transmitiranse automáticamente.\n\nNon desexas perder as chaves cando pechas sesión ou cambias de dispositivo? Comproba nos axustes que activaches a copia de apoio das conversas.", + "@noKeyForThisMessage": {}, + "appearOnTop": "Aparecer arriba", + "@appearOnTop": {}, + "otherCallingPermissions": "Micrófono, cámara e outros permisos para FluffyChat", + "@otherCallingPermissions": {}, + "newGroup": "Novo grupo", + "@newGroup": {}, + "newSpace": "Novo espazo", + "@newSpace": {}, + "foregroundServiceRunning": "Esta notificación aparece cando se está a executar o servizo en segundo plano.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "compartición da pantalla", + "@screenSharingTitle": {}, + "callingPermissions": "Permisos de chamada", + "@callingPermissions": {}, + "callingAccount": "Conta que chama", + "@callingAccount": {}, + "callingAccountDetails": "Permítelle a FluffyChat usar a app de telefonía nativa de android.", + "@callingAccountDetails": {}, + "appearOnTopDetails": "Permítelle á app aparecer por enriba (non é preciso se xa configuraches FluffyChat como unha conta para chamadas)", + "@appearOnTopDetails": {}, + "enterSpace": "Entrar no espazo", + "@enterSpace": {}, + "enterRoom": "Entrar na sala", + "@enterRoom": {}, + "allSpaces": "Todos os espazos", + "@allSpaces": {}, + "screenSharingDetail": "Estás a compartir a túa pantalla en FluffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} conversas", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Agochar os eventos de menor relevancia", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Non mostrar outra vez", + "@doNotShowAgain": {}, + "commandHint_googly": "Envía uns ollos desos grandes", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} enviouche uns ollos grandes", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} mándache un achuche", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_cuddle": "Envía un agarimo", + "@commandHint_cuddle": {}, + "commandHint_hug": "Envía un abrazo", + "@commandHint_hug": {}, + "hugContent": "{senderName} abrázate", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "encryptThisChat": "Cifrar esta conversa", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Por razóns de seguridade non podes desactivar a cifraxe dunha conversa onde foi activada previamente.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Lamentámolo... iso non é posible", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Chaves do dispositivo:", + "@deviceKeys": {}, + "newSpaceDescription": "Os Espazos permítenche consolidar as túas conversas e construir comunidades públicas ou privadas.", + "@newSpaceDescription": {}, + "startFirstChat": "Abre a túa primeira conversa", + "@startFirstChat": {}, + "wasDirectChatDisplayName": "Conversa baleira (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "reopenChat": "Reabrir conversa", + "@reopenChat": {}, + "noOtherDevicesFound": "Non se atopan outros dispositivos", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Aviso! Se non activas a copia de apoio da conversa, perderás o acceso ás túas mensaxes cifradas. É moi recomendable activar a copia de apoio da conversa antes de pechar a sesión.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Non se puido enviar! O servidor só permite anexos que non superen {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Gardouse o ficheiro en {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Ir á última mensaxe lida", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Lin ate aquí", + "@readUpToHere": {}, + "openLinkInBrowser": "Abrir ligazón no navegador", + "@openLinkInBrowser": {}, + "jump": "Ir alá", + "@jump": {}, + "report": "informar", + "@report": {}, + "allRooms": "Todas as Conversas en grupo", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 Vaia! Algo fallou. Se queres, podes informar do problema ás persoas desenvolvedoras.", + "@reportErrorDescription": {}, + "signInWithPassword": "Accede con contrasinal", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Inténtao máis tarde ou elixe un servidor diferente.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Accede con {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Non é un ficheiro de imaxe.", + "@notAnImage": {}, + "importNow": "Importar agora", + "@importNow": {}, + "importEmojis": "Importar Emojis", + "@importEmojis": {}, + "importFromZipFile": "Importar desde ficheiro .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Exportar paquete Emote como .zip", + "@exportEmotePack": {}, + "replace": "Substituír", + "@replace": {}, + "sendTypingNotifications": "Permitir ver que estás escribindo", + "@sendTypingNotifications": {}, + "createGroup": "Crear grupo", + "@createGroup": {}, + "messagesStyle": "Mensaxes:", + "@messagesStyle": {}, + "profileNotFound": "Non se atopa a usuaria no servidor. Pode que haxa un problema coa conexión ou que a usuaria non exista.", + "@profileNotFound": {}, + "shareInviteLink": "Comparte ligazón de convite", + "@shareInviteLink": {}, + "setColorTheme": "Cor do decorado:", + "@setColorTheme": {}, + "setTheme": "Establecer decorado:", + "@setTheme": {}, + "inviteContactToGroupQuestion": "Queres convidar a {contact} para que se una á conversa \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Intentar outra vez", + "@tryAgain": {}, + "optionalRedactReason": "(Optativo) Razón para editar a mensaxe...", + "@optionalRedactReason": {}, + "redactedBy": "Editada por {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedByBecause": "Editada por {username} debido a: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "redactMessageDescription": "A mensaxe vai ser editada para todas as participantes na conversa. Non ten volta atrás.", + "@redactMessageDescription": {}, + "invite": "Convidar", + "@invite": {}, + "addChatDescription": "Engadir descrición da conversa...", + "@addChatDescription": {}, + "chatPermissions": "Permisos da conversa", + "@chatPermissions": {}, + "chatDescription": "Descrición da conversa", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Cambiou a descrición da conversa", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Aínda non se escribeu a descrición da conversa.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Nome de servidor non válido", + "@invalidServerName": {}, + "directChat": "Conversa Directa", + "@directChat": {}, + "setChatDescription": "Escribir descrición da conversa", + "@setChatDescription": {}, + "inviteGroupChat": "📨 Convidar a conversa en grupo", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Convidar a conversa privada", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Os emotes usados recentemente aparecerán aquí...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "banUserDescription": "Vaise vetar a usuaria na conversa e non poderá entrar outra vez ata que se retire o veto.", + "@banUserDescription": {}, + "removeDevicesDescription": "Vas pechar a sesión neste dispositivo e xa non poderás recibir mensaxes nel.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "A usuaria vai poder entrar outra vez na conversa se quere.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Non están dispoñibles as notificacións push", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Cando convirtas a esta usuaria en admin non poderás desfacer a acción xa que terá os mesmos permisos ca ti.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Vaise mover a charla ao arquivo. Outras usuarias poderán ver que saíches da conversa.", + "@archiveRoomDescription": {}, + "invalidInput": "Contido non válido!", + "@invalidInput": {}, + "hasKnocked": "🚪 {user} petou na porta", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "wrongPinEntered": "PIN incorrecto! Inténtao outra vez en {seconds} segundos...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "learnMore": "Saber máis", + "@learnMore": {}, + "roomUpgradeDescription": "Vaise recrear a charla coa nova versión da sala. Todas as participantes recibirán unha notificación para que cambien á nova charla. Podes ler máis información acerca das versións das salas en https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Escribe un número maior de cero", + "@pleaseEnterANumber": {}, + "kickUserDescription": "A usuaria foi expulsada pero non vetada. En conversas públicas a usuaria pode volver cando queira.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "Crear un grupo e convidar usuarias", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "O grupo pódese atopar ao buscar", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Lamentamos non atopar ningunha usuaria con \"{query}\". Comproba se está ben escrito.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "yourGlobalUserIdIs": "O teu ID-usuaria global é: ", + "@yourGlobalUserIdIs": {}, + "groupName": "Nome do grupo", + "@groupName": {}, + "searchChatsRooms": "Buscar #conversas, @usuarias...", + "@searchChatsRooms": {}, + "startConversation": "Iniciar conversa", + "@startConversation": {}, + "commandHint_sendraw": "Enviar json sen editar", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Desculpa... non semella ser o xeito correcto de recuperar a chave.", + "@wrongRecoveryKey": {}, + "blockListDescription": "Podes bloquear usuarias que che molesten. Non recibirás mensaxes nin convites para salas procedentes das usuarias da túa lista persoal de bloqueo.", + "@blockListDescription": {}, + "blockedUsers": "Usuarias bloqueadas", + "@blockedUsers": {}, + "block": "Bloquear", + "@block": {}, + "blockUsername": "Ignorar identificador", + "@blockUsername": {}, + "thisDevice": "Este dispositivo:", + "@thisDevice": {}, + "publicSpaces": "Espazos públicos", + "@publicSpaces": {}, + "passwordIsWrong": "O contrasinal escrito non é correcto", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Escribe o contrasinal actual", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Ligazón pública", + "@publicLink": {}, + "nothingFound": "Non atopamos nada...", + "@nothingFound": {}, + "decline": "Desbotar", + "@decline": {}, + "newPassword": "Novo contrasinal", + "@newPassword": {}, + "passwordsDoNotMatch": "Os contrasinais non concordan", + "@passwordsDoNotMatch": {}, + "subspace": "Subespazo", + "@subspace": {}, + "select": "Escolle", + "@select": {}, + "pleaseChooseAStrongPassword": "Elixe un contrasinal forte", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Engadir charla ou sub espazo", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Deixa baleiro para limpar o teu estado.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Únete ao espazo", + "@joinSpace": {}, + "searchForUsers": "Buscar @persoas...", + "@searchForUsers": {}, + "databaseMigrationTitle": "Base de datos optimizada", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Agarda, podería levarnos un pouco.", + "@databaseMigrationBody": {}, + "databaseBuildErrorBody": "Non se puido crear a base de datos SQlite. A app intentará usar a base de datos clásica. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "Houbo un fallo ao iniciar a app", + "@initAppError": {}, + "sessionLostBody": "Estragouse a túa sesión. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "A app vai intentar restablecer a sesión desde a copia de apoio. Por favor informa deste erro ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "youInvitedToBy": "📩 Convidáronte cunha ligazón a:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "transparent": "Transparente", + "@transparent": {}, + "sendReadReceipts": "Enviar confirmación de lectura", + "@sendReadReceipts": {}, + "sendReadReceiptsDescription": "Outras participantes na conversa poden ver cando liches unha mensaxe.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Mensaxes con formato", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 Verificar outro dispositivo", + "@verifyOtherDevice": {}, + "verifyOtherUser": "🔐 Verificar outra usuaria", + "@verifyOtherUser": {}, + "verifyOtherDeviceDescription": "Ao verificar outro dispositivo estás compartindo as chaves, aumentando a túa seguridade 💪. Ao iniciar a verificación aparecerá unha xanela emerxente nos dous dispositivos. Nesa xanela verás varios emojis ou números que tes que comparar entre eles. O mellor xeito de facelo é ter os dous dispositivos contigo cando inicias o proceso de verificación. 🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} desbotou a verificación da chave", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} xa pode verificar a chave", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "forwardMessageTo": "Reenviar a mensaxe a {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendTypingNotificationsDescription": "As outras participantes da conversa poden ver cando estás a escribir unha mensaxe.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Mostrar texto enriquecido nas mensaxes como letra grosa usando markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUserDescription": "Se verificas a outra usuaria, podes ter a certeza de que sabes con quen estás a conversar. 💪\n\nAo iniciar a verificación, ti mais a outra usuaria veredes unha xanela emerxente na app onde aparecerán varios emojis ou números que teredes que comparar entre vós.\n\nO mellor xeito de facelo é en persoa o cunha chamada de vídeo. 👭", + "@verifyOtherUserDescription": {}, + "requestedKeyVerification": "{sender} solicitou verificar a chave", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "acceptedKeyVerification": "{sender} aceptou a verificación da chave", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} completou a verificación da chave", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} comezou coa verificación da chave", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presenceStyle": "Presenza:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "hidePresences": "Agochar Lista de estados?", + "@hidePresences": {}, + "presencesToggle": "Mostra mensaxes de estado de outras usuarias", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "incomingMessages": "Mensaxes recibidas", + "@incomingMessages": {}, + "stickers": "Adhesivos", + "@stickers": {}, + "discover": "Descubrir", + "@discover": {}, + "commandHint_ignore": "Ignorar o ID matrix indicado", + "@commandHint_ignore": {}, + "commandHint_unignore": "Non ignorar o ID matrix indicado", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} charlas sen ler", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "Nesta plataforma non temos soporte para cifrar a base de datos", + "@noDatabaseEncryption": {}, + "accessAndVisibility": "Acceso e Visibilidade", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Quen pode unirse a esta charla e de que xeito e como poden atopala.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Emojis personais e adhesivos", + "@customEmojisAndStickers": {}, + "calls": "Chamadas", + "@calls": {}, + "hideRedactedMessages": "Agochar mensaxes editadas", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Se alguén corrixe unha mensaxe entón esta xa non será visible na charla.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Agochar formatos de mensaxe non válidos ou descoñecidos", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Agochar cambios dos membros nas charlas públicas", + "@hideMemberChangesInPublicChats": {}, + "notifyMeFor": "Notificarme sobre", + "@notifyMeFor": {}, + "hideMemberChangesInPublicChatsBody": "Non mostrar na cronoloxía se alguén se une ou deixa unha conversa pública, para mellorar a lexibilidade.", + "@hideMemberChangesInPublicChatsBody": {}, + "usersMustKnock": "As usuarias teñen que pedir entrar", + "@usersMustKnock": {}, + "userWouldLikeToChangeTheChat": "{user} quere unirse á charla.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "knocking": "A solicitar", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "A charla pode ser atopada ao buscar en {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "createNewAddress": "Crear novos enderezos", + "@createNewAddress": {}, + "appLockDescription": "Bloquear a app cun código PIN cando non a uses", + "@appLockDescription": {}, + "globalChatId": "ID Global da charla", + "@globalChatId": {}, + "customEmojisAndStickersBody": "Engade ou comparte emojis personais e adhesivos que poden usarse nas charlas.", + "@customEmojisAndStickersBody": {}, + "overview": "Vista xeral", + "@overview": {}, + "passwordRecoverySettings": "Axustes de recuperación do contrasinal", + "@passwordRecoverySettings": {}, + "noPublicLinkHasBeenCreatedYet": "Aínda non se creou unha ligazón pública", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Solicitar acceso", + "@knock": {}, + "noOneCanJoin": "Ninguén pode unirse", + "@noOneCanJoin": {}, + "thereAreCountUsersBlocked": "Agora mesmo hai {count} usuarias bloqueadas.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "publicChatAddresses": "Enderezos públicos da charla", + "@publicChatAddresses": {}, + "userRole": "Rol da usuaria", + "@userRole": {}, + "minimumPowerLevel": "{level} é o nivel mínimo de responsabilidade.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchIn": "Buscar na conversa \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Buscar máis...", + "@searchMore": {}, + "gallery": "Galería", + "@gallery": {}, + "files": "Ficheiros", + "@files": {}, + "knockRestricted": "Peta á porta", + "@knockRestricted": {}, + "restricted": "Non accesible", + "@restricted": {}, + "swipeRightToLeftToReply": "Despraza hacia a esquerda para responder", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "falso", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "Non se atopan máis charlas…", + "@noMoreChatsFound": {}, + "joinedChats": "Charlas nas que participas", + "@joinedChats": {}, + "countChatsAndCountParticipants": "{chats} charlas e {participants} participantes", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "unread": "Sen ler", + "@unread": {}, + "space": "Espazo", + "@space": {}, + "spaces": "Espazos", + "@spaces": {}, + "goToSpace": "Ir ao espazo: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Marcar como non lido", + "@markAsUnread": {}, + "userLevel": "{level} - Usuaria", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderadora", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Administradora", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Cambiar os axustes xerais da charla", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Convidar a outras usuarias a esta charla", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Cambiar os permisos na charla", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Cambiar a visibilidade do historial da charla", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Cambiar o enderezo público principal da charla", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Enviar notificacións a @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Cambiar a descrición da charla", + "@changeTheDescriptionOfTheGroup": {}, + "invitedBy": "📩 Convidada por {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "changelog": "Novidades na versión", + "@changelog": {}, + "chatPermissionsDescription": "Define que nivel de permisos son necesarios para realizar certas accións nesta charla. Os niveis de permiso 0, 50 e 100 normalmente representan, usuarias, moderadoras e administradoras, pero son posibles outras escalas.", + "@chatPermissionsDescription": {}, + "updateInstalled": "🎉 Instalouse a actualización a {version}!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "sendCanceled": "Cancelouse o envío", + "@sendCanceled": {}, + "noChatsFoundHere": "Sen charlas por aquí. Comeza unha nova conversa con alguén premendo no botón de abaixo. ⤵️", + "@noChatsFoundHere": {}, + "discoverHomeservers": "Atopar servidores", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Que é un servidor de inicio?", + "@whatIsAHomeserver": {}, + "loginWithMatrixId": "Acceder co ID-Matrix", + "@loginWithMatrixId": {}, + "homeserverDescription": "Todos os teus datos quedan gardados no servidor de inicio, igual que co teu provedor de correo electrónico. Podes elexir o servidor que queres usar e poderás comunicarte con todos os demais. Aprende máis en https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Non semella ser un servidor de inicio compatible. É o URL correcto?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Calculando o tamaño do ficheiro…", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Preparando o envío…", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Enviando o anexo…", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Creando miniatura do vídeo…", + "@generatingVideoThumbnail": {}, + "compressVideo": "Comprimindo o vídeo…", + "@compressVideo": {}, + "serverLimitReached": "Acadouse o límite do servidor! Agarda {seconds} segundos…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "sendingAttachmentCountOfCount": "Enviando o anexo {index} de {length}…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Un dos teus dispositivos non está verificado", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nota: Cando conectas todos os teus dispositivos á copia de apoio da conversa quedan verificados automaticamente.", + "@noticeChatBackupDeviceVerification": {}, + "blur": "Néboa:", + "@blur": {}, + "opacity": "Opacidade:", + "@opacity": {}, + "contactServerSecurity": "Contacto con Seguridade do servidor", + "@contactServerSecurity": {}, + "aboutHomeserver": "Sobre {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "welcomeText": "Ola! 👋 Isto é FluffyChat. Podes iniciar sesión en calquera servidor compatible con https://matrix.org. Poderás conversar con calquera. Unha enorme rede de mensaxería descentralizada!", + "@welcomeText": {}, + "setWallpaper": "Establecer fondo", + "@setWallpaper": {}, + "manageAccount": "Xestionar conta", + "@manageAccount": {}, + "noContactInformationProvided": "O servidor non proporciona información de contacto válida", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Contacto con Admin do servidor", + "@contactServerAdmin": {}, + "supportPage": "Páxina de axuda", + "@supportPage": {}, + "serverInformation": "Información do servidor:", + "@serverInformation": {}, + "name": "Nome", + "@name": {}, + "version": "Versión", + "@version": {}, + "website": "Páxina web", + "@website": {}, + "continueText": "Continuar", + "@continueText": {}, + "compressBeforeSending": "Comprimir antes de enviar", + "@compressBeforeSending": {}, + "sendUncompressed": "Enviar sen comprimir", + "@sendUncompressed": {}, + "italicText": "Cursiva", + "@italicText": {}, + "strikeThrough": "Riscar", + "@strikeThrough": {}, + "pleaseFillOut": "Por favor completa", + "@pleaseFillOut": {}, + "invalidUrl": "URL non válido", + "@invalidUrl": {}, + "boldText": "Resaltar texto", + "@boldText": {}, + "addLink": "Engadir ligazón", + "@addLink": {}, + "unableToJoinChat": "Non se puido acceder. Pode que a outra parte xa pechase a conversa.", + "@unableToJoinChat": {}, + "sendImages": "Enviar {count} imaxe", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Comprimir", + "@compress": {} } diff --git a/assets/l10n/intl_he.arb b/assets/l10n/intl_he.arb index 9b24d928c4..d33fc8af44 100644 --- a/assets/l10n/intl_he.arb +++ b/assets/l10n/intl_he.arb @@ -22,11 +22,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "פרטי חשבון", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} הפעיל הצפנה מקצה לקצה", "@activatedEndToEndEncryption": { "type": "text", @@ -34,11 +29,6 @@ "username": {} } }, - "addGroupDescription": "הוספת תיאור קבוצה", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "מנהל", "@admin": { "type": "text", @@ -49,11 +39,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "כבר יש לך חשבון?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} ענה לשיחה", "@answeredTheCall": { "type": "text", @@ -71,11 +56,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "חדר בארכיון", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "האם משתמשים אורחים מורשים להצטרף", "@areGuestsAllowedToJoin": { "type": "text", @@ -86,21 +66,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "אנא הזן את ביטוי הסיסמה המאובטח שלך או מפתח שחזור כדי לשמור את המפתחות במטמון.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "כדי שתוכל לחתום על משתמש אחר , הזן את הסיסמה שלך או את מפתח השחזור.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "אנא הזן את משפט הסיסמה המאובטח שלך או מפתח השחזור כדי לאמת את ההפעלה שלך.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "לקבל בקשת אימות זו מ- {username}?", "@askVerificationRequest": { "type": "text", @@ -108,11 +78,6 @@ "username": {} } }, - "authentication": "אימות", - "@authentication": { - "type": "text", - "placeholders": {} - }, "changePassword": "שנה סיסמא", "@changePassword": { "type": "text", @@ -128,13 +93,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAtLeastChars": "אנא כתוב לפחות {min} תווים", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "addEmail": "הוסף מייל", "@addEmail": { "type": "text", @@ -155,12 +113,7 @@ "type": "text", "placeholders": {} }, - "avatarHasBeenChanged": "האווטאר השתנה", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "שלח וכנס", + "sendOnEnter": "שלח בכניסה", "@sendOnEnter": {}, "badServerLoginTypesException": "שרת הבית תומך בסוגי הכניסה:\n{serverVersions}\nאבל אפליקציה זו תומכת רק ב:\n{supportedVersions}", "@badServerLoginTypesException": { @@ -185,11 +138,6 @@ "username": {} } }, - "changeWallpaper": "שנה טפט", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changedTheChatNameTo": "{username} שינה את שם הצ'אט ל: '{chatname}'", "@changedTheChatNameTo": { "type": "text", @@ -205,43 +153,19 @@ "username": {} } }, - "passwordsDoNotMatch": "הסיסמאות לא תואמות!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "אנא כתוב כתובת אימייל תקינה.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "כתוב שוב את הסיסמה", "@repeatPassword": {}, - "addNewFriend": "הוסף חבר חדש", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "areYouSureYouWantToLogout": "האם אתה בטוח שברצונך לצאת?", "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "changelog": "יומן שינויים", - "@changelog": { - "type": "text", - "placeholders": {} - }, "chat": "צ׳אט", "@chat": { "type": "text", "placeholders": {} }, - "audioPlayerPause": "השהה", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "הפעל", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "הפעל אוטומטית מדבקות ואמוטים מונפשים", + "autoplayImages": "הפעל אוטומטית מדבקות ואנימציות מונפשים", "@autoplayImages": { "type": "text", "placeholder": {} @@ -254,7 +178,7 @@ "supportedVersions": {} } }, - "banFromChat": "חסום מצ'אט", + "banFromChat": "צאט חסום", "@banFromChat": { "type": "text", "placeholders": {} @@ -282,11 +206,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "מפתחות מאוחסנים במטמון", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cantOpenUri": "לא ניתן לפתוח את ה-URI {uri}", "@cantOpenUri": { "type": "text", @@ -373,11 +292,6 @@ "username": {} } }, - "changesHaveBeenSaved": "השינויים נשמרו", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "שנה את שרת הבית", "@changeTheHomeserver": { "type": "text", @@ -393,11 +307,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "שנה את השרת", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "שינוי האווטאר שלך", "@changeYourAvatar": { "type": "text", @@ -408,10 +317,6 @@ "type": "text", "placeholders": {} }, - "yourUserId": "מזהה המשתמש שלך:", - "@yourUserId": {}, - "iWroteDownTheKey": "רשמתי את המפתח", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "גיבוי הצ'אט שלך הוגדר.", "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "גיבוי צ'אט", @@ -419,8 +324,6 @@ "type": "text", "placeholders": {} }, - "setupChatBackup": "הגדר גיבוי צ'אט", - "@setupChatBackup": {}, "commandHint_ban": "חסום את המשתמש הנתון מהחדר הזה", "@commandHint_ban": { "type": "text", @@ -476,8 +379,6 @@ "type": "text", "description": "Usage hint for the command /me" }, - "setupChatBackupDescription": "כדי להגן על ההודעות שלך, יצרנו מפתח אבטחה עבורך.\nאנא שמור אותו במקום בטוח, כגון מנהל סיסמאות.", - "@setupChatBackupDescription": {}, "chatDetails": "פרטי צ'אט", "@chatDetails": { "type": "text", @@ -490,11 +391,6 @@ }, "chatHasBeenAddedToThisSpace": "צ'אט נוסף למרחב הזה", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "הצ'אט הוסר מהמרחב הזה", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "צ'אטים", "@chats": { "type": "text", @@ -505,18 +401,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "בחר שם משתמש", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "נקה ארכיון", "@clearArchive": {}, - "clearText": "נקה טקסט", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "סגור", "@close": { "type": "text", @@ -532,7 +418,7 @@ "type": "text", "description": "Usage hint for the command /myroomnick" }, - "addToSpace": "הוסף לספייס", + "addToSpace": "הוסף לחלל", "@addToSpace": {}, "commandHint_unban": "בטל את החסימה של המשתמש הנתון מהחדר הזה", "@commandHint_unban": { @@ -551,11 +437,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "צור חשבון עכשיו", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} יצר את הצ'אט", "@createdTheChat": { "type": "text", @@ -563,11 +444,6 @@ "username": {} } }, - "crossSigningEnabled": "חתימה צולבת על", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "פעיל כעת", "@currentlyActive": { "type": "text", @@ -609,11 +485,6 @@ "type": "text", "placeholders": {} }, - "deny": "דחה", - "@deny": { - "type": "text", - "placeholders": {} - }, "deviceId": "מזהה מכשיר", "@deviceId": { "type": "text", @@ -624,31 +495,11 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "ההצפנה מאובטחת רק כאשר כל המכשירים אומתו.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "צ'אטים ישירים", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "התעלם מתמונה", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "לגלות", - "@discover": { - "type": "text", - "placeholders": {} - }, - "donate": "תרם", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "הורד קובץ", "@downloadFile": { "type": "text", @@ -659,21 +510,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "ערוך הרשאות צ'אט", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "ערוך את שם התצוגה", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "ערוך מופע Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "ערוך כינויים לחדר", "@editRoomAliases": { "type": "text", @@ -689,38 +530,16 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "אפשר את גיבוי הצ'אט כדי שלעולם לא תאבד גישה לצ'אטים שלך.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "encrypted": "מוצפן", "@encrypted": { "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "אלגוריתם הצפנה", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "הגדרות הצפנה מקצה לקצה", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "הזן שם קבוצה", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "הזן כתובת דואר אלקטרוני", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "הזן שם חלל", - "@enterASpacepName": {}, "enterYourHomeserver": "הזן את שרת הבית שלך", "@enterYourHomeserver": { "type": "text", @@ -736,11 +555,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "גודל הקובץ", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -756,16 +570,6 @@ "type": "text", "placeholders": {} }, - "friday": "יום שישי", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "חברים", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "מהצטרפות", "@fromJoining": { "type": "text", @@ -781,16 +585,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "תיאור קבוצה", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "תיאור הקבוצה השתנה", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "הקבוצה ציבורית", "@groupIsPublic": { "type": "text", @@ -833,11 +627,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "דואר אלקטרוני לא חוקי", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "הזמן איש קשר", "@inviteContact": { "type": "text", @@ -874,11 +663,6 @@ "link": {} } }, - "isDeviceKeyCorrect": "האם מפתח המכשיר נכון?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "מקליד/ה…", "@isTyping": { "type": "text", @@ -896,16 +680,6 @@ "type": "text", "placeholders": {} }, - "keysCached": "המפתחות נשמרים במטמון", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "המפתחות חסרים", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, "kicked": "{username} בעט ב {targetName}", "@kicked": { "type": "text", @@ -934,16 +708,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "IP שנראה לאחרונה", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "נראה לפני זמן רב", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leftTheChat": "עזב את הצ'אט", "@leftTheChat": { "type": "text", @@ -989,11 +753,6 @@ "type": "text", "description": "Usage hint for the command /react" }, - "createNewGroup": "צור קבוצה חדשה", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "containsUserName": "מכיל שם משתמש", "@containsUserName": { "type": "text", @@ -1004,16 +763,6 @@ "type": "text", "placeholders": {} }, - "crossSigningDisabled": "חתימה צולבת", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "בטל ואל תשאל שוב", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "enableEncryption": "אפשר הצפנה", "@enableEncryption": { "type": "text", @@ -1050,16 +799,6 @@ "type": "text", "placeholders": {} }, - "enterAUsername": "הזן שם משתמש", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "גלה קבוצות", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "שם התצוגה השתנה", "@displaynameHasBeenChanged": { "type": "text", @@ -1146,16 +885,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "באפשרותך להתעלם ממשתמשים שמפריעים לך. לא תוכל לקבל הודעות או הזמנות לחדר מהמשתמשים ברשימת ההתעלם האישית שלך.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "התעלם משם משתמש", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "לחצתי על הקישור", "@iHaveClickedOnLink": { "type": "text", @@ -1176,11 +905,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "מציג התוכן", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "delete": "מחיקה", "@delete": { "type": "text", @@ -1206,11 +930,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "ניסיון החיבור נכשל", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "איש הקשר הוזמן לקבוצה", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -1253,16 +972,6 @@ "type": "text", "placeholders": {} }, - "couldNotSetAvatar": "לא היתה אפשרות להגדיר אווטאר", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "לא היתה אפשרות להגדיר שם תצוגה", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "copyToClipboard": "העתק ללוח", "@copyToClipboard": { "type": "text", @@ -1280,11 +989,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "שרת הבית אינו תואם", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "עד כמה התוכן הזה פוגעני?", "@howOffensiveIsThisContent": { "type": "text", @@ -1335,54 +1039,21 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat אינו תומך כרגע בהפעלת חתימה צולבת. אנא הפעל אותו מתוך Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noEncryptionForPublicRooms": "אתה יכול להפעיל הצפנה רק כשהחדר כבר לא נגיש לציבור.", "@noEncryptionForPublicRooms": { "type": "text", "placeholders": {} }, - "createNewChatExplaination": "פשוט סרקו את קוד ה-QR או שתפו את קישור ההזמנה שלכם אם אינכם אחד ליד השני.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "שתף את קישור ההזמנה שלך", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "הקלד את קישור ההזמנה באופן ידני...", - "@typeInInviteLinkManually": {}, - "noMegolmBootstrap": "הפעל במקום זאת גיבוי מפתח מקוון מתוך Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "לא נמצאו חדרים…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "לא נמצאו סטטוסים עד כה.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "התראות", "@notifications": { "type": "text", "placeholders": {} }, - "notSupportedInWeb": "לא נתמך בweb", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} נבחר", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} משתמשים מקלידים…", "@numUsersTyping": { "type": "text", @@ -1395,11 +1066,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "גיבוי מפתח מקוון מושבת", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "גיבוי מפתח מקוון מופעל", "@onlineKeyBackupEnabled": { "type": "text", @@ -1446,8 +1112,6 @@ "type": "text", "placeholders": {} }, - "loginWithOneClick": "היכנס בלחיצה אחת", - "@loginWithOneClick": {}, "online": "מחובר/ת", "@online": { "type": "text", @@ -1455,16 +1119,6 @@ }, "addToBundle": "הוסף לחבילה", "@addToBundle": {}, - "optionalGroupName": "(אופציונלי) שם קבוצה", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "מכשירי משתמש משתתפים", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "ביטוי סיסמה או מפתח שחזור", "@passphraseOrKey": { "type": "text", @@ -1512,21 +1166,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "אנא בחר שם משתמש", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "אנא הזן Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "נא הזן את מפתח האבטחה שלך:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "נא הזן את הסיסמה שלך", "@pleaseEnterYourPassword": { "type": "text", @@ -1552,11 +1191,6 @@ "type": "text", "placeholders": {} }, - "monday": "יום שני", - "@monday": { - "type": "text", - "placeholders": {} - }, "noGoogleServicesWarning": "נראה שאין לך שירותי גוגל בטלפון שלך. זו החלטה טובה לפרטיות שלך! כדי לקבל התרעות ב- FluffyChat אנו ממליצים להשתמש https://microg.org/ או https://unifiedpush.org/.", "@noGoogleServicesWarning": { "type": "text", @@ -1575,13 +1209,6 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "לא נמצאו חדרים ציבוריים…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "על מנת שתוכל לשחזר את הסיסמה שלך, עליך להוסיף מאוחר יותר כתובת אימייל לחשבון שלך.", - "@newPasswordDescription": {}, "noPasswordRecoveryDescription": "עדיין לא הוספת דרך לשחזר את הסיסמה שלך.", "@noPasswordRecoveryDescription": { "type": "text", @@ -1592,8 +1219,6 @@ "type": "text", "placeholders": {} }, - "newUsernameDescription": "מזהה המשתמש שלך יקבל את הפורמט @username:servername", - "@newUsernameDescription": {}, "notificationsEnabledForThisAccount": "התראות הופעלו עבור חשבון זה", "@notificationsEnabledForThisAccount": { "type": "text", @@ -1624,11 +1249,6 @@ "@link": {}, "serverRequiresEmail": "שרת זה צריך לאמת את כתובת הדואר האלקטרוני שלך לרישום.", "@serverRequiresEmail": {}, - "makeAModerator": "הפוך למנחה", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, "logout": "יציאה", "@logout": { "type": "text", @@ -1639,11 +1259,6 @@ "type": "text", "placeholders": {} }, - "noDescription": "אין תיאור", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "scanQrCode": "סרוק קוד QR", "@scanQrCode": {}, "noPermission": "אין הרשאה", @@ -1663,16 +1278,6 @@ "homeserver": {} } }, - "makeAnAdmin": "הפוך למנהל מערכת", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "ודא שהמזהה חוקי", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "שינויים בחבר", "@memberChanges": { "type": "text", @@ -1683,11 +1288,6 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "ההודעה תוסר עבור כל המשתתפים", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "messages": "הודעות", "@messages": { "type": "text", diff --git a/assets/l10n/intl_hi.arb b/assets/l10n/intl_hi.arb new file mode 100644 index 0000000000..fc7c50735b --- /dev/null +++ b/assets/l10n/intl_hi.arb @@ -0,0 +1,1887 @@ +{ + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@admin": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@addAccount": {}, + "@close": { + "type": "text", + "placeholders": {} + }, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "text", + "placeholders": {} + }, + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "text", + "placeholders": {} + }, + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@encryption": { + "type": "text", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@password": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "remove": "निकालना", + "@remove": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@alias": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "text", + "placeholders": {} + }, + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@copy": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "text", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "importFromZipFile": ".zip फ़ाइल से आयात करें", + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@username": { + "type": "text", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "text", + "placeholders": {} + }, + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "@verified": { + "type": "text", + "placeholders": {} + }, + "repeatPassword": "पासवर्ड दोहराएं", + "@repeatPassword": {}, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "text", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "text", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@ignore": { + "type": "text", + "placeholders": {} + }, + "@recording": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@moderator": { + "type": "text", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@ok": { + "type": "text", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@send": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "@banned": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें", + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "@account": { + "type": "text", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@notifications": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@chat": { + "type": "text", + "placeholders": {} + }, + "@group": { + "type": "text", + "placeholders": {} + }, + "@leave": { + "type": "text", + "placeholders": {} + }, + "@skip": { + "type": "text", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@allChats": { + "type": "text", + "placeholders": {} + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@license": { + "type": "text", + "placeholders": {} + }, + "@addToSpace": {}, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@forward": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@about": { + "type": "text", + "placeholders": {} + }, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "text", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "text", + "placeholders": {} + }, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "importEmojis": "इमोजी आयात करें", + "@importEmojis": {}, + "@confirm": { + "type": "text", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@you": { + "type": "text", + "placeholders": {} + }, + "notAnImage": "कोई छवि फ़ाइल नहीं।", + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "text", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@messages": { + "type": "text", + "placeholders": {} + }, + "@login": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@settings": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@security": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "text", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@archive": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "@devices": { + "type": "text", + "placeholders": {} + }, + "@accept": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@share": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "text", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "@verify": { + "type": "text", + "placeholders": {} + }, + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@pin": { + "type": "text", + "placeholders": {} + }, + "importNow": "अभी आयात करें", + "@importNow": {}, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + } +} \ No newline at end of file diff --git a/assets/l10n/intl_hr.arb b/assets/l10n/intl_hr.arb index c2ad64e840..3d6c84730e 100644 --- a/assets/l10n/intl_hr.arb +++ b/assets/l10n/intl_hr.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} je prihvatio/la poziv", + "acceptedTheInvitation": "👍 {username} je prihvatio/la poziv", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Podaci računa", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} je aktivirao/la obostrano šifriranje", + "activatedEndToEndEncryption": "🔐 {username} je aktivirao/la obostrano šifriranje", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Dodaj opis grupe", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Dodaj novog prijatelja", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Administrator", "@admin": { "type": "text", @@ -65,11 +50,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Već imaš račun?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} je odgovorio/la na poziv", "@answeredTheCall": { "type": "text", @@ -92,11 +72,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arhivirana soba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Smiju li se gosti pridružiti", "@areGuestsAllowedToJoin": { "type": "text", @@ -112,21 +87,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Upiši svoju sigurnosnu lozinku ili ključ za obnavljanje, kako bi se ključevi spremili u predmemoriju.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Za potpisivanje druge osobe, upiši svoju sigurnosnu lozinku ili ključ za oporavak.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Za potvrđivanje tvoje sesije, upiši svoju sigurnosnu lozinku ili ključ za obnavljanje.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Prihvatiti ovaj zahtjev za potvrđivanje od {username}?", "@askVerificationRequest": { "type": "text", @@ -134,26 +99,6 @@ "username": {} } }, - "audioPlayerPause": "Zaustavi", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Pokreni", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentifikacija", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar promijenjen", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Domaći poslužitelj podržava vrste prijave:\n{serverVersions}\nMeđutim ovaj program podržava samo:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -170,7 +115,7 @@ "supportedVersions": {} } }, - "banFromChat": "Isključi iz chata", + "banFromChat": "Isključi iz razgovora", "@banFromChat": { "type": "text", "placeholders": {} @@ -203,11 +148,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Međuspremljeni ključevi", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Odustani", "@cancel": { "type": "text", @@ -225,7 +165,7 @@ "type": "text", "placeholders": {} }, - "changedTheChatAvatar": "{username} je promijenio/la avatar chata", + "changedTheChatAvatar": "{username} je promijenio/la avatar razgovora", "@changedTheChatAvatar": { "type": "text", "placeholders": { @@ -248,7 +188,7 @@ "chatname": {} } }, - "changedTheChatPermissions": "{username} je promijenio/la dozvole chata", + "changedTheChatPermissions": "{username} je promijenio/la dozvole razgovora", "@changedTheChatPermissions": { "type": "text", "placeholders": { @@ -329,21 +269,11 @@ "username": {} } }, - "changelog": "Zapis promjena", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Promijeni lozinku", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Promjene nisu spremljene", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Promijeni domaćeg poslužitelja", "@changeTheHomeserver": { "type": "text", @@ -359,16 +289,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Promijeni poslužitelja", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Promijeni sliku pozadine", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Promijeni svoj avatar", "@changeYourAvatar": { "type": "text", @@ -379,27 +299,27 @@ "type": "text", "placeholders": {} }, - "chat": "Chat", + "chat": "Razgovor", "@chat": { "type": "text", "placeholders": {} }, - "chatBackup": "Sigurnosna kopija chata", + "chatBackup": "Sigurnosna kopija razgovora", "@chatBackup": { "type": "text", "placeholders": {} }, - "chatBackupDescription": "Sigurnosna kopija chata osigurana je sigurnosnim ključem. Pazi da ga ne izgubiš.", + "chatBackupDescription": "Tvoji su stari razgovori osigurani s ključem za obnavljanje. Pazi da ga ne izgubiš.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "chatDetails": "Detalji chata", + "chatDetails": "Detalji razgovora", "@chatDetails": { "type": "text", "placeholders": {} }, - "chats": "Chatovi", + "chats": "Razgovori", "@chats": { "type": "text", "placeholders": {} @@ -409,24 +329,14 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Odaberi korisničko ime", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Isprazni arhiv", "@clearArchive": {}, - "clearText": "Ukloni tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Zatvori", "@close": { "type": "text", "placeholders": {} }, - "commandHint_ban": "Isključi korisnika iz ove sobe", + "commandHint_ban": "Isključi navedenog korisnika iz ove sobe", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -436,17 +346,17 @@ "type": "text", "description": "Usage hint for the command /html" }, - "commandHint_invite": "Pozovi korisnika u ovu sobu", + "commandHint_invite": "Pozovi navedenog korisnika u ovu sobu", "@commandHint_invite": { "type": "text", "description": "Usage hint for the command /invite" }, - "commandHint_join": "Pridruži se zadanoj sobi", + "commandHint_join": "Pridruži se navedenoj sobi", "@commandHint_join": { "type": "text", "description": "Usage hint for the command /join" }, - "commandHint_kick": "Ukloni korisnika iz ove sobe", + "commandHint_kick": "Ukloni navedenog korisnika iz ove sobe", "@commandHint_kick": { "type": "text", "description": "Usage hint for the command /kick" @@ -461,7 +371,7 @@ "type": "text", "description": "Usage hint for the command /me" }, - "commandHint_myroomavatar": "Postavi svoju sliku za ovu sobu", + "commandHint_myroomavatar": "Postavi svoju sliku za ovu sobu (mxc-uri)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" @@ -471,7 +381,7 @@ "type": "text", "description": "Usage hint for the command /myroomnick" }, - "commandHint_op": "Postavi razinu prava zadanog korisnika (standardno: 50)", + "commandHint_op": "Postavi razinu prava navedenog korisnika (standardno: 50)", "@commandHint_op": { "type": "text", "description": "Usage hint for the command /op" @@ -491,7 +401,7 @@ "type": "text", "description": "Usage hint for the command /send" }, - "commandHint_unban": "Ponovo uključi korisnika u ovu sobu", + "commandHint_unban": "Ponovo uključi navedenog korisnika u ovu sobu", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" @@ -508,17 +418,17 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Usporedi i provjeri, poklapaju li se sljedeći emojiji s onima drugog uređaja:", + "compareEmojiMatch": "Usporedi emoji sličice", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Usporedi i provjeri, poklapaju li se sljedeći brojevi s onima drugog uređaja:", + "compareNumbersMatch": "Usporedi brojeve", "@compareNumbersMatch": { "type": "text", "placeholders": {} }, - "configureChat": "Konfiguriraj chat", + "configureChat": "Konfiguriraj razgovor", "@configureChat": { "type": "text", "placeholders": {} @@ -533,11 +443,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Neuspio pokušaj povezivanja", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt je pozvan u grupu", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -558,11 +463,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Prikazivač sadržaja", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Kopirano u međuspremnik", "@copiedToClipboard": { "type": "text", @@ -585,16 +485,6 @@ "error": {} } }, - "couldNotSetAvatar": "Neuspjelo postavljanje avatara", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Neuspjelo postavljanje prikaznog imena", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} sudionika", "@countParticipants": { "type": "text", @@ -607,38 +497,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Stvori račun sada", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} je stvorio/la chat", + "createdTheChat": "💬 {username} je započeo/la razgovor", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Stvori novu grupu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Novi prostor", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Unakrsno potpisivanje isključeno", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Unakrsno potpisivanje uključeno", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Trenutačno aktivni", "@currentlyActive": { "type": "text", @@ -699,11 +569,6 @@ "type": "text", "placeholders": {} }, - "deny": "Odbij", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Uređaj", "@device": { "type": "text", @@ -719,46 +584,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Šifriranje je sigurno samo ako su svi uređaji potvrđeni.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Izravni chatovi", + "directChats": "Izravni razgovori", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Odbaci sliku", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Otkrij", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Otkrij grupe", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Prikazno ime je promijenjeno", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Doniraj", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Prekini i nemoj ponovo pitati", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Preuzmi datoteku", "@downloadFile": { "type": "text", @@ -774,21 +609,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Uredi dozvole za chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Uredi prikazano ime", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Uredi Jitsi primjerak", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Uredi pseudonime sobe", "@editRoomAliases": { "type": "text", @@ -829,16 +654,11 @@ "type": "text", "placeholders": {} }, - "emptyChat": "Prazan chat", + "emptyChat": "Prazan razgovor", "@emptyChat": { "type": "text", "placeholders": {} }, - "enableChatBackup": "Aktiviraj sigurnosnu kopiju chata kako nikada ne bi izgubio/la pristup tvojim chatovima.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Aktiviraj paket emotikona globalno", "@enableEmotesGlobally": { "type": "text", @@ -864,21 +684,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritam šifriranja", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Šifriranje nije aktivirano", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Postavke obostranog šifriranja", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} je završio/la poziv", "@endedTheCall": { "type": "text", @@ -886,23 +696,11 @@ "senderName": {} } }, - "enterAGroupName": "Upiši ime grupe", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Upiši e-adressu", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Upiši ime prostora", - "@enterASpacepName": {}, - "enterAUsername": "Upiši korisničko ime", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Upiši svoj domaći poslužitelj", "@enterYourHomeserver": { "type": "text", @@ -923,11 +721,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Veličina datoteke", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -943,16 +736,6 @@ "type": "text", "placeholders": {} }, - "friday": "Petak", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Prijatelji", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Od pridruživanja", "@fromJoining": { "type": "text", @@ -973,16 +756,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Opis grupe", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Opis grupe promijenjen", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Grupa je javna", "@groupIsPublic": { "type": "text", @@ -1033,11 +806,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Domaći poslužitelj nije kompatibilan", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Koliko je ovaj sadržaj uvredljiv?", "@howOffensiveIsThisContent": { "type": "text", @@ -1063,16 +831,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Možeš zanemariti korisnike koji te smetaju. Nećeš moći primati poruke niti pozive u sobe od korisnika koji se nalaze u tvom osobnom popisu zanemarivanja.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Zanemari korisničko ime", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Pritisnuo/la sam poveznicu", "@iHaveClickedOnLink": { "type": "text", @@ -1088,11 +846,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Neipsravna e-mail adresa", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Pozovi kontakt", "@inviteContact": { "type": "text", @@ -1110,7 +863,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} je pozvao/la {targetName}", + "invitedUser": "📩 {username} je pozvao/la {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1128,7 +881,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} te je pozvao/la u FluffyChat. \n1. Instaliraj FluffyChat: https://fluffychat.im \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: {link}", + "inviteText": "{username} te je pozvao/la u FluffyChat. \n1. Posjeti strnicu fluffychat.im i instaliraj aplikaciju \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1136,17 +889,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Je li sljedeći ključ uređaja ispravan?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "piše …", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} se pridružio/la chatu", + "joinedTheChat": "👋 {username} se pridružio/la razgovoru", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1158,17 +906,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Ključevi su spremljeni u predmemoriji", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Nedostaju ključevi", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} je izbacio/la {targetName}", + "kicked": "👞 {username} je izbacio/la {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1176,7 +914,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} je izbacio/la i isključio/la {targetName}", + "kickedAndBanned": "🙅 {username} je izbacio/la i blokirao/la {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1184,7 +922,7 @@ "targetName": {} } }, - "kickFromChat": "Izbaci iz chata", + "kickFromChat": "Izbaci iz razgovora", "@kickFromChat": { "type": "text", "placeholders": {} @@ -1196,22 +934,12 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Zadnji viđeni IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Viđeno prije dugo vremena", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Napusti", "@leave": { "type": "text", "placeholders": {} }, - "leftTheChat": "Napustio/la je chat", + "leftTheChat": "Napustio/la je razgovor", "@leftTheChat": { "type": "text", "placeholders": {} @@ -1221,7 +949,7 @@ "type": "text", "placeholders": {} }, - "lightTheme": "Svjetla", + "lightTheme": "Svijetla", "@lightTheme": { "type": "text", "placeholders": {} @@ -1255,33 +983,11 @@ "homeserver": {} } }, - "loginWith": "Prijavi se s {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Odjava", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Postavi kao voditelja", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Postavi kao administratora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Provjeri ispravnost identifikator", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Promjene člana", "@memberChanges": { "type": "text", @@ -1297,29 +1003,12 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Poruke će se ukloniti za sve sudionike", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Voditelj", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Ponedjeljak", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Još jedan događaj} other{Još {count} događaja}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Isključi zvuk chata", + "muteChat": "Isključi zvuk razgovora", "@muteChat": { "type": "text", "placeholders": {} @@ -1329,12 +1018,12 @@ "type": "text", "placeholders": {} }, - "newChat": "Novi chat", + "newChat": "Novi razgovor", "@newChat": { "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nova poruka u FluffyChatu", + "newMessageInFluffyChat": "💬 Nova poruka u FluffyChatu", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1359,16 +1048,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat trenutačno ne podržava unakrsno potpisivanje. Aktiviraj potpisivanje u programu Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Bez opisa", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Nema emotikona. 😕", "@noEmotesFound": { "type": "text", @@ -1379,16 +1058,6 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Čini se da na mobitelu nemaš google usluge. To je dobra odluka za tvoju privatnost! Za automatsko primanje obavijesti u FluffyChatu preporučujemo koristiti https://microg.org/ or https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Umjesto toga uključi internetsko spremanje sigurnosnih kopija ključa u programu Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ništa", "@none": { "type": "text", @@ -1404,21 +1073,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Nema javnih soba …", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Nema soba …", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Do sada nema stanja.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Obavijesti", "@notifications": { "type": "text", @@ -1429,18 +1088,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Nije podržano u internetu", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} odabrano", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} korisnika pišu …", "@numUsersTyping": { "type": "text", @@ -1468,11 +1115,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Internetski ključ sigurnosnih kopija je deaktiviran", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Internetski ključ sigurnosnih kopija je aktiviran", "@onlineKeyBackupEnabled": { "type": "text", @@ -1498,16 +1140,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Opcionalno) Tvoja e-mail adresa", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcionalno) Ime grupe", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Ili", "@or": { "type": "text", @@ -1518,11 +1150,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Sudjelujući korisnički uređaji", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "tajni izraz ili ključ za obnavljanje", "@passphraseOrKey": { "type": "text", @@ -1580,11 +1207,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Odaberi korisničko ime", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Pritisni poveznicu u e-poruci, zatim nastavi.", "@pleaseClickOnLink": { "type": "text", @@ -1595,16 +1217,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Upiši Matrix-ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Upiši sigurnosni ključ:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Upiši svoju lozinku", "@pleaseEnterYourPassword": { "type": "text", @@ -1630,26 +1242,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Javne grupe", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Javni ključ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Javne sobe", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Javni prostor", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Pravila slanja", "@pushRules": { "type": "text", @@ -1721,16 +1318,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "Ponovo uključi u chat", + "unbanFromChat": "Ponovo uključi u razgovor", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "Ukloni poruku", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Ukloni svoj avatar", "@removeYourAvatar": { "type": "text", @@ -1761,16 +1353,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Zahtjev za čitanje starijih poruka", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Opozovi sve dozvole", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Soba je nadograđena", "@roomHasBeenUpgraded": { "type": "text", @@ -1781,25 +1363,8 @@ "type": "text", "placeholders": {} }, - "saturday": "Subota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Datoteka je spremljena kao {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Spremi datoteku", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Spremi datoteku u ovu mapu", - "@saveFileToFolder": { + "saveFile": "Spremi datoteku", + "@saveFile": { "type": "text", "placeholders": {} }, @@ -1808,26 +1373,11 @@ "type": "text", "placeholders": {} }, - "searchForAChat": "Traži chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Sigurnost", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Sigurnosni ključ", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Izgubio/la si sigurnosni ključ?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Viđeno od {username}", "@seenByUser": { "type": "text", @@ -1835,22 +1385,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Viđeno od {username} i još {count} korisnika}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Viđeno od {username} i {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Pošalji", "@send": { "type": "text", @@ -1870,11 +1404,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Dozvoli slanje izvještaja o greškama pomoću sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Pošalji datoteku", "@sendFile": { "type": "text", @@ -1905,35 +1434,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} ja poslao/la datoteku", + "sentAFile": "📁 {username} ja poslao/la datoteku", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} ja poslao/la audio datoteku", + "sentAnAudio": "🎤 {username} ja poslao/la audio snimku", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} ja poslao/la sliku", + "sentAPicture": "🖼️ {username} ja poslao/la sliku", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} je poslao/la naljepnicu", + "sentASticker": "😊 {username} je poslao/la naljepnicu", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} ja poslao/la video", + "sentAVideo": "🎥 {username} je poslao/la video", "@sentAVideo": { "type": "text", "placeholders": { @@ -1947,21 +1476,6 @@ "senderName": {} } }, - "sentryInfo": "Podaci o tvojoj privatnosti: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesija je potvrđena", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Postavi sliku profila", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Postavi kao glavni pseudonim", "@setAsCanonicalAlias": { "type": "text", @@ -1972,12 +1486,7 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Postavi opis grupe", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Pošalji poveznicu za pozivnicu", + "setInvitationLink": "Pošalji poveznicu poziva", "@setInvitationLink": { "type": "text", "placeholders": {} @@ -2014,11 +1523,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Prijavi se", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Jednokratna prijava", "@singlesignon": { "type": "text", @@ -2029,11 +1533,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Zvuk, vibracija LED-boja", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Izvorni kȏd", "@sourceCode": { "type": "text", @@ -2056,11 +1555,6 @@ "senderName": {} } }, - "startYourFirstChat": "Započni svoj prvi razgovor! 🙂\n- Dodirni gumb „Novi razgovor”\n- Skeniraj QR-kod prijatelja\n- Zabavi se u razgovoru", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Stanje", "@status": { "type": "text", @@ -2076,11 +1570,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Nedjelja", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Sinkronizira se … Pričekaj.", "@synchronizingPleaseWait": { "type": "text", @@ -2091,21 +1580,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Za potvrđivanje dodirni uređaj", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Dodirni za prikaz slike", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Dodirni za prikaz izbornika", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Ne poklapaju se", "@theyDontMatch": { "type": "text", @@ -2116,26 +1590,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Ova soba je arhivirana.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Četvrtak", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2172,11 +1626,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Utorak", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Nedostupno", "@unavailable": { "type": "text", @@ -2212,17 +1661,7 @@ "type": {} } }, - "unknownSessionVerify": "Nepoznata sesija. Potvrdi je", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Otključaj sigurnosnu kopiju chata", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Uključi zvuk chata", + "unmuteChat": "Uključi zvuk razgovora", "@unmuteChat": { "type": "text", "placeholders": {} @@ -2232,25 +1671,13 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 nepročitan chat} other{{unreadCount} nepročitana chata}}", + "unreadChats": "{unreadCount, plural, =1{1 nepročitan razgovor} few{{unreadCount} nepročitana razgovora} other{{unreadCount} nepročitanih razgovora}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 nepročitana poruka} other{{unreadEvents} nepročitane poruke}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Koristiti kompatibilne boje AMOLED-a?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} i još {count} korisnika pišu …", "@userAndOthersAreTyping": { "type": "text", @@ -2274,7 +1701,7 @@ "username": {} } }, - "userLeftTheChat": "{username} je napustio/la chat", + "userLeftTheChat": "🚪 {username} je napustio/la razgovor", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2286,11 +1713,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Korisnik nije potvrđen", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} ja poslao/la {type} događaj", "@userSentUnknownEvent": { "type": "text", @@ -2299,36 +1721,16 @@ "type": {} } }, - "userUnknownVerification": "Korisnik ima nepoznato stanje potvrđivanja", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Korisnik je potvrđen", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Potvrđeno", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Uspješno potvrđena sesija!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Potvrdi", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Potvrdi ručno", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Pokreni potvrđivanje", "@verifyStart": { "type": "text", @@ -2344,17 +1746,12 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Potvrdi korisnika", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Video poziv", "@videoCall": { "type": "text", "placeholders": {} }, - "visibilityOfTheChatHistory": "Vidljivost kronologije chata", + "visibilityOfTheChatHistory": "Vidljivost povijesti razgovora", "@visibilityOfTheChatHistory": { "type": "text", "placeholders": {} @@ -2389,7 +1786,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Slika pozadine", + "wallpaper": "Pozadina:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2399,21 +1796,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Obostrano šifriranje se trenutačno nalazi u beta stanju! Koriti na vlastitu odgovornost!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Srijeda", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Lijep pozdrav u najslađem programu za čavrljanje u mreži Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Poslali smo ti e-poruku", "@weSentYouAnEmail": { "type": "text", @@ -2434,7 +1816,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Izbrisati sigurnosnu kopiju chata za stvaranje novog sigurnosnog ključa?", + "wipeChatBackup": "Izbrisati sigurnosnu kopiju razgovora za stvaranje novog sigurnosnog ključa za obnavljanje?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2459,58 +1841,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Pozvan/a si u ovaj chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Više ne sudjeluješ u ovom chatu", + "youAreNoLongerParticipatingInThisChat": "Više ne sudjeluješ u ovom razgovoru", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Sebe ne možeš pozvati", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Isključen/a si iz ovog chata", + "youHaveBeenBannedFromThisChat": "Isključen/a si iz ovog razgovora", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Tvoji se chatovi sinkroniziraju …", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Tvoje korisničko ime", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Tvoj javni ključ", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Bit ćeš povezan/a s {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Uvećaj", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Umanji", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "shareLocation": "Dijeli lokaciju", "@shareLocation": { "type": "text", @@ -2556,34 +1901,19 @@ "type": "text", "placeholder": {} }, - "allChats": "Svi chatovi", + "allChats": "Svi razgovori", "@allChats": { "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "Chat je uklonjen iz ovog prostora", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat je dodan u ovaj prostor", + "chatHasBeenAddedToThisSpace": "Razgovor je dodan u ovaj prostor", "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Dodaj u prostor", "@addToSpace": {}, - "newUsernameDescription": "Tvoj će korisnički ID tada biti u obliku @korisničkoime:imeposlužitelja", - "@newUsernameDescription": {}, - "newPasswordDescription": "Za omogućavanje obnavljanja lozinke, svom računu kasnije dodaj e-mail adresu.", - "@newPasswordDescription": {}, - "createNewChatExplaination": "Jednostavno snimi QR kod ili dijeli poveznicu za pozivnicu ako niste jedan blizu drugog.", - "@createNewChatExplaination": {}, "serverRequiresEmail": "Za registraciju ovaj poslužitelj mora potvrditi tvoju e-mail adresu.", "@serverRequiresEmail": {}, "scanQrCode": "Snimi QR kod", "@scanQrCode": {}, - "typeInInviteLinkManually": "Upiši poveznicu za pozivnicu …", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Dijeli svoju poveznicu za pozivnicu", - "@shareYourInviteLink": {}, "homeserver": "Domaći poslužitelj", "@homeserver": {}, "sendOnEnter": "Pošalji pritiskom tipke enter", @@ -2604,31 +1934,12 @@ "@addAccount": {}, "oneClientLoggedOut": "Jedan od tvojih klijenata je odjavljen", "@oneClientLoggedOut": {}, - "yourUserId": "Tvoj korisnički ID:", - "@yourUserId": {}, "unverified": "Nepotvrđeno", "@unverified": {}, - "setupChatBackup": "Postavi sigurnosnu kopiju chata", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Zapisao sam ključ", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Sigurnosna kopija tvog chata je postavljena.", + "yourChatBackupHasBeenSetUp": "Sigurnosna kopija tvog razgovora je postavljena.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Kako bismo zaštitili tvoje poruke, generirali smo sigurnosni ključ.\nČuvaj ga na sigurnom mjestu, poput upravljača lozinki.", - "@setupChatBackupDescription": {}, "repeatPassword": "Ponovi lozinku", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Odaberi barem {min} znakova.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "pleaseEnterValidEmail": "Upiši valjanu e-mail adresu.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Lozinke se ne poklapaju!", - "@passwordsDoNotMatch": {}, "messageInfo": "Informacija poruke", "@messageInfo": {}, "messageType": "Vrsta poruke", @@ -2637,30 +1948,20 @@ "@sender": {}, "openGallery": "Otvori galeriju", "@openGallery": {}, - "loginWithOneClick": "Prijavi se samo s jednim pritiskom", - "@loginWithOneClick": {}, "time": "Vrijeme", "@time": {}, "removeFromSpace": "Ukloni iz prostora", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Ovime se ovaj chat uklanja iz trenutačnog prostora. I dalje će biti vidljiv pod \"Svi chatovi\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Odaberi prostor za dodavanje ovog chata.", + "addToSpaceDescription": "Odaberi prostor kojem će se ovaj razgovor dodati.", "@addToSpaceDescription": {}, "start": "Početak", "@start": {}, - "setupChatBackupNow": "Sada postavit sigurnosnu kopiju chata", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Za otključavanje sigurnosne kopije chata, upši svoj sigurnosni ključ koji je generiran u prethodnoj sesiji. Tvoj sigurnosni ključ NIJE tvoja lozinka.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Sada spremi sigurnosni ključ", - "@saveTheSecurityKeyNow": {}, "commandHint_clearcache": "Isprazni predmemoriju", "@commandHint_clearcache": { "type": "text", "description": "Usage hint for the command /clearcache" }, - "commandHint_create": "Stvori prazan grupni chat\nKoristi --no-encryption za deaktiviranje šifriranja", + "commandHint_create": "Stvori prazan grupni razgovor\nKoristi --no-encryption za deaktiviranje šifriranja", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" @@ -2670,7 +1971,7 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_dm": "Započni izravni chat\nKoristi --no-encryption za deaktiviranje šifriranja", + "commandHint_dm": "Započni izravni razgovor\nKoristi --no-encryption za deaktiviranje šifriranja", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2680,15 +1981,6 @@ "type": "text", "placeholders": {} }, - "iUnderstand": "Razumijem", - "@iUnderstand": {}, - "storyPrivacyWarning": "Imaj na umu da ljudi mogu vidjeti i međusobno se kontaktirati u tvojoj priči. Tvoje priče će biti vidljive 24 sata, ali nema jamstva da će se izbrisati sa svih uređaja i poslužitelja.", - "@storyPrivacyWarning": {}, - "bubbleSize": "Veličina mjehurića", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2696,39 +1988,13 @@ "size": {} } }, - "storyFrom": "Priča od {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Imaj na umu da ljudi mogu vidjeti i međusobno se kontaktirati u tvojoj priči.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Dodaj priči", - "@addToStory": {}, "publish": "Objavi", "@publish": {}, - "whoCanSeeMyStories": "Tko može vidjeti moje priče?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Otkaži pretplatu na priče", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Ovaj korisnik još nije objavio ništa u svojoj priči", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Tvoja priča", - "@yourStory": {}, - "replyHasBeenSent": "Odgovor je poslan", - "@replyHasBeenSent": {}, - "whatIsGoingOn": "Što se događa?", - "@whatIsGoingOn": {}, - "addDescription": "Dodaj opis", - "@addDescription": {}, "markAsRead": "Označi kao pročitano", "@markAsRead": {}, "reportUser": "Prijavi korisnika", "@reportUser": {}, - "openChat": "Otvori chat", + "openChat": "Otvori razgovor", "@openChat": {}, "dismiss": "Odbaci", "@dismiss": {}, @@ -2759,6 +2025,692 @@ "@unsupportedAndroidVersionLong": {}, "previousAccount": "Prethodni račun", "@previousAccount": {}, - "showSpaces": "Prikaži popis prostora", - "@showSpaces": {} + "recoveryKey": "Ključ za obnavljanje", + "@recoveryKey": {}, + "recoveryKeyLost": "Izgubio/la si ključ za obnavljanje?", + "@recoveryKeyLost": {}, + "youKickedAndBanned": "🙅 Izbacio/la si i blokirao/la korisnika {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "dehydrateWarning": "Ovo je nepovratna radnja. Spremi datoteku sigurnosne kopije na sigurno mjeto.", + "@dehydrateWarning": {}, + "hydrateTor": "Korisnici TOR-a: Uzvezite izvoz sesije", + "@hydrateTor": {}, + "dehydrateTor": "Korisnici TOR-a: izvezite sesiju", + "@dehydrateTor": {}, + "emojis": "Emojiji", + "@emojis": {}, + "indexedDbErrorLong": "Spremište poruka nažalost nije standarno uključena u privatnom modusu.\nOtvori stranicu\n - about:config\n - postavi dom.indexedDB.privateBrowsing.enabled na true\nFluffyChat se inače neće moći pokrenuti.", + "@indexedDbErrorLong": {}, + "storeSecurlyOnThisDevice": "Spremi sigurno na ovom uređaju", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "Broj datoteka: {count}", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "reactedWith": "{sender} je reagirao/la sa {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "pinMessage": "Prikvači na sobu", + "@pinMessage": {}, + "confirmEventUnpin": "Stvarno želiš trajno otkvačiti događaj?", + "@confirmEventUnpin": {}, + "voiceCall": "Glasovni poziv", + "@voiceCall": {}, + "placeCall": "Nazovi", + "@placeCall": {}, + "videoCallsBetaWarning": "Napominjemo da se funkcija videopoziva trenutačno nalazi u beta stanju. Možda neće raditi ispravno ili uopće neće raditi na svim platformama.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Eksperimentalni videopozivi", + "@experimentalVideoCalls": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "addWidget": "Dodaj widget", + "@addWidget": {}, + "widgetNameError": "Zadaj prikazno ime.", + "@widgetNameError": {}, + "youRejectedTheInvitation": "Odbio/la si poziv", + "@youRejectedTheInvitation": {}, + "errorAddingWidget": "Greška prilikom dodavanja widgeta.", + "@errorAddingWidget": {}, + "youJoinedTheChat": "Pridružio/la si se razgovoru", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Prihvatio/la si poziv", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Povukao/la si poziv za korisnika {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 {user} te je pozvao/la", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youInvitedUser": "📩 Pozvao/la si korisnika {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "youKicked": "👞 Izbacio/la si korisnika {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "Ponovo si uključio/la korisnika {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "dehydrate": "Izvezi sesiju i izbriši uređaj", + "@dehydrate": {}, + "unlockOldMessages": "Otključaj stare poruke", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Ključ za obnavljanje spremi u sigurno spremište na ovom uređaju.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Spremi ovaj ključ ručno pokretanjem dijaloga za dijeljenje sustava ili međuspremnika.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Spremi u Android KeyStore", + "@storeInAndroidKeystore": {}, + "separateChatTypes": "Odvojeni izravni razgovori, grupe i prostori", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "dehydrateTorLong": "Korisnicima TOR-a preporučuje se izvoz sesije prije zatvaranja prozora.", + "@dehydrateTorLong": {}, + "hydrateTorLong": "Je li zadnji izvoz sesije bio na TOR-u? Brzo ga uvezi i nastavi razgovarati.", + "@hydrateTorLong": {}, + "hydrate": "Obnovi pomoću sigurnosne kopije", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Upiši svoj ključ za obnavljanje:", + "@pleaseEnterRecoveryKey": {}, + "users": "Korisnici", + "@users": {}, + "pleaseEnterRecoveryKeyDescription": "Za otključavanje starih poruka upiši ključ za obnavljanje koji je generiran u prethodnoj sesiji. Tvoj ključ za obnavljanje NIJE tvoja lozinka.", + "@pleaseEnterRecoveryKeyDescription": {}, + "indexedDbErrorTitle": "Problemi u privatnom modusu", + "@indexedDbErrorTitle": {}, + "youBannedUser": "Isključio/la si korisnika {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "storeInAppleKeyChain": "Spremi u Apple KeyChain", + "@storeInAppleKeyChain": {}, + "user": "Korisnik", + "@user": {}, + "custom": "Prilagođeno", + "@custom": {}, + "fileHasBeenSavedAt": "Datoteka je spremljena u {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "numChats": "{number} razgovora", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "fileIsTooBigForServer": "Poslužitelj javlja da je datoteka prevelika za slanje.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "Skoči na zadnju pročitanu poruku", + "@jumpToLastReadMessage": {}, + "commandHint_markasdm": "Označi kao sobu za izravnu razmjenu poruka za zadani Matrix ID", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Označi kao grupu", + "@commandHint_markasgroup": {}, + "hideUnimportantStateEvents": "Sakrij nevažna stanja događaja", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nemoj više prikazivati", + "@doNotShowAgain": {}, + "readUpToHere": "Pročitaj do ovdje", + "@readUpToHere": {}, + "wasDirectChatDisplayName": "Prazan razgovor (zvao se {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noBackupWarning": "Upozorenje! Bez aktiviranja spremanja sigurnosne kopije razgovora, izgubit ćeš pristup tvojim šifriranim porukama. Preporučujemo spremanje sigurnosne kopije razgovora prije odjave.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Nijedan drugi uređaj nije pronađen", + "@noOtherDevicesFound": {}, + "whyIsThisMessageEncrypted": "Zašto nije moguće čitati ovu poruku?", + "@whyIsThisMessageEncrypted": {}, + "jump": "Skoči", + "@jump": {}, + "startFirstChat": "Započni svoj prvi razgovor", + "@startFirstChat": {}, + "newSpaceDescription": "Prostori omogućuju konsolidiranje tvojih razgovora i izgradnju privatne ili javne zajednice.", + "@newSpaceDescription": {}, + "encryptThisChat": "Šifiraj ovaj razgovor", + "@encryptThisChat": {}, + "deviceKeys": "Ključevi uređaja:", + "@deviceKeys": {}, + "foregroundServiceRunning": "Ova se obavijest pojavljuje kada se pokreće usluga u prvom planu.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Dozvole za pozivanje", + "@callingPermissions": {}, + "callingAccountDetails": "Omogućuje FluffyChatu korištenje izvorne Android aplikacije za pozivanje.", + "@callingAccountDetails": {}, + "callingAccount": "Račun za pozivanje", + "@callingAccount": {}, + "commandHint_hug": "Pošalji grljenje", + "@commandHint_hug": {}, + "commandHint_googly": "Pošalji kotrljajuće oči", + "@commandHint_googly": {}, + "commandHint_cuddle": "Pošalji maženje", + "@commandHint_cuddle": {}, + "confirmMatrixId": "Za brisanje tvog računa potvrdi svoj Matrix ID.", + "@confirmMatrixId": {}, + "supposedMxid": "Trebao bi biti {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "enterRoom": "Uđi u sobu", + "@enterRoom": {}, + "screenSharingDetail": "Dijeliš svoj ekran u FuffyChatu", + "@screenSharingDetail": {}, + "appearOnTopDetails": "Omogućuje prikaz aplikacije ispred drugih (nije potrebno ako je FluffyChat već postavljen kao račun za pozivanje)", + "@appearOnTopDetails": {}, + "appearOnTop": "Prikaz ispred drugih", + "@appearOnTop": {}, + "newGroup": "Nova grupa", + "@newGroup": {}, + "allSpaces": "Svi prostori", + "@allSpaces": {}, + "screenSharingTitle": "dijeljenje ekrana", + "@screenSharingTitle": {}, + "otherCallingPermissions": "Mikrofon, kamera i druge FluffyChat dozvole", + "@otherCallingPermissions": {}, + "enterSpace": "Uđi u prostor", + "@enterSpace": {}, + "newSpace": "Novi prostor", + "@newSpace": {}, + "sorryThatsNotPossible": "Žao nam je … to nije moguće", + "@sorryThatsNotPossible": {}, + "disableEncryptionWarning": "Iz sigurnosnih razloga ne možeš deaktivirati šifriranje u razgovoru u kojem je prije bilo aktivirano.", + "@disableEncryptionWarning": {}, + "googlyEyesContent": "{senderName} ti šalje kotrljajuće oči", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} te mazi", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} te grli", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "noKeyForThisMessage": "To se može dogoditi ako je poruka poslana prije prijave na tvoj račun na ovom uređaju.\n\nTakođer je moguće da je pošiljatelj blokirao tvoj uređaj ili je došlo do greške s internetskom vezom.\n\nMožeš li pročitati poruku na jednoj drugoj sesiji? U tom slučaju možeš prenijeti poruku iz nje! Idi na Postavke > Uređaji i uvjeri se da su se tvoji uređaji međusobno provjerili. Kada sljedeći put otvoriš sobu i obje sesije su u prednjem planu, ključevi će se automatski prenijeti.\n\nNe želiš izgubiti ključeve kada se odjaviš ili zamijeniš uređaje? Aktiviraj spremanje sigurnosne kopije razgovora u postavkama.", + "@noKeyForThisMessage": {}, + "reopenChat": "Ponovo otvori razgovor", + "@reopenChat": {}, + "openLinkInBrowser": "Otvori poveznicu u pregledniku", + "@openLinkInBrowser": {}, + "report": "prijavi", + "@report": {}, + "allRooms": "Svi grupni razgovori", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 Joj! Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.", + "@reportErrorDescription": {}, + "signInWithPassword": "Prijavi se s lozinkom", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Pokušaj ponovo kasnije ili odaberi jedan drugi poslužitelj.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Prijavi se pomoću {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Nije slikovna datoteka.", + "@notAnImage": {}, + "importNow": "Uvezi sada", + "@importNow": {}, + "importEmojis": "Uvezi emoji slike", + "@importEmojis": {}, + "importFromZipFile": "Uvezi iz .zip datoteke", + "@importFromZipFile": {}, + "replace": "Zamijeni", + "@replace": {}, + "exportEmotePack": "Izvezi paket emotikona kao .zip", + "@exportEmotePack": {}, + "sendTypingNotifications": "Pošalji pismene obavijesti", + "@sendTypingNotifications": {}, + "setColorTheme": "Postavi boju teme:", + "@setColorTheme": {}, + "tryAgain": "Pokušaj ponovo", + "@tryAgain": {}, + "messagesStyle": "Poruke:", + "@messagesStyle": {}, + "chatDescription": "Opis razgovora", + "@chatDescription": {}, + "invalidServerName": "Neispravno ime servera", + "@invalidServerName": {}, + "chatPermissions": "Dozvole za razgovor", + "@chatPermissions": {}, + "setChatDescription": "Postavi opis rzgovora", + "@setChatDescription": {}, + "redactedBy": "Preuređeno od {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "optionalRedactReason": "(Opcionalno) Razlog za redigiranje ove poruke …", + "@optionalRedactReason": {}, + "inviteContactToGroupQuestion": "Želiš li pozvati {contact} u razgovor grupe „{groupName}”?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Preuređeno od {username} zbog: „{reason}”", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "redactMessageDescription": "Poruka će se redigirati za sve sudionike u ovom razgovoru. To se ne može poništiti.", + "@redactMessageDescription": {}, + "addChatDescription": "Dodaj opis razgovora …", + "@addChatDescription": {}, + "directChat": "Izravni razgovor", + "@directChat": {}, + "inviteGroupChat": "📨 Pozovi u grupni razgovor", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Pozovi u privatni razgovor", + "@invitePrivateChat": {}, + "noChatDescriptionYet": "Opis razgovora još nije stvoren.", + "@noChatDescriptionYet": {}, + "chatDescriptionHasBeenChanged": "Opis razgovora je promijenjen", + "@chatDescriptionHasBeenChanged": {}, + "profileNotFound": "Korisnik nije pronađen na poslužitelju. Možda postoji problem s vezom ili korisnik ne postoji.", + "@profileNotFound": {}, + "shareInviteLink": "Dijeli poveznicu za poziv", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Ovdje će se pojaviti nedavno korišteni emotikoni …", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Postavi temu:", + "@setTheme": {}, + "createGroup": "Stvori grupu", + "@createGroup": {}, + "invite": "Pozovi", + "@invite": {}, + "invalidInput": "Neispravan unos!", + "@invalidInput": {}, + "wrongPinEntered": "Unesen je pogrešan PIN! Pokušaj ponovo za {seconds} sekunde …", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "hasKnocked": "🚪 {user} je pokucao/la", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "pleaseEnterANumber": "Upiši broj veći od 0", + "@pleaseEnterANumber": {}, + "pushNotificationsNotAvailable": "Automatsko slanje obavijesti nije dostupno", + "@pushNotificationsNotAvailable": {}, + "learnMore": "Saznaj više", + "@learnMore": {}, + "createGroupAndInviteUsers": "Stvori grupu i pozovi korisnike", + "@createGroupAndInviteUsers": {}, + "startConversation": "Pokreni konverzaciju", + "@startConversation": {}, + "blockedUsers": "Blokirani korisnici", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Grupa se može pronaći putem pretrage", + "@groupCanBeFoundViaSearch": {}, + "block": "Blokiraj", + "@block": {}, + "yourGlobalUserIdIs": "Tvoj globalni korisnički ID je: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Pošalji neobrađeni json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Oprosti … čini se da ovo nije ispravan ključ za obnavljanje.", + "@wrongRecoveryKey": {}, + "blockUsername": "Zanemari korisničko ime", + "@blockUsername": {}, + "groupName": "Ime grupe", + "@groupName": {}, + "databaseMigrationTitle": "Baza podataka je optimirana", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Traži #chats, @users …", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Pričekaj. Ovo može potrajati.", + "@databaseMigrationBody": {}, + "transparent": "Prozirno", + "@transparent": {}, + "formattedMessages": "Formatirane poruke", + "@formattedMessages": {}, + "incomingMessages": "Dolazne poruke", + "@incomingMessages": {}, + "passwordsDoNotMatch": "Lozinke se ne poklapaju", + "@passwordsDoNotMatch": {}, + "accessAndVisibility": "Pristup i vidljivost", + "@accessAndVisibility": {}, + "calls": "Pozivi", + "@calls": {}, + "customEmojisAndStickers": "Prilagođeni emojiji i naljepnice", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Dodaj ili dijeli prilagođene emojije ili naljepnice koje se mogu koristiti u bilo kojem razgovoru.", + "@customEmojisAndStickersBody": {}, + "accessAndVisibilityDescription": "Tko se smije pridružiti ovom razgovoru i kako se razgovor može otkriti.", + "@accessAndVisibilityDescription": {}, + "stickers": "Naljepnice", + "@stickers": {}, + "discover": "Otkrij", + "@discover": {}, + "formattedMessagesDescription": "Prikaži formatirani sadržaj poruke poput podebljanog teksta koristeći markdown.", + "@formattedMessagesDescription": {}, + "nothingFound": "Ništa nije pronađeno...", + "@nothingFound": {}, + "select": "Odaberi", + "@select": {}, + "newPassword": "Nova lozinka", + "@newPassword": {}, + "unbanUserDescription": "Korisnik će se ponovo moći pridružiti razgovoru ako pokuša.", + "@unbanUserDescription": {}, + "publicSpaces": "Javni prostori", + "@publicSpaces": {}, + "subspace": "Podprostori", + "@subspace": {}, + "decline": "Odbij", + "@decline": {}, + "thisDevice": "Ovaj uređaj:", + "@thisDevice": {}, + "presenceStyle": "Prisutnost:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Prikaži poruke stanja od drugih korisnika", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "noPublicLinkHasBeenCreatedYet": "Još nije stvorena nijedna javna poveznica", + "@noPublicLinkHasBeenCreatedYet": {}, + "hidePresences": "Sakriti popis stanja?", + "@hidePresences": {}, + "pleaseEnterYourCurrentPassword": "Upiši svoju trenutačnu lozinku", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Javna poveznica", + "@publicLink": {}, + "passwordIsWrong": "Tvoja upisana lozinka je kriva", + "@passwordIsWrong": {}, + "initAppError": "Dogodila se greška prilikom inicijaliziranja aplikacije", + "@initAppError": {}, + "hideRedactedMessagesBody": "Ako netko redigira poruku, ta poruka više neće biti vidljiva u razgovoru.", + "@hideRedactedMessagesBody": {}, + "kickUserDescription": "Korisnik je izbačen iz razgovora, ali nije blokiran. U javnim razgovorima se korisnik može ponovo pridružiti u bilo kojem trenutku.", + "@kickUserDescription": {}, + "addChatOrSubSpace": "Dodaj razgovor ili podpodručje", + "@addChatOrSubSpace": {}, + "appLockDescription": "Zaključaj aplikaciju kada je ne koristiš s PIN kodom", + "@appLockDescription": {}, + "globalChatId": "Globalni ID razgovora", + "@globalChatId": {}, + "hideRedactedMessages": "Sakrij redigirane poruke", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Sakrij nevažeće ili nepoznate formate poruka", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Pregled", + "@overview": {}, + "notifyMeFor": "Obavijesit me za", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Postavke za obnavljanje lozinke", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChats": "Sakrij promjene članova u javnim razgovorima", + "@hideMemberChangesInPublicChats": {}, + "youInvitedToBy": "📩 Pozvan/a si putem poveznice na:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "usersMustKnock": "Korisnici moraju pokucati", + "@usersMustKnock": {}, + "noOneCanJoin": "Nitko se ne može pridružiti", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} se želi pridružiti razgovoru.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "knock": "Pokucaj", + "@knock": {}, + "knocking": "Kucanje", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Razgovor se može otkriti pretraživanjem servera {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "searchForUsers": "Traži @users...", + "@searchForUsers": {}, + "pleaseChooseAStrongPassword": "Odaberi snažnu lozinku", + "@pleaseChooseAStrongPassword": {}, + "joinSpace": "Pridruži se prostoru", + "@joinSpace": {}, + "publicChatAddresses": "Adrese javnih razgovora", + "@publicChatAddresses": {}, + "createNewAddress": "Stvori novu adresu", + "@createNewAddress": {}, + "userRole": "Korisnička uloga", + "@userRole": {}, + "verifyOtherUser": "🔐 Potvrdi drugog korisnika", + "@verifyOtherUser": {}, + "sendTypingNotificationsDescription": "Drugi sudionici u razgovoru mogu vidjeti kada pišeš novu poruku.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Drugi sudionici u raygovoru mogu vidjeti kada pročitaš poruku.", + "@sendReadReceiptsDescription": {}, + "searchIn": "Traži u razgovoru „{chat}”...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Traži više...", + "@searchMore": {}, + "gallery": "Galerija", + "@gallery": {}, + "files": "Datoteke", + "@files": {}, + "verifyOtherDevice": "🔐 Potvrdi drugi uređaj", + "@verifyOtherDevice": {}, + "unreadChatsInApp": "{appname}: Nroj nepročitanih razgovora: {unread}", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "commandHint_ignore": "Zanemari navedeni matrix ID", + "@commandHint_ignore": {}, + "blockListDescription": "Možeš blokirati korisnike koji te ometaju. Nećeš moći primati poruke ili pozivnice za sobe od korisnika koji se nalaze u tvom osobnom popisu blokiranih.", + "@blockListDescription": {}, + "isReadyForKeyVerification": "{sender} je spreman/na za potvrđivanje ključa", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "banUserDescription": "Korisnik će biti isključen iz razgovora i moći će ponovo prisustvovati razgovoru kad ga se deblokira.", + "@banUserDescription": {}, + "sessionLostBody": "Tvoja je sesija izgubljena. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "completedKeyVerification": "{sender} je dovršio/la potvrđivanje ključa", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "archiveRoomDescription": "Razgovor će se premjestiti u arhivu. Drugi korisnici će moći vidjeti da si napustio/la razgovor.", + "@archiveRoomDescription": {}, + "removeDevicesDescription": "Bit ćeš odjavljen/a s ovog uređaja i više nećeš moći primati poruke.", + "@removeDevicesDescription": {}, + "noUsersFoundWithQuery": "Nažalost nije pronađen nijedan korisnik s „{query}”. Provjeri točnost upisa.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "restoreSessionBody": "Aplikacija sada pokušava obnoviti tvoju sesiju iz sigurnosne kopije. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "requestedKeyVerification": "{sender} je zatražio/la potvrđivanje ključa", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "restricted": "Ograničeni", + "@restricted": {}, + "roomUpgradeDescription": "Razgovor će se tada ponovo stvoriti s novom verzijom sobe. Svi sudionici će biti obaviješteni da se moraju prebaciti na novi razgovor. Više o verzijama soba možeš saznati na https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "noGoogleServicesWarning": "Čini se da Firebase Cloud Messaging nije dostupan na tvom uređaju. Za daljnje primanje push obavijesti, preporučujemo da instaliraš ntfy. S ntfy ili drugim pružateljem usluge Unified Push možeš primati push obavijesti na podatkovno siguran način. Ntfy možeš preuzeti s PlayStorea ili s F-Droida.", + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "verifyOtherDeviceDescription": "Kada potvrdiš jedan drugi uređaj, ti uređaji mogu razmjenjivati ključeve, povećavajući tvoju ukupnu sigurnost. 💪 Kada pokreneš provjeru, pojavit će se skočni prozor u aplikaciji na oba uređaja. Tamo ćeš tada vidjeti niz emojija ili brojeve koje moraš međusobno usporediti. Najbolje je imati oba uređaja pri ruci prije nego što započneš provjeru. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherUserDescription": "Ako potvrdiš jednog drugog korisnika, možeš biti siguran/na da znaš kome zapravo pišeš. 💪\n\nKada pokreneš provjeru, vi i drugi korisnik vidjet ćete skočni prozor u aplikaciji. Tamo ćeš tada vidjeti niz emojija ili brojeve koje morate međusobno usporediti.\n\nNajbolji način za to je da se nađete zajedno ili započnete videopoziv. 👭", + "@verifyOtherUserDescription": {}, + "knockRestricted": "Pokucaj na ograničene sobe", + "@knockRestricted": {}, + "hideMemberChangesInPublicChatsBody": "Za bolju čitljivosti, na vremenskoj traci razgovora nemoj prikazivati kad se netko pridruži ili napusti javni razgovor.", + "@hideMemberChangesInPublicChatsBody": {}, + "makeAdminDescription": "Nakon postavljanja ovog korisnika kao administratora, to možda nećeš moći poništiti jer će on tada imati iste dozvole kao i ti.", + "@makeAdminDescription": {}, + "leaveEmptyToClearStatus": "Ostavi prazno za brisanje tvog stanja.", + "@leaveEmptyToClearStatus": {}, + "forwardMessageTo": "Proslijediti poruku u sobu {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "minimumPowerLevel": "{level} je najmanja razina prava.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "databaseBuildErrorBody": "Nije moguće izgraditi SQlite bazu podataka. Aplikacija za sada pokušava koristiti staru bazu podataka. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendReadReceipts": "Šalji potvrde o čitanju", + "@sendReadReceipts": {}, + "acceptedKeyVerification": "{sender} je prihvatio/la potvrđivanje ključa", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} je prekinuo/la potvrđivanje ključa", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} je pokrenuo/la potvrđivanje ključa", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "commandHint_unignore": "Poništi zanemarivanje navedenog matrix ID-a", + "@commandHint_unignore": {}, + "noDatabaseEncryption": "Šifriranje baze podataka nije podržano na ovoj platformi", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Broj trenutačno blokiranih korisnika: {count}.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "swipeRightToLeftToReply": "Za odgovaranje povuci prstom zdesna ulijevo", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + } } diff --git a/assets/l10n/intl_hu.arb b/assets/l10n/intl_hu.arb index 1ef0a7dbda..8bd45c7f31 100644 --- a/assets/l10n/intl_hu.arb +++ b/assets/l10n/intl_hu.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} elfogadta a meghívást", + "acceptedTheInvitation": "👍 {username} elfogadta a meghívást", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,23 +23,13 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Fiókinformációk", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktiválta a végpontok közötti titkosítást", + "activatedEndToEndEncryption": "🔐 {username} aktiválta a végpontok közötti titkosítást", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "addGroupDescription": "Csoportleírás hozzáadása", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Admin", "@admin": { "type": "text", @@ -50,12 +40,7 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Van már fiókod?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} megválaszolta a hívást", + "answeredTheCall": "{senderName} felvette a hívást", "@answeredTheCall": { "type": "text", "placeholders": { @@ -72,54 +57,29 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Archivált szoba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Csatlakozhatnak-e vendégek", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "areYouSure": "Biztos vagy benne?", + "areYouSure": "Biztos benne?", "@areYouSure": { "type": "text", "placeholders": {} }, - "askSSSSCache": "A kulcsok gyorsítótárazásához meg kell adni a biztonságos tárolóhoz tartozó jelmondatot vagy a visszaállítási kulcsot.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "A másik fél igazolásához meg kell adni a biztonságos tároló jelmondatát vagy a visszaállítási kulcsot.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "A munkamenet hitelesítéséhez meg kell adni a biztonságos tároló jelmondatát vagy a visszaállítási kulcsot.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Elfogadod {username} hitelesítési kérelmét?", + "askVerificationRequest": "Elfogadja {username} hitelesítési kérelmét?", "@askVerificationRequest": { "type": "text", "placeholders": { "username": {} } }, - "authentication": "Hitelesítés", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "A profilkép megváltozott", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Kitiltás a csevegésből", + "banFromChat": "Kitiltás csevegésből", "@banFromChat": { "type": "text", "placeholders": {} @@ -142,11 +102,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Kulcsok gyorsítótárazva", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Mégse", "@cancel": { "type": "text", @@ -164,7 +119,7 @@ "username": {} } }, - "changedTheChatDescriptionTo": "{username} módosította a csevegés leírását erre: „{description}”", + "changedTheChatDescriptionTo": "{username} módosította a csevegés leírását erre: '{description}'", "@changedTheChatDescriptionTo": { "type": "text", "placeholders": { @@ -172,7 +127,7 @@ "description": {} } }, - "changedTheChatNameTo": "{username} módosította a csevegés nevét erre: „{chatname}”", + "changedTheChatNameTo": "{username} módosította a csevegés nevét erre: '{chatname}'", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -187,7 +142,7 @@ "username": {} } }, - "changedTheDisplaynameTo": "{username} módosította a megjenelítési nevét erre: {displayname}", + "changedTheDisplaynameTo": "{username} módosította a megjelenített nevét erre: '{displayname}'", "@changedTheDisplaynameTo": { "type": "text", "placeholders": { @@ -195,14 +150,14 @@ "displayname": {} } }, - "changedTheGuestAccessRules": "{username} módosította a vendégek hozzáférési szabályait", + "changedTheGuestAccessRules": "{username} módosította a vendégek hozzáférési szabályokat", "@changedTheGuestAccessRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheGuestAccessRulesTo": "{username} módosította a vendégek hozzáférési szabályait, így: {rules}", + "changedTheGuestAccessRulesTo": "{username} módosította a vendégek hozzáférési szabályait erre: {rules}", "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { @@ -217,7 +172,7 @@ "username": {} } }, - "changedTheHistoryVisibilityTo": "{username} módosította az előzmények láthatóságát, így: {rules}", + "changedTheHistoryVisibilityTo": "{username} módosította az előzmények láthatóságát erre: {rules}", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -232,7 +187,7 @@ "username": {} } }, - "changedTheJoinRulesTo": "{username} módosította a csatlakozási szabályokat, így: {joinRules}", + "changedTheJoinRulesTo": "{username} módosította a csatlakozási szabályokat erre: {joinRules}", "@changedTheJoinRulesTo": { "type": "text", "placeholders": { @@ -247,7 +202,7 @@ "username": {} } }, - "changedTheRoomAliases": "{username} módosította a szoba címeit", + "changedTheRoomAliases": "{username} módosította a szoba álneveit", "@changedTheRoomAliases": { "type": "text", "placeholders": { @@ -261,22 +216,12 @@ "username": {} } }, - "changelog": "Változásnapló", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Jelszó módosítása", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "A változások mentve", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Matrix-kiszolgáló váltása", + "changeTheHomeserver": "Matrix-kiszolgáló váltás", "@changeTheHomeserver": { "type": "text", "placeholders": {} @@ -291,16 +236,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Kiszolgáló módosítása", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Háttér módosítása", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "A titkosítás megsérült", "@channelCorruptedDecryptError": { "type": "text", @@ -316,27 +251,22 @@ "type": "text", "placeholders": {} }, - "chooseAStrongPassword": "Válassz erős jelszót", + "chooseAStrongPassword": "Válasszon egy erős jelszót", "@chooseAStrongPassword": { "type": "text", "placeholders": {} }, - "chooseAUsername": "Válassz felhasználónevet", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "close": "Bezárás", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Hasonlítsd össze az emodzsikat a másik eszközön lévőkkel, és bizonyosodj meg róla, hogy egyeznek:", + "compareEmojiMatch": "Hasonlítsa össze az emojikat", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Hasonlítsd össze a számokat a másik eszközön lévőkkel, és bizonyosodj meg arról, hogy egyeznek:", + "compareNumbersMatch": "Kérem hasonlítsa össze a számokat", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -351,21 +281,11 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Csatlakozási kísérlet sikertelen", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Meghívtad az ismerősödet a csoportba", + "contactHasBeenInvitedToTheGroup": "Meghívta ismerősét a csoportba", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "contentViewer": "Tartalommegjelenítő", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Vágólapra másolva", "@copiedToClipboard": { "type": "text", @@ -376,23 +296,13 @@ "type": "text", "placeholders": {} }, - "couldNotDecryptMessage": "Nem sikerült visszafejteni a titkosított üzenetet: {error}", + "couldNotDecryptMessage": "Nem sikerült visszafejteni az üzenetet: {error}", "@couldNotDecryptMessage": { "type": "text", "placeholders": { "error": {} } }, - "couldNotSetAvatar": "Nem sikerült beállítani a profilképet", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nem sikerült beállítani a megjelenítési nevet", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} résztvevő", "@countParticipants": { "type": "text", @@ -405,33 +315,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Új fiók létrehozása", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} létrehozta a csevegést", + "createdTheChat": "💬 {username} csevegést hozott létre", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Új csoport létrehozása", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Eszközök közti aláírás kikapcsolva", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Eszközök közti aláírás bekapcsolva", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Jelenleg aktív", "@currentlyActive": { "type": "text", @@ -467,7 +357,7 @@ "day": {} } }, - "deactivateAccountWarning": "Ez deaktiválja a felhasználói fiókodat. Ez nem vonható vissza! Biztos vagy benne?", + "deactivateAccountWarning": "Ez deaktiválja a felhasználói fiókját. Ez nem vonható vissza! Biztos benne?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} @@ -487,11 +377,6 @@ "type": "text", "placeholders": {} }, - "deny": "Elutasítás", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Eszköz", "@device": { "type": "text", @@ -502,62 +387,47 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Kép elvetése", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Megjelenítési név megváltozott", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Adományozás", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Fájl letöltése", "@downloadFile": { "type": "text", "placeholders": {} }, - "editDisplayname": "Megjelenítési név módosítása", + "editDisplayname": "Megjelenítési név szerkesztése", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Jitsi példány módosítása", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "emoteExists": "A hangulatjel már létezik!", "@emoteExists": { "type": "text", "placeholders": {} }, - "emoteInvalid": "Érvénytelen hangulatjel rövid kód!", + "emoteInvalid": "Érvénytelen emoji rövidkód!", "@emoteInvalid": { "type": "text", "placeholders": {} }, - "emotePacks": "Hangulatjel-csomagok a szobához", + "emotePacks": "Emoji csomagok a szobához", "@emotePacks": { "type": "text", "placeholders": {} }, - "emoteSettings": "Hangulatjel-beállítások", + "emoteSettings": "Emoji Beállítások", "@emoteSettings": { "type": "text", "placeholders": {} }, - "emoteShortcode": "Rövid kód a hangulatjelhez", + "emoteShortcode": "Emoji rövidkód", "@emoteShortcode": { "type": "text", "placeholders": {} }, - "emoteWarnNeedToPick": "A hangulatjelhez egy képet és egy rövid kódot kell választani!", + "emoteWarnNeedToPick": "Az emojihoz egy képet és egy rövidkódot kell választani!", "@emoteWarnNeedToPick": { "type": "text", "placeholders": {} @@ -567,12 +437,12 @@ "type": "text", "placeholders": {} }, - "enableEmotesGlobally": "Hangulatjel-csomag engedélyezése globálisan", + "enableEmotesGlobally": "Emoji csomag engedélyezése globálisan", "@enableEmotesGlobally": { "type": "text", "placeholders": {} }, - "enableEncryptionWarning": "Többé nem fogod tudni kikapcsolni a titkosítást. Biztos vagy benne?", + "enableEncryptionWarning": "Többé nem fogja tudni kikapcsolni a titkosítást. Biztos benne?", "@enableEncryptionWarning": { "type": "text", "placeholders": {} @@ -582,21 +452,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Titkosítási algoritmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Titkosítás nincs engedélyezve", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Végpontok közötti titkosítás beállításai", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} befejezte a hívást", "@endedTheCall": { "type": "text", @@ -604,17 +464,7 @@ "senderName": {} } }, - "enterAGroupName": "Adj meg egy csoportnevet", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Adj meg egy felhasználónevet", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Add meg a Matrix-kiszolgálód", + "enterYourHomeserver": "Adja meg a Matrix-kiszolgálót", "@enterYourHomeserver": { "type": "text", "placeholders": {} @@ -624,11 +474,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Fájlméret", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -639,11 +484,6 @@ "type": "text", "placeholders": {} }, - "friday": "Péntek", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Csatlakozás óta", "@fromJoining": { "type": "text", @@ -659,22 +499,12 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Csoport leírása", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "A csoport leírása megváltozott", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "A csoport nyilvános", "@groupIsPublic": { "type": "text", "placeholders": {} }, - "groupWith": "Csoport vele: {displayname}", + "groupWith": "Csoport {displayname}-al", "@groupWith": { "type": "text", "placeholders": { @@ -714,11 +544,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Ez a Matrix-kiszolgáló nem kompatibilis", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "id": "ID", "@id": { "type": "text", @@ -734,16 +559,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Figyelmen kívül hagyhatja azon felhasználókat, akik zavarják. Nem fog üzeneteket vagy szobameghívókat kapni a személyes listáján szereplő felhasználóktól.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Felhasználó figyelmen kívül hagyása", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "incorrectPassphraseOrKey": "Hibás jelmondat vagy visszaállítási kulcs", "@incorrectPassphraseOrKey": { "type": "text", @@ -766,7 +581,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} meghívta: {targetName}", + "invitedUser": "📩 {username} meghívta {targetName}-t", "@invitedUser": { "type": "text", "placeholders": { @@ -774,12 +589,12 @@ "targetName": {} } }, - "invitedUsersOnly": "Csak meghívottak", + "invitedUsersOnly": "Csak meghívott felhasználók", "@invitedUsersOnly": { "type": "text", "placeholders": {} }, - "inviteText": "{username} meghívott a FluffyChat alkalmazásba. \n1. Telepítsd a FluffyChat appot: https://fluffychat.im \n2. Regisztrálj, vagy jelentkezz be. \n3. Nyisd meg a meghívó hivatkozást: {link}", + "inviteText": "{username} meghívott a FluffyChat-be.\n1. Keresse fel a fluffychat.im oldalt, és telepítse az alkalmazást \n2. Regisztráljon vagy jelentkezzen be \n3. Nyissa meg a meghívó linket: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -787,17 +602,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Helyes-e a következő eszközkulcs?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "gépel…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} csatlakozott a csevegéshez", + "joinedTheChat": "👋 {username} csatlakozott a csevegéshez", "@joinedTheChat": { "type": "text", "placeholders": { @@ -809,17 +619,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Kulcsok gyorsítótárazva", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "A kulcsok hiányoznak", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} kirúgta: {targetName}", + "kicked": "👞 {username} kirúgta {targetName}-t", "@kicked": { "type": "text", "placeholders": { @@ -827,7 +627,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} kirúgta és kitiltotta: {targetName}", + "kickedAndBanned": "🙅 {username} kirúgta és kitiltotta {targetName}-t", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -847,17 +647,7 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Utoljára látott IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Már régen látta", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Csevegés elhagyása", + "leave": "Elhagyás", "@leave": { "type": "text", "placeholders": {} @@ -867,7 +657,7 @@ "type": "text", "placeholders": {} }, - "license": "Licenc", + "license": "Licensz", "@license": { "type": "text", "placeholders": {} @@ -884,7 +674,7 @@ "count": {} } }, - "loadingPleaseWait": "Betöltés… Kérlek, várj.", + "loadingPleaseWait": "Betöltés… Kérem, várjon.", "@loadingPleaseWait": { "type": "text", "placeholders": {} @@ -911,41 +701,16 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Kinevezés moderátorrá", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Kinevezés adminná", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Bizonyosodj meg az azonosító helyességéről", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "mention": "Megemlítés", "@mention": { "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Az üzenet minden résztvevő számára törlődni fog", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderátor", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Hétfő", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Csevegés némítása", "@muteChat": { "type": "text", @@ -956,7 +721,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Új üzenet a FluffyChat alkalmazásban", + "newMessageInFluffyChat": "💬 Új FluffyChat üzenet", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -971,59 +736,37 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "A FluffyChat jelenleg nem támogatja az eszközök közti aláírás bekapcsolását. Engedélyezd az Elementben.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nincsenek hangulatjelek. 😕", + "noEmotesFound": "Emojik nem elérhetőek. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Úgy tűnik, hogy nincsenek Google szolgáltatások a telefonodon. Ez adatvédelmi szempontból jó döntés! Ahhoz, hogy push értesítéseket fogadhass a FluffyChat alkalmazásban, a microG használatát javasoljuk: https://microg.org/.", + "noGoogleServicesWarning": "Úgy tűnik a Firebase Cloud Messaging nem elérhető a készülékén. Ha mégis push értesítéseket kíván kapni, javasoljuk a ntfy telepítését. A ntfy vagy más egyéb Egyesített Push szolgáltató esetében úgy kaphat értesítést, hogy adatai biztonságban maradnak. Letöltheti a ntfy-t a PLayStore-ból, vagy F-Droid-ról is.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "A FluffyChat jelenleg nem támogatja az online kulcsmentést. Engedélyezd az Elementben.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Nincs", "@none": { "type": "text", "placeholders": {} }, - "noPermission": "Nincsenek engedélyek", + "noPermission": "Nincs engedély", "@noPermission": { "type": "text", "placeholders": {} }, - "noRoomsFound": "Nem találhatók szobák…", + "noRoomsFound": "Nem találhatóak szobák…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Nem támogatott a webes verzióban", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} kiválasztva", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "offline": "Offline", "@offline": { "type": "text", "placeholders": {} }, - "ok": "OK", + "ok": "Rendben", "@ok": { "type": "text", "placeholders": {} @@ -1033,17 +776,12 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Online kulcsmentés letiltva", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Online kulcsmentés engedélyezve", "@onlineKeyBackupEnabled": { "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "Hoppá, valami baj történt…", + "oopsSomethingWentWrong": "Hoppá, valami hiba lépett fel…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1058,17 +796,7 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "Csoportnév (nem kötelező)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Résztvevő felhasználók eszközei", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "Jelmondat vagy visszaállítási kulcs", + "passphraseOrKey": "jelmondat vagy visszaállítási kulcs", "@passphraseOrKey": { "type": "text", "placeholders": {} @@ -1078,7 +806,7 @@ "type": "text", "placeholders": {} }, - "passwordHasBeenChanged": "A jelszó módosítva", + "passwordHasBeenChanged": "A jelszó módosításra került", "@passwordHasBeenChanged": { "type": "text", "placeholders": {} @@ -1100,22 +828,12 @@ "fileName": {} } }, - "pleaseChooseAUsername": "Válassz egy felhasználónevet", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Írj be egy Matrix-azonosítót.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Add meg a jelszavad", + "pleaseEnterYourPassword": "Kérem adja meg jelszavát", "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} }, - "pleaseEnterYourUsername": "Add meg a felhasználónevedet", + "pleaseEnterYourUsername": "Adja meg a felhasználónevét", "@pleaseEnterYourUsername": { "type": "text", "placeholders": {} @@ -1142,7 +860,7 @@ "username": {} } }, - "reject": "Elutasítás", + "reject": "Elutasít", "@reject": { "type": "text", "placeholders": {} @@ -1154,7 +872,7 @@ "username": {} } }, - "rejoin": "Újracsatlakozás", + "rejoin": "Újra csatlakozás", "@rejoin": { "type": "text", "placeholders": {} @@ -1169,7 +887,7 @@ "type": "text", "placeholders": {} }, - "removedBy": "{username} törölte", + "removedBy": "{username} által törölve", "@removedBy": { "type": "text", "placeholders": { @@ -1181,16 +899,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "Kitiltás feloldása", + "unbanFromChat": "Csevegés kitiltás feloldása", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "Üzenet eltávolítása", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Formázott üzenetek megjelenítése", "@renderRichContent": { "type": "text", @@ -1206,31 +919,11 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Hozzáférés kérése a korábbi üzenetekhez", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Minden jogosultság megvonása", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "A szoba frissítve lett", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "Szombat", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Csevegés keresése", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "seenByUser": "{username} látta", "@seenByUser": { "type": "text", @@ -1238,22 +931,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{{username} és {count} másik résztvevő látta}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username} és {username2} látta", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Küldés", "@send": { "type": "text", @@ -1269,11 +946,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Hibajelentések engedélyezése a sentry.io használatával", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Fájl küldése", "@sendFile": { "type": "text", @@ -1294,35 +966,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} fájlt küldött", + "sentAFile": "📁 {username} küldött egy fájlt", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} hangüzenetet küldött", + "sentAnAudio": "🎤 {username} hangüzenetet küldött", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} képet küldött", + "sentAPicture": "🖼️ {username} képüzenetet küldött", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} matricát küldött", + "sentASticker": "😊 {username} matricát küldött", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} videót küldött", + "sentAVideo": "🎥 {username} videót küldött", "@sentAVideo": { "type": "text", "placeholders": { @@ -1336,26 +1008,6 @@ "senderName": {} } }, - "sentryInfo": "Adatvédelmi információk: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Munkamenet hitelesítve", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Profilkép beállítása", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Csoportleírás beállítása", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Meghívó hivatkozás beállítása", "@setInvitationLink": { "type": "text", @@ -1383,11 +1035,6 @@ "username": {} } }, - "signUp": "Regisztráció", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Kihagyás", "@skip": { "type": "text", @@ -1405,12 +1052,7 @@ "senderName": {} } }, - "startYourFirstChat": "Kezdj el csevegni :-)", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Hogy vagy?", + "statusExampleMessage": "Hogy érzi ma magát?", "@statusExampleMessage": { "type": "text", "placeholders": {} @@ -1420,21 +1062,11 @@ "type": "text", "placeholders": {} }, - "sunday": "Vasárnap", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Rendszer", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "Koppintás a menü megjelenítéséhez", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Nem egyeznek", "@theyDontMatch": { "type": "text", @@ -1445,26 +1077,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Ez a szoba archiválva lett.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Csütörtök", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1476,12 +1088,7 @@ "type": "text", "placeholders": {} }, - "tuesday": "Kedd", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nem érhető el", + "unavailable": "Nem elérhető", "@unavailable": { "type": "text", "placeholders": {} @@ -1509,19 +1116,14 @@ "type": "text", "placeholders": {} }, - "unknownEvent": "Ismeretlen esemény: „{type}”", + "unknownEvent": "Ismeretlen esemény: '{type}'", "@unknownEvent": { "type": "text", "placeholders": { "type": {} } }, - "unknownSessionVerify": "Ismeretlen munkamenet, kérlek hitelesítsd", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Csevegés némításának megszüntetése", + "unmuteChat": "Csevegés némítás feloldása", "@unmuteChat": { "type": "text", "placeholders": {} @@ -1531,25 +1133,13 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} olvasatlan csevegés}}", + "unreadChats": "{unreadCount, plural, =1{1 olvasatlan csevegés} other{{unreadCount} olvasatlan csevegés}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} olvasatlan üzenet}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED kompatibilis színek használata?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} és {count} másik résztvevő gépel…", "@userAndOthersAreTyping": { "type": "text", @@ -1573,7 +1163,7 @@ "username": {} } }, - "userLeftTheChat": "{username} elhagyta a csevegést", + "userLeftTheChat": "🚪 {username} elhagyta a csevegést", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -1593,21 +1183,11 @@ "type": {} } }, - "verifiedSession": "Sikeresen hitelesítetted a munkamenetet!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Hitelesítés", + "verify": "Hitelesít", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Kézi hitelesítés", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Hitelesítés megkezdése", "@verifyStart": { "type": "text", @@ -1623,11 +1203,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Felhasználó hitelesítése", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videóhívás", "@videoCall": { "type": "text", @@ -1653,12 +1228,12 @@ "type": "text", "placeholders": {} }, - "waitingPartnerAcceptRequest": "Várakozás partnerre, amíg elfogadja a kérést…", + "waitingPartnerAcceptRequest": "Várakozás a partnerre, hogy elfogadja a kérést…", "@waitingPartnerAcceptRequest": { "type": "text", "placeholders": {} }, - "waitingPartnerEmoji": "Várakozás partnerre, hogy elfogadja a hangulatjeleket…", + "waitingPartnerEmoji": "Várakozás a partnerre, hogy elfogadja az emojit…", "@waitingPartnerEmoji": { "type": "text", "placeholders": {} @@ -1668,7 +1243,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Háttér", + "wallpaper": "Háttér:", "@wallpaper": { "type": "text", "placeholders": {} @@ -1678,27 +1253,12 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "A végpontok közötti titkosítás egyelőre béta! Csak saját felelősségre!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Szerda", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Üdvözöl a legcukibb Matrix üzenetküldő alkalmazás.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "Ki csatlakozhat a csoporthoz", "@whoIsAllowedToJoinThisGroup": { "type": "text", "placeholders": {} }, - "writeAMessage": "Írj egy üzenetet…", + "writeAMessage": "Írjon egy üzenetet…", "@writeAMessage": { "type": "text", "placeholders": {} @@ -1708,42 +1268,27 @@ "type": "text", "placeholders": {} }, - "you": "Te", + "you": "Ön", "@you": { "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Meghívtak ebbe a csevegésbe", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Nem veszel részt ebben a csevegésben", + "youAreNoLongerParticipatingInThisChat": "Immáron nem vesz részt ebben a csevegésben", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Nem tudod meghívni magadat", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Kitiltottak ebből a csevegésből", + "youHaveBeenBannedFromThisChat": "Kitiltották ebből a csevegésből", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "A saját felhasználóneved", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Ezzekkel a címekkel vissza tudod állítani a jelszavad, ha szükséges", + "withTheseAddressesRecoveryDescription": "Ezekkel a címekkel vissza tudja állítani a jelszavát.", "@withTheseAddressesRecoveryDescription": { "type": "text", "placeholders": {} }, - "weSentYouAnEmail": "Küldtünk neked egy emailt", + "weSentYouAnEmail": "Küldtünk Önnek egy emailt", "@weSentYouAnEmail": { "type": "text", "placeholders": {} @@ -1753,7 +1298,7 @@ "type": "text", "placeholders": {} }, - "noPasswordRecoveryDescription": "Még nem adtál meg semmilyen módot a jelszavad visszaállítására", + "noPasswordRecoveryDescription": "Még nem adott meg semmilyen módot a jelszava visszaállítására.", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} @@ -1768,7 +1313,7 @@ "type": "text", "placeholders": {} }, - "enterAnEmailAddress": "Adj meg egy email címet", + "enterAnEmailAddress": "Adjon meg egy email címet", "@enterAnEmailAddress": { "type": "text", "placeholders": {} @@ -1783,7 +1328,7 @@ "type": "text", "placeholders": {} }, - "directChats": "Közvetlen beszélgetés", + "directChats": "Közvetlen csevegések", "@directChats": { "type": "text", "placeholders": {} @@ -1805,11 +1350,6 @@ "type": "text", "placeholders": {} }, - "addNewFriend": "Új barát hozzáadása", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "all": "Összes", "@all": { "type": "text", @@ -1839,21 +1379,14 @@ "type": "text", "placeholders": {} }, - "yourUserId": "Saját Matrix címed:", - "@yourUserId": {}, "addToSpace": "Hozzáadás térhez", "@addToSpace": {}, - "areYouSureYouWantToLogout": "Biztos, hogy kijelentkezel?", + "areYouSureYouWantToLogout": "Biztosan kijelentkezik?", "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "audioPlayerPlay": "Lejátszás", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "A Matrix-kiszolgáló a következő bejelentkezéseket támogatja:\n{serverVersions}\nDe ez az alkalmazást csak ezeket támogatja:\n{supportedVersions}", + "badServerLoginTypesException": "A kiszolgáló a következő bejelentkezéseket támogatja:\n{serverVersions}\nDe ez az alkalmazást csak ezeket támogatja:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", "placeholders": { @@ -1866,28 +1399,12 @@ "type": "text", "placeholders": {} }, - "passwordsDoNotMatch": "A jelszavak nem egyeznek.", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "Válasszon legalább {min} karaktert.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "pleaseEnterValidEmail": "Adjon meg egy érvényes e-mail-címet.", - "@pleaseEnterValidEmail": {}, - "appLock": "Alkalmazászár", + "appLock": "Alkalmazás zár", "@appLock": { "type": "text", "placeholders": {} }, - "audioPlayerPause": "Szüneteltetés", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomnick": "Az ebben a szobában megjelenített beceneved megváltoztatása", + "commandHint_myroomnick": "Az ebben a szobában megjelenített neved megváltoztatása", "@commandHint_myroomnick": { "type": "text", "description": "Usage hint for the command /myroomnick" @@ -1907,7 +1424,7 @@ "type": "text", "placeholders": {} }, - "commandHint_myroomavatar": "Az ebben a szobában megjelenített profilképed megváltoztatása (mxc URI-t kell megadni)", + "commandHint_myroomavatar": "Az ebben a szobában megjelenített profilképed megváltoztatása (mxc URI használatával)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" @@ -1917,12 +1434,7 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Beszélgetés engedélyek szerkesztése", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Szoba címeinek szerkesztése", + "editRoomAliases": "Szoba álnevek szerkesztése", "@editRoomAliases": { "type": "text", "placeholders": {} @@ -1932,19 +1444,12 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Engedélyezd a beszélgetések mentését, hogy soha ne veszítsd el a beszélgetéseidhez való hozzáférést.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Titkosítás bekapcsolása", + "enableEncryption": "Titkosítás engedélyezése", "@enableEncryption": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Add meg a tér nevét", - "@enterASpacepName": {}, - "extremeOffensive": "Extrém sértő", + "extremeOffensive": "Rendkívül sértő", "@extremeOffensive": { "type": "text", "placeholders": {} @@ -1964,11 +1469,6 @@ "type": "text", "placeholders": {} }, - "friends": "Ismerősök", - "@friends": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Mennyire sértő ez a tartalom?", "@howOffensiveIsThisContent": { "type": "text", @@ -1979,27 +1479,18 @@ "type": "text", "placeholders": {} }, - "locationPermissionDeniedNotice": "A helymeghatározás nincs engedélyezve az alkalmazásnak. Kérlek engedélyezd, hogy meg tudd osztani a helyzeted.", + "locationPermissionDeniedNotice": "A helymeghatározás nem engedélyezett az alkalmazás számára. Kérem engedélyezze, hogy meg tudja osztani helyzetét.", "@locationPermissionDeniedNotice": { "type": "text", "placeholders": {} }, - "newChat": "Új beszélgetés", + "newChat": "Új csevegés", "@newChat": { "type": "text", "placeholders": {} }, "scanQrCode": "QR kód beolvasása", "@scanQrCode": {}, - "newUsernameDescription": "A Matrix címed valahogy így fog kinézni: @felhasználó:szerver", - "@newUsernameDescription": {}, - "noPublicRoomsFound": "Nem találhatók nyilvános szobák…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "typeInInviteLinkManually": "Meghívási link beírása...", - "@typeInInviteLinkManually": {}, "notificationsEnabledForThisAccount": "Értesítések bekapcsolása ebben a fiókban", "@notificationsEnabledForThisAccount": { "type": "text", @@ -2010,39 +1501,22 @@ "type": "text", "placeholders": {} }, - "oopsPushError": "Oops! Sajnos hiba történt a push értesítések beállításakor.", + "oopsPushError": "Hoppá! Sajnos hiba lépett fel a push értesítések beállításakor.", "@oopsPushError": { "type": "text", "placeholders": {} }, - "loginWithOneClick": "Bejelentkezés egy kattintással", - "@loginWithOneClick": {}, - "discoverGroups": "Csoportok felfedezése", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "A beszélgetés el lett távolítva ebből a térből", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearText": "Szöveg törlése", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "commandHint_create": "Egy üres csoport létrehozása\nA --no-encryption kapcsolóval titkosítatlan szoba hozható létre", + "commandHint_create": "Egy üres csevegő csoport létrehozása\nA --no-encryption kapcsolóval titkosítatlan szoba hozható létre", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" }, - "commandHint_invite": "Felhasználó meghívása ebbe a szobába", + "commandHint_invite": "Adott felhasználó meghívása ebbe a szobába", "@commandHint_invite": { "type": "text", "description": "Usage hint for the command /invite" }, - "locationDisabledNotice": "A helymeghatározás ki van kapcsolva. Kérlek, kapcsold be, hogy meg tudd osztani a helyzeted.", + "locationDisabledNotice": "A helymeghatározás ki van kapcsolva. Kérem, kapcsolja be, hogy meg tudja osztani helyzetét.", "@locationDisabledNotice": { "type": "text", "placeholders": {} @@ -2064,20 +1538,14 @@ "type": "text", "placeholders": {} }, - "setupChatBackup": "Beszélgetések mentésének beállítása", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Leírtam a kulcsot", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "A beszélgetések mentése be lett állítva.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Az üzeneteid védelme érdekében generáltunk neked egy biztonsági kulcsot.\nKérlek, tárold egy biztonságos helyen, mint például egy jelszókezelő.", - "@setupChatBackupDescription": {}, - "chatBackupDescription": "A beszélgetések mentése egy biztonsági kulccsal van védve. Bizonyosodj meg róla, hogy nem fogod elveszíteni.", + "chatBackupDescription": "A régebbi beszélgetései egy biztonsági kulccsal vannak védve. Bizonyosodjon meg róla, hogy nem veszíti el.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "containsDisplayName": "Tartalmazza a megjelenített becenevet", + "containsDisplayName": "Tartalmazza a megjelenített nevet", "@containsDisplayName": { "type": "text", "placeholders": {} @@ -2092,34 +1560,19 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Érvénytelen email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "noConnectionToTheServer": "Nem elérhető a szerver", "@noConnectionToTheServer": { "type": "text", "placeholders": {} }, - "noDescription": "Nincs leírás", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEncryptionForPublicRooms": "Csak akkor kapcsolható be a titkosítás, ha a szoba nem nyilvánosan hozzáférhető.", "@noEncryptionForPublicRooms": { "type": "text", "placeholders": {} }, - "bubbleSize": "Buborék méret", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "A beszélgetés hozzá lett adva ehhez a térhez", "@chatHasBeenAddedToThisSpace": {}, - "chats": "Beszélgetések", + "chats": "Csevegések", "@chats": { "type": "text", "placeholders": {} @@ -2141,7 +1594,7 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_dm": "Közvetlen beszélgetés indítása\nA --no-encryption kapcsolóval titkosítatlan beszélgetés lesz létrehozva", + "commandHint_dm": "Közvetlen csevegés indítása\nA --no-encryption kapcsolóval titkosítatlan beszélgetést hozhat létre", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2161,7 +1614,7 @@ "type": "text", "description": "Usage hint for the command /kick" }, - "commandHint_leave": "Ennek a szobának az elhagyása", + "commandHint_leave": "Szoba elhagyása", "@commandHint_leave": { "type": "text", "description": "Usage hint for the command /leave" @@ -2178,7 +1631,7 @@ }, "description": "State that {command} is not a valid /command." }, - "configureChat": "Beszélgetés beállítása", + "configureChat": "Csevegés konfigurálása", "@configureChat": { "type": "text", "placeholders": {} @@ -2188,29 +1641,19 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Alapértelmezett hozzáférési szint", + "defaultPermissionLevel": "Alapértelmezett hozzáférési szint új felhasználóknak", "@defaultPermissionLevel": { "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "A titkosítás csak akkor biztonságos, ha az összes eszköz ellenőrizve lett.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "discover": "Felfedezés", - "@discover": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Hiba a tartózkodási hely lekérése közben: {error}", + "errorObtainingLocation": "Hiba a tartózkodási hely meghatározása közben: {error}", "@errorObtainingLocation": { "type": "text", "placeholders": { "error": {} } }, - "memberChanges": "Tagság változások", + "memberChanges": "Tagsági változások", "@memberChanges": { "type": "text", "placeholders": {} @@ -2220,7 +1663,7 @@ "type": "text", "placeholders": {} }, - "noMatrixServer": "{server1} nem egy Matrix szerver, használjam a {server2} szervert inkább?", + "noMatrixServer": "{server1} nem egy Matrix szerver, használja a {server2} szervert inkább?", "@noMatrixServer": { "type": "text", "placeholders": { @@ -2228,10 +1671,6 @@ "server2": {} } }, - "createNewChatExplaination": "Egyszerűen szkenneld be a QR kódot, vagy oszdd meg a meghívási linket, ha a szkennelés nem lehetséges.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Meghívási link küldése", - "@shareYourInviteLink": {}, "notifications": "Értesítések", "@notifications": { "type": "text", @@ -2253,5 +1692,1116 @@ "@openVideoCamera": { "type": "text", "placeholders": {} - } + }, + "badServerVersionsException": "A Matrix szerver ezeket a specifikáció verziókat támogatja:\n{serverVersions}\nAzonban ez az app csak ezeket: {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "commandHint_me": "Jellemezd magad", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "commandHint_op": "Az adott felhasználó hozzáférési szintjének megadása (alapértelmezett: 50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Válasz küldése reakcióként", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "commandHint_unban": "Adott felhasználó kitiltásának feloldása a szobához", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "editBlockedServers": "Blokkolt szerverek szerkesztése", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "dehydrate": "Munkamenet exportálása és az eszköz törlése", + "@dehydrate": {}, + "dehydrateWarning": "Ez nem visszavonható. Bizonyosodjon meg róla, hogy biztonságos helyen tárolja a mentett fájlt.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR felhasználók: munkamenet exportálása", + "@dehydrateTor": {}, + "dehydrateTorLong": "TOR felhasználóknak ajánlott a munkamenet exportálása az ablak bezárása előtt.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR felhasználóknak: munkamenet export importálása", + "@hydrateTor": {}, + "hydrate": "Visszaállítás mentett fájlból", + "@hydrate": {}, + "link": "Hivatkozás", + "@link": {}, + "redactMessage": "Üzenet visszavonása", + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "people": "Emberek", + "@people": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourPin": "Írja be PIN kódját", + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "cuddleContent": "{senderName} hozzád bújik", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_markasgroup": "Csoportnak jelölés", + "@commandHint_markasgroup": {}, + "addAccount": "Fiók hozzáadása", + "@addAccount": {}, + "search": "Keresés", + "@search": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "Gülüszemek küldése", + "@commandHint_googly": {}, + "commandHint_cuddle": "Összebújás küldése", + "@commandHint_cuddle": {}, + "sendMessages": "Üzenetek küldése", + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "sendSticker": "Matrica küldése", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "reportMessage": "Üzenet jelentése", + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "participant": "Résztvevő", + "@participant": { + "type": "text", + "placeholders": {} + }, + "passwordForgotten": "Elfelejtett jelszó", + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "roomVersion": "Szoba verzió", + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "confirmMatrixId": "A fiók törléséhez adja meg a Matrix ID-t.", + "@confirmMatrixId": {}, + "or": "Vagy", + "@or": { + "type": "text", + "placeholders": {} + }, + "pleaseChoose": "Kérjük válasszon", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "commandHint_hug": "Ölelés küldése", + "@commandHint_hug": {}, + "reason": "Indok", + "@reason": { + "type": "text", + "placeholders": {} + }, + "register": "Regisztráció", + "@register": { + "type": "text", + "placeholders": {} + }, + "saveFile": "Fájl mentése", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "googlyEyesContent": "{senderName} gülüszemeket küld", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "openInMaps": "Megnyitás térképen", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "pleaseEnter4Digits": "Írjon be 4 számjegyet, vagy hagyja üresen a zár kikapcsolásához.", + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "security": "Biztonság", + "@security": { + "type": "text", + "placeholders": {} + }, + "notAnImage": "Nem kép fájl.", + "@notAnImage": {}, + "showPassword": "Jelszó mutatása", + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "hugContent": "{senderName} megölelt", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "jumpToLastReadMessage": "Az utoljára olvasott üzenethez ugrás", + "@jumpToLastReadMessage": {}, + "allRooms": "Minden csoport csevegés", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "widgetVideo": "Videó", + "@widgetVideo": {}, + "dismiss": "Elvetés", + "@dismiss": {}, + "reportErrorDescription": "😭 Sajnos valami félresiklott. Ha kívánja jelezheti a bugot a fejlesztőknek.", + "@reportErrorDescription": {}, + "setPermissionsLevel": "Jogok beállítása", + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "removeYourAvatar": "Profilkép törlése", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Nem támogatott Android verzió", + "@unsupportedAndroidVersion": {}, + "widgetJitsi": "Jitsi Találkozó", + "@widgetJitsi": {}, + "messageType": "Üzenet típus", + "@messageType": {}, + "indexedDbErrorLong": "Sajnos az üzenet mentés alapból nincs bekapcsolva privát módban.\nKeresse meg a\n - about:config\n - állítsa a dom.indexedDB.privateBrowsing.enabled \"true\"-ra\nMáskülönben nem lehetséges a FluffyChat futtatása.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Az egyik kliense kijelentkezett", + "@oneClientLoggedOut": {}, + "toggleMuted": "Némítottak mutatása", + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "Kezdje meg első csevegését", + "@startFirstChat": {}, + "callingAccount": "Hívási fiók", + "@callingAccount": {}, + "setColorTheme": "Szín téma beállítása:", + "@setColorTheme": {}, + "nextAccount": "Következő fiók", + "@nextAccount": {}, + "singlesignon": "Egyszeri bejelentkezés", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "allSpaces": "Minden tér", + "@allSpaces": {}, + "supposedMxid": "{mxid}-nek kell lennie", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "user": "Felhasználó", + "@user": {}, + "youAcceptedTheInvitation": "👍 Elfogadta a meghívást", + "@youAcceptedTheInvitation": {}, + "youInvitedBy": "📩 Meghívást kapott {user}-tól", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "banUserDescription": "A felhasználó kitiltásra kerül a csevegésből, és nem fog tudni visszajönni egészen a kitiltás feloldásáig.", + "@banUserDescription": {}, + "widgetEtherpad": "Szöveges megjegyzés", + "@widgetEtherpad": {}, + "removeDevicesDescription": "Ki fog jelentkezni a készülékről, és többi nem fog tudni fogadni üzeneteket.", + "@removeDevicesDescription": {}, + "separateChatTypes": "Csoportok és közvetlen üzenetek elkülönítése", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "tryAgain": "Próbálja újra", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Kirúgta és kitiltotta {user}-t", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "unbanUserDescription": "A felhasználó vissza tud jönni a csevegésbe ha akar.", + "@unbanUserDescription": {}, + "pleaseClickOnLink": "Kérem kattintson a linkre az emailben, és folytassa a műveletet.", + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "youRejectedTheInvitation": "Visszautasította a meghívást", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Mikrofon, kamera, és más egyéb FluffyChat engedélyek", + "@otherCallingPermissions": {}, + "messagesStyle": "Üzenetek:", + "@messagesStyle": {}, + "widgetUrlError": "Ez nem egy valós cím.", + "@widgetUrlError": {}, + "emailOrUsername": "Email vagy felhasználónév", + "@emailOrUsername": {}, + "newSpaceDescription": "A terek lehetővé teszik a csevegések konszolidációját, ezáltal létrehozva publikus vagy privát közösségeket.", + "@newSpaceDescription": {}, + "chatDescription": "Csevegés leírás", + "@chatDescription": {}, + "callingAccountDetails": "Engedélyezés a FluffyChat számára hogy használja a natív android hívás applikációt.", + "@callingAccountDetails": {}, + "pleaseFollowInstructionsOnWeb": "Kérem kövesse az instrukciókat az oldalon, és nyomjon a tovább gombra.", + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "enterSpace": "Belépés a térre", + "@enterSpace": {}, + "encryptThisChat": "A csevegés titkosítása", + "@encryptThisChat": {}, + "previousAccount": "Előző fiók", + "@previousAccount": {}, + "reopenChat": "Csevegés újranyitása", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Kérem adja meg a visszaállító kódját:", + "@pleaseEnterRecoveryKey": {}, + "toggleFavorite": "Kedvencek mutatása", + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "widgetNameError": "Kérem adjon meg egy megjeleníthető nevet.", + "@widgetNameError": {}, + "addToBundle": "Hozzáadás fiókcsoporthoz", + "@addToBundle": {}, + "spaceIsPublic": "A tér publikus", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "addWidget": "Widget hozzáadása", + "@addWidget": {}, + "countFiles": "{count} fájl", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noKeyForThisMessage": "Akkor fordulhat elő, ha az üzenet az eszközre való bejelentkezés előtt került küldésre.\n\nAz is elképzelhető, hogy a küldő blokkolta az eszközét, vagy valami probléma lépett fel az internet kapcsolatban.\n\nMás helyen látja az üzenetet? Akkor át tudja másolni ide is! Menjen a Beállítások > Eszközök részbe, és győződjön meg róla, hogy az eszközei megerősítették egymást. Legközelebb amikor ezt a szobát megnyitja, és mind a két kliens az előtérben van, akkor szikronizálódni fognak.\n\nNem akarja elveszíteni a kulcsokat amikor kijelentkezik, vagy eszközt cserél? Győződjön meg róla, hogy bekapcsolta a chat mentést a beállításokban.", + "@noKeyForThisMessage": {}, + "shareLocation": "Pozíció megosztása", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "pushNotificationsNotAvailable": "Push értesítések nem elérhetőek", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Tárolás az Apple KeyChain-be", + "@storeInAppleKeyChain": {}, + "replaceRoomWithNewerVersion": "Szoba cserélése egy újabb verzióra", + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "invalidServerName": "Hibás szerver név", + "@invalidServerName": {}, + "chatPermissions": "Csevegés engedélyek", + "@chatPermissions": {}, + "wipeChatBackup": "Le kívánja törölni a chat mentését, hogy létrehozhasson egy új visszaállítási kulcsot?", + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "sender": "Küldő", + "@sender": {}, + "storeInAndroidKeystore": "Tárolás az Android KeyStore-ba", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "Bejelentkezés jelszóval", + "@signInWithPassword": {}, + "makeAdminDescription": "Miután a felhasználóból admin lesz, nem fogja tudni visszavonni döntését, mivel azonos jogosultsági szinttel fognak rendelkezni.", + "@makeAdminDescription": {}, + "synchronizingPleaseWait": "Szinkronizálás...kérem várjon.", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "transferFromAnotherDevice": "Másik eszközről való átköltözés", + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "pushRules": "Push szabályok", + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "saveKeyManuallyDescription": "A kulcs manuális mentése rendszer megosztás vagy vágólap másolás segítségével.", + "@saveKeyManuallyDescription": {}, + "editBundlesForAccount": "Fiókcsoportok szerkesztése ehhez a fiókhoz", + "@editBundlesForAccount": {}, + "whyIsThisMessageEncrypted": "Miért nem olvasható ez az üzenet?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Csevegés leírás beállítása", + "@setChatDescription": {}, + "spaceName": "Tér neve", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "importFromZipFile": "Importálás zip fájlból", + "@importFromZipFile": {}, + "toggleUnread": "Jelölés olvasottként/olvasatlanként", + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "noOtherDevicesFound": "Nem található más eszköz", + "@noOtherDevicesFound": {}, + "redactedBy": "{username} által szerkesztve", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "videoCallsBetaWarning": "Kérem vegye figyelembe, hogy a videó hívások jelenleg béta fázisban vannak. Nem biztos, hogy megfelelően fognak működni, vagy egyáltalán elindulnak egyes platformokon.", + "@videoCallsBetaWarning": {}, + "signInWith": "Bejelentkezés a következővel: {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "fileIsTooBigForServer": "A szerver számára túl nagy a fájl a küldéshez.", + "@fileIsTooBigForServer": {}, + "verified": "Visszaigazolt", + "@verified": { + "type": "text", + "placeholders": {} + }, + "callingPermissions": "Hívási engedélyek", + "@callingPermissions": {}, + "readUpToHere": "Ezidáig elolvasva", + "@readUpToHere": {}, + "start": "Kezdés", + "@start": {}, + "unlockOldMessages": "Régi üzenetek feloldása", + "@unlockOldMessages": {}, + "numChats": "{number} csevegés", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "optionalRedactReason": "(Tetszőleges) A szerkesztés oka...", + "@optionalRedactReason": {}, + "sendAsText": "Szövegként küldés", + "@sendAsText": { + "type": "text" + }, + "archiveRoomDescription": "A csevegés bekerül az archívumba. Más felhasználók látni fogják, hogy elhagyta a csevegést.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Emojik exportálása zip-be", + "@exportEmotePack": {}, + "switchToAccount": "A {number} számú fiókra váltás", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "setAsCanonicalAlias": "Beállítás mint alapértelmezett álnév", + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miért kívánja ezt bejelenteni?", + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "experimentalVideoCalls": "Kísérleti videó hívások", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "A régi üzenetei feloldásához adja meg a korábban generált visszaállítási jelszavát. A visszaállítási jelszó NEM UGYANAZ mint a jelszó.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "Meg kívánja hívni {contact}-ot a \"{groupName}\" csevegő csoportba?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "{username} által szerkesztve, mivel: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "Visszavonta a meghívást {user}-tól", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "appearOnTopDetails": "Engedélyezi az app számára, hogy mindig legfelül jelenjen meg (nem szükséges, ha a FluffyChat hívó fiókként lett beállítva)", + "@appearOnTopDetails": {}, + "enterRoom": "Belépés a szobába", + "@enterRoom": {}, + "pleaseChooseAPasscode": "Kérem válasszon egy kódot", + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "reportUser": "Felhasználó jelentése", + "@reportUser": {}, + "confirmEventUnpin": "Biztosan végleg le akarja venni a kitűzött eseményt?", + "@confirmEventUnpin": {}, + "youInvitedUser": "📩 Meghívta {user}-t", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "fileHasBeenSavedAt": "A fájl mentésre került a következő elérési úton {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "redactMessageDescription": "A társalgásban összes résztvevője számára módosításra kerül az üzenet. Ez nem visszavonható.", + "@redactMessageDescription": {}, + "recoveryKey": "Visszaállító kulcs", + "@recoveryKey": {}, + "invalidInput": "Hibás bevitel!", + "@invalidInput": {}, + "yourPublicKey": "A publikus kulcsa", + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "tooManyRequestsWarning": "Túl sok egyidejű kérelem. Kérem próbálja meg később!", + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "doNotShowAgain": "Ne mutassa újra", + "@doNotShowAgain": {}, + "report": "bejelentés", + "@report": {}, + "status": "Státusz", + "@status": { + "type": "text", + "placeholders": {} + }, + "unverified": "Nem visszaigazolt", + "@unverified": {}, + "serverRequiresEmail": "Ehhez a szerverhez szükséges az email címének visszaigazolása.", + "@serverRequiresEmail": {}, + "hideUnimportantStateEvents": "Jelentéktelen esemény státuszok elrejtése", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "képernyő megosztás", + "@screenSharingTitle": {}, + "widgetCustom": "Egyéni", + "@widgetCustom": {}, + "addToSpaceDescription": "Válassza ki melyik térhez kívánja hozzáadni a csevegést.", + "@addToSpaceDescription": {}, + "youBannedUser": "Letitotta {user}-t", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "addChatDescription": "Chat leírás hozzáadása...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user} bekopogott", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "publish": "Közzététel", + "@publish": {}, + "openLinkInBrowser": "Hivatkozás megnyitása böngészőben", + "@openLinkInBrowser": {}, + "messageInfo": "Üzenet információ", + "@messageInfo": {}, + "disableEncryptionWarning": "Biztonsági okokból nem kapcsolható ki egy korábban bekapcsolt csevegés titkosítás.", + "@disableEncryptionWarning": {}, + "directChat": "Közvetlen csevegés", + "@directChat": {}, + "wrongPinEntered": "Hibás pinkód került beírásra. Próbálja újra {seconds} mp múlva...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Gépelési infó megjelenítése", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Meghívó a csoportba", + "@inviteGroupChat": {}, + "appearOnTop": "Mindig legfelül jelenik meg", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Meghívó csevegéshez", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "Ez az értesítés akkor jelenik meg ha az előtéri szolgáltatás fut.", + "@foregroundServiceRunning": {}, + "voiceCall": "Hang hívás", + "@voiceCall": {}, + "importEmojis": "Emojik importálása", + "@importEmojis": {}, + "wasDirectChatDisplayName": "Üres csevegés (korábban {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "Még nincs csevegő szoba leírás.", + "@noChatDescriptionYet": {}, + "removeFromBundle": "Eltávolítás a fiókcsoportból", + "@removeFromBundle": {}, + "whoCanPerformWhichAction": "Ki milyen műveletet végezhet", + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "learnMore": "Tudjon meg többet", + "@learnMore": {}, + "users": "Felhasználók", + "@users": {}, + "openGallery": "Galéria megnyitása", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Csevegés leírás megváltozott", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "Új csoport", + "@newGroup": {}, + "bundleName": "Fiókcsoport neve", + "@bundleName": {}, + "removeFromSpace": "Eltávolítás a térről", + "@removeFromSpace": {}, + "roomUpgradeDescription": "A csevegés újra elkészül az új verzióval. Minden résztvevő értesítést kap, hogy át kell állniuk az új csevegésre. További információkért a szoba verziókról látogasson el a https://spec.matrix.org/latest/rooms/ címre", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Adjon meg egy 0-nál nagyobb számot", + "@pleaseEnterANumber": {}, + "youKicked": "👞 Kirúgta {user}-t", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "profileNotFound": "A felhasználó nem található a szerveren. Lehetséges, hogy csatlakozási problémák adódtak, vagy nem létezik a felhasználó.", + "@profileNotFound": {}, + "jump": "Ugrás", + "@jump": {}, + "reactedWith": "{sender} a következőt reagálta: {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "sorryThatsNotPossible": "Ez sajnos nem lehetséges", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Videó ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "shareInviteLink": "Meghívó link megosztása", + "@shareInviteLink": {}, + "commandHint_markasdm": "Szoba megjelölése mint közvetlen csevegő szoba az adott Matrix ID-nél", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Elveszett visszaállító kulcs?", + "@recoveryKeyLost": {}, + "deviceKeys": "Eszköz kulcsok:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Nemrég használt emojik fognak itt megjelenni...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setCustomEmotes": "Egyéni emojik beállítása", + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Téma beállítása:", + "@setTheme": {}, + "youJoinedTheChat": "Becsatlakozott a csevegésbe", + "@youJoinedTheChat": {}, + "markAsRead": "Olvasottként megjelölés", + "@markAsRead": {}, + "widgetName": "Név", + "@widgetName": {}, + "errorAddingWidget": "Hiba lépett fel a widget hozzáadásánál.", + "@errorAddingWidget": {}, + "replace": "Kicserél", + "@replace": {}, + "youUnbannedUser": "Levette a letiltást {user}-ről", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "newSpace": "Új tér", + "@newSpace": {}, + "emojis": "Emojik", + "@emojis": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Próbálja meg máskor, vagy válasszon másik szervert.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Csoport létrehozása", + "@createGroup": {}, + "hydrateTorLong": "Legutóbb TOR segítségével exportálta korábbi munkamenetét? Gyorsan importálja őket vissza, és folytassa a csevegést.", + "@hydrateTorLong": {}, + "time": "Idő", + "@time": {}, + "custom": "Egyéni", + "@custom": {}, + "noBackupWarning": "Figyelem! Ha nem kapcsolja be a csevegés mentést, elveszíti a hozzáférést a tikosított üzeneteihez. Erősen ajánlott a csevegés mentés bekapcsolása kijelentkezés előtt.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "Tárolja a visszaállítási kulcsot az eszköz biztonsági tárjában.", + "@storeInSecureStorageDescription": {}, + "openChat": "Csevegés megnyitása", + "@openChat": {}, + "kickUserDescription": "A felhasználó kirúgásra került a csevegésből, de nincs kitiltva. Publikus csevegés esetén a felhasználó bármikor visszatérhet.", + "@kickUserDescription": {}, + "importNow": "Importálás most", + "@importNow": {}, + "pinMessage": "Kitűzés a szobában", + "@pinMessage": {}, + "invite": "Meghívás", + "@invite": {}, + "enableMultiAccounts": "(BÉTA) Több fiók bekapcsolása az eszközön", + "@enableMultiAccounts": {}, + "indexedDbErrorTitle": "Privát mód problémák", + "@indexedDbErrorTitle": {}, + "unsupportedAndroidVersionLong": "Ehhez a funkcióhoz egy újabb Android verzió kell. Kérem ellenőrizze be van e frissítve teljesen készüléke, esetlegesen van e LineageOS támogatás hozzá.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Biztonságos tárolás az eszközön", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "Megosztja a képernyőjét a FluffyChat-ben", + "@screenSharingDetail": {}, + "placeCall": "Tér hívás", + "@placeCall": {}, + "block": "Blokkolás", + "@block": {}, + "blockedUsers": "Blokkolt felhasználók", + "@blockedUsers": {}, + "blockListDescription": "Az Önt zavaró felhasználókat blokkolhatja. A blokkolt listán található felhasználóktól nem tud fogadni üzenetet vagy szoba meghívást.", + "@blockListDescription": {}, + "blockUsername": "Felhasználónév mellőzése", + "@blockUsername": {}, + "presenceStyle": "Jelenlét:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Mások státusz üzenetének megjelenítése", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "youInvitedToBy": "📩 Meghívást kapott linken keresztül a következőhöz:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "decline": "Elutasítás", + "@decline": {}, + "yourGlobalUserIdIs": "A globális felhasználó-ID-je: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "\"{query}\" néven nem található felhasználó. Ellenőrizze nincs e elírás.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "acceptedKeyVerification": "{sender} elfogadta a kulcs megerősítést", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "searchForUsers": "Keressen @felhasználókat...", + "@searchForUsers": {}, + "joinSpace": "Csatlakozás a térre", + "@joinSpace": {}, + "publicSpaces": "Nyilvános terek", + "@publicSpaces": {}, + "databaseMigrationTitle": "Adatbázis optimalizálása", + "@databaseMigrationTitle": {}, + "leaveEmptyToClearStatus": "Hagyja üresen a státusz kitörléséhez.", + "@leaveEmptyToClearStatus": {}, + "pleaseEnterYourCurrentPassword": "Kérem adja meg jelenlegi jelszavát", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Új jelszó", + "@newPassword": {}, + "addChatOrSubSpace": "Csevegés vagy al-tér hozzáadása", + "@addChatOrSubSpace": {}, + "pleaseChooseAStrongPassword": "Kérem válasszon egy erős jelszót", + "@pleaseChooseAStrongPassword": {}, + "passwordsDoNotMatch": "A jelszavak nem egyeznek", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "A beírt jelszava hibás", + "@passwordIsWrong": {}, + "subspace": "Al-tér", + "@subspace": {}, + "thisDevice": "Ez az eszköz:", + "@thisDevice": {}, + "forwardMessageTo": "Üzenet továbbítása a {roomName} szobába?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendTypingNotificationsDescription": "A csevegés többi tagja látja amikor gépel.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "A csevegés többi tagja látja melyik üzenetet látta.", + "@sendReadReceiptsDescription": {}, + "sendReadReceipts": "Olvasási igazolás küldése", + "@sendReadReceipts": {}, + "formattedMessages": "Formázott üzenetek", + "@formattedMessages": {}, + "formattedMessagesDescription": "Formázott szöveg - mint például félkövér - megjelenítése \"markdown\"-al.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Más felhasználók igazolása", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Más eszköz megerősítése", + "@verifyOtherDevice": {}, + "sessionLostBody": "A munkamenete elvesződött. Kérem jelentse ezt a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "databaseBuildErrorBody": "Nem lehetséges az SQlite adatbázis létrehozása. Az app megpróbálja a régi típusú adatbázist használni. Kérem jelentse a hibát a fejlesztőknek a {url} linken. A hiba szövege a következő: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Megpróbálkozunk visszaállítani a munkamenetét egy korábbi mentésből. Kérem jelezze a hibát a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "hidePresences": "El kívánja menteni a státusz listát?", + "@hidePresences": {}, + "searchChatsRooms": "Keressen #csevegéseket, @felhasználókat...", + "@searchChatsRooms": {}, + "wrongRecoveryKey": "Sajnos, úgy tűnik hibásan adta meg a visszaállítási kulcsot.", + "@wrongRecoveryKey": {}, + "startConversation": "Beszélgetés indítása", + "@startConversation": {}, + "commandHint_sendraw": "Tiszta json küldése", + "@commandHint_sendraw": {}, + "databaseMigrationBody": "Kérem várjon. Ez igénybe vehet valamennyi időt.", + "@databaseMigrationBody": {}, + "initAppError": "Hiba lépett fel az app indítása során", + "@initAppError": {}, + "canceledKeyVerification": "{sender} nem fogadta el a kulcs megerősítést", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} befejezte a kulcs megerősítést", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} készen áll a kulcs megerősítésre", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} kulcs megerősítést kér", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} elkezdte a kulcs megerősítést", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Átlátszó", + "@transparent": {}, + "incomingMessages": "Bejövő üzenetek", + "@incomingMessages": {}, + "nothingFound": "Nincs találat...", + "@nothingFound": {}, + "publicLink": "Nyilvános hivatkozás", + "@publicLink": {}, + "select": "Kiválaszt", + "@select": {}, + "stickers": "Matrica", + "@stickers": {}, + "discover": "Felfedezés", + "@discover": {}, + "groupName": "Csoport név", + "@groupName": {}, + "createGroupAndInviteUsers": "Hozzon létre egy csoportot és hívjon meg felhasználókat", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Kereséssel megtalálhatja a kívánt csoportot", + "@groupCanBeFoundViaSearch": {}, + "verifyOtherUserDescription": "Ha megerősít egy másik felhasználót, akkor teljesen biztos lehet abban kivel cseveg. 💪\n\nA megerősítési folyamat kezdetekor megjelenik egy felugró ablak mindkettejüknél. Ekkor egy emoji vagy szám sor összehasonlítási folyamat veszi kezdetét.\n\nA legpraktikusabb módja ennek, hogy találkozzanak, vagy videó hívás során beszéljék meg. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Amikor egy másik eszközt erősít meg, az eszközök kulcsokat cserélnek egymás között, ezáltal növelve az összbiztonságot. 💪 Amikor megkezdődik a folyamat, mind a két eszközön megjelenik egy felugró üzenet. Emojik és számok sorozata fog megjelenni, amit össze tud hasonlítani a két eszközön. Érdemes tehát mind a két eszközt a közelben tartani. 🤳", + "@verifyOtherDeviceDescription": {}, + "accessAndVisibility": "Hozzáférés és láthatóság", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Kinek engedélyezett a csevegéshez való csatlakozás és a csevegést hogyan lehet megtalálni.", + "@accessAndVisibilityDescription": {}, + "calls": "Hívások", + "@calls": {}, + "hideInvalidOrUnknownMessageFormats": "Érvénytelen vagy ismeretlen üzenetformátum elrejtése", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChatsBody": "Ne mutassa ha valaki be- vagy kilép a csevegésből az olvashatóság javítása végett.", + "@hideMemberChangesInPublicChatsBody": {}, + "notifyMeFor": "Értesítsen engem", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Jelszó-helyreállítási beállítások", + "@passwordRecoverySettings": {}, + "noOneCanJoin": "Senki sem csatlakozhat", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} szeretne csatlakozni a csevegéshez.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Még nem lett létrehozva nyilvános link", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Csevegés felfedezhető a {server} szerveren történő kereséssel", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "appLockDescription": "Alkalmazás zárolása PIN-kód használat hiányában", + "@appLockDescription": {}, + "customEmojisAndStickers": "Egyedi emotikonok és matricák", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Egyedi emotikonok és matricák létrehozása, amelyek bármely csevegésben használhatóak.", + "@customEmojisAndStickersBody": {}, + "overview": "Áttekintés", + "@overview": {}, + "publicChatAddresses": "Nyilvános csevegés címek", + "@publicChatAddresses": {}, + "userRole": "Felhasználói szerep", + "@userRole": {}, + "createNewAddress": "Új cím létrehozása", + "@createNewAddress": {}, + "noDatabaseEncryption": "Adatbázis titkosítása nem támogatott ezen a platformon", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Jelenleg {count} felhasználó van letiltva.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "unreadChatsInApp": "{appname}: {unread} olvasatlan csevegések", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "searchIn": "Keresés a csevegésben \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "files": "Fájlok", + "@files": {}, + "commandHint_unignore": "Adott matrix ID figyelembe vétele", + "@commandHint_unignore": {}, + "restricted": "Korlátozott", + "@restricted": {}, + "knockRestricted": "Kopogás korlátozva", + "@knockRestricted": {}, + "globalChatId": "Globális csevegő azonosító", + "@globalChatId": {}, + "hideRedactedMessages": "Szerkesztett üzenetek elrejtése", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Ha valaki szerkeszti az üzenetét, ez az üzenet nem jelenik meg a csevegés során.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Tag változások elrejtése a publikus csevegésben", + "@hideMemberChangesInPublicChats": {}, + "knocking": "Bekopogás", + "@knocking": {}, + "usersMustKnock": "A felhasználóknak be kell kopogniuk", + "@usersMustKnock": {}, + "knock": "Kopogás", + "@knock": {}, + "minimumPowerLevel": "{level} a minimum szint.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchMore": "További keresés...", + "@searchMore": {}, + "gallery": "Galéria", + "@gallery": {}, + "commandHint_ignore": "Adott matrix ID figyelmen kívül hagyása", + "@commandHint_ignore": {}, + "unread": "Olvasatlan", + "@unread": {}, + "space": "Tér", + "@space": {}, + "spaces": "Terek", + "@spaces": {}, + "invitedBy": "📩 Meghívva {user} által", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "markAsUnread": "Olvasatlannak jelölés", + "@markAsUnread": {}, + "moderatorLevel": "{level} - Moderátor", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Általános csevegés beállítások módosítása", + "@changeGeneralChatSettings": {}, + "updateInstalled": "🎉 {version} verziójú fejlesztés telepítve!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Változások", + "@changelog": {}, + "sendCanceled": "Visszavonás küldése", + "@sendCanceled": {}, + "noChatsFoundHere": "Itt még nincs csevegés. Kezdjen újat valakivel a lentebbi gombbal. ⤵️", + "@noChatsFoundHere": {}, + "goToSpace": "Menj a térre: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "changeTheCanonicalRoomAlias": "Csevegés fő, nyilvános címének változtatása", + "@changeTheCanonicalRoomAlias": {}, + "chatPermissionsDescription": "Adja meg milyen erősségi szint kell egyes csevegési akciókhoz. A 0, 50 és 100-as szintek általában felhasználókat, moderátorokat és rendszergazdákat jelölnek de bármilyen szintezés lehetséges.", + "@chatPermissionsDescription": {}, + "whatIsAHomeserver": "Mi az a Matrix-kiszolgáló?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Az összes adata a Mátrix-kiszolgálón tárolódik, pont mint egy e-mail kiszolgálón. Kiválaszthatja melyik Matrix-kiszolgálót akarja használni, miközben tud kommunikálni mindenkivel. Tudjon meg többet itt: https://matrix.org.", + "@homeserverDescription": {}, + "userLevel": "{level} - Felhasználó", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Rendszergazda", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "inviteOtherUsers": "Más felhasználók meghívása a csevegésbe", + "@inviteOtherUsers": {}, + "changeTheVisibilityOfChatHistory": "Csevegési előzmények láthatóságának változtatása", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheChatPermissions": "Csevegés engedélyek változtatása", + "@changeTheChatPermissions": {}, + "sendRoomNotifications": "@room értesítés küldése", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Csevegés leírásának változtatása", + "@changeTheDescriptionOfTheGroup": {}, + "swipeRightToLeftToReply": "Húzza balra a válaszoláshoz", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "loginWithMatrixId": "Jelentkezzen be Matrix-ID-vel", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Matrix-kiszolgálók felfedezése", + "@discoverHomeservers": {}, + "doesNotSeemToBeAValidHomeserver": "Nem tűnik kompatibilisnak a Mátrix-kiszolgálóval. Helytelen URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} csevegések és {participants} résztvevők", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Nincs több csevegés...", + "@noMoreChatsFound": {}, + "joinedChats": "Csatlakozott csevegések", + "@joinedChats": {} } diff --git a/assets/l10n/intl_ia.arb b/assets/l10n/intl_ia.arb new file mode 100644 index 0000000000..7ec650c441 --- /dev/null +++ b/assets/l10n/intl_ia.arb @@ -0,0 +1,56 @@ +{ + "repeatPassword": "Repeter le contrasigno", + "@repeatPassword": {}, + "notAnImage": "Non es un file de imagine.", + "@notAnImage": {}, + "remove": "Remover", + "@remove": { + "type": "text", + "placeholders": {} + }, + "importEmojis": "Importar emojis", + "@importEmojis": {}, + "importFromZipFile": "Importar ab un file .zip", + "@importFromZipFile": {}, + "importNow": "Importar ora", + "@importNow": {}, + "exportEmotePack": "Exportar pacchetto de emotes como un .zip", + "@exportEmotePack": {}, + "replace": "Reimplaciar", + "@replace": {}, + "about": "A proposito de", + "@about": { + "type": "text", + "placeholders": {} + }, + "accept": "Acceptar", + "@accept": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} acceptava tu invitation", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "account": "Conto", + "@account": { + "type": "text", + "placeholders": {} + }, + "addEmail": "Adder email", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "supposedMxid": "Isto deberea esser {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@custom": {} +} diff --git a/assets/l10n/intl_id.arb b/assets/l10n/intl_id.arb index 6c9ac2fab8..8a03af8823 100644 --- a/assets/l10n/intl_id.arb +++ b/assets/l10n/intl_id.arb @@ -10,11 +10,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Grup-grup Publik", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "people": "Orang-orang", "@people": { "type": "text", @@ -25,7 +20,7 @@ "type": "text", "placeholders": {} }, - "chats": "Chat", + "chats": "Obrolan", "@chats": { "type": "text", "placeholders": {} @@ -35,16 +30,6 @@ "type": "text", "placeholders": {} }, - "avatarHasBeenChanged": "Avatar diubah", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentikasi", - "@authentication": { - "type": "text", - "placeholders": {} - }, "areYouSureYouWantToLogout": "Apakah kamu yakin ingin keluar?", "@areYouSureYouWantToLogout": { "type": "text", @@ -72,11 +57,6 @@ "senderName": {} } }, - "alreadyHaveAnAccount": "Sudah memiliki akun?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "alias": "alias", "@alias": { "type": "text", @@ -87,22 +67,12 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Tambahkan deskripsi grup", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informasi akun", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "account": "Akun", "@account": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} menerima undangannya", + "acceptedTheInvitation": "👍 {username} menerima undangannya", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -124,12 +94,7 @@ "type": "text", "placeholders": {} }, - "isDeviceKeyCorrect": "Apakah kunci perangkat berikut ini benar?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} mengundang kamu ke FluffyChat. \n1. Instal FluffyChat: https://fluffychat.im \n2. Daftar atau masuk \n3. Buka tautan undangan: {link}", + "inviteText": "{username} mengundang kamu ke FluffyChat. \n1. Kunjungi fluffychat.im dan instal aplikasi\n2. Daftar atau masuk \n3. Buka tautan undangan: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -147,7 +112,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} mengundang {targetName}", + "invitedUser": "📩 {username} mengundang {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -182,16 +147,6 @@ "type": "text", "placeholders": {} }, - "ignoreUsername": "Abaikan nama pengguna", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Kamu bisa mengabaikan pengguna yang mengganggu. Kamu tidak akan dapat menerima pesan atau undangan ruang apa pun dari pengguna di daftar abaian pribadimu.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, "ignoredUsers": "Pengguna yang diabaikan", "@ignoredUsers": { "type": "text", @@ -207,11 +162,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Homeserver tidak kompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "hideUnknownEvents": "Sembunyikan peristiwa tidak dikenal", "@hideUnknownEvents": { "type": "text", @@ -257,16 +207,6 @@ "type": "text", "placeholders": {} }, - "groupDescriptionHasBeenChanged": "Deskripsi grup diubah", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Deskripsi grup", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, "group": "Grup", "@group": { "type": "text", @@ -282,11 +222,6 @@ "type": "text", "placeholders": {} }, - "friday": "Jumat", - "@friday": { - "type": "text", - "placeholders": {} - }, "forward": "Teruskan", "@forward": { "type": "text", @@ -297,11 +232,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Ukuran file", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fileName": "Nama file", "@fileName": { "type": "text", @@ -317,21 +247,11 @@ "type": "text", "placeholders": {} }, - "enterAUsername": "Masukkan nama pengguna", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Masukkan alamat email", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAGroupName": "Masukkan nama grup", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} mengakhiri panggilan", "@endedTheCall": { "type": "text", @@ -399,17 +319,12 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "Edit instansi Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Edit nama tampilan", "@editDisplayname": { "type": "text", "placeholders": {} }, - "edit": "Edit", + "edit": "Sunting", "@edit": { "type": "text", "placeholders": {} @@ -424,21 +339,11 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Buang gambar", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "directChats": "Chat Langsung", "@directChats": { "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Enkripsi hanya aman jika semua perangkat telah diverifikasi.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "devices": "Perangkat", "@devices": { "type": "text", @@ -454,11 +359,6 @@ "type": "text", "placeholders": {} }, - "deny": "Tolak", - "@deny": { - "type": "text", - "placeholders": {} - }, "deleteMessage": "Hapus pesan", "@deleteMessage": { "type": "text", @@ -509,33 +409,13 @@ "type": "text", "placeholders": {} }, - "crossSigningEnabled": "Tanda tangan silang dinyalakan", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Tanda tangan silang dimatikan", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "Buat grup baru", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} membuat chat ini", + "createdTheChat": "💬 {username} membuat obrolan ini", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createAccountNow": "Buat akun sekarang", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "create": "Buat", "@create": { "type": "text", @@ -548,16 +428,6 @@ "count": {} } }, - "couldNotSetDisplayname": "Tidak dapat mengubah nama tampilan", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Tidak dapat mengubah avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, "couldNotDecryptMessage": "Tidak dapat mendekripsikan pesan: {error}", "@couldNotDecryptMessage": { "type": "text", @@ -580,17 +450,12 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Tampilan konten", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Cadangan chat", + "chatBackup": "Cadangan obrolan", "@chatBackup": { "type": "text", "placeholders": {} }, - "chat": "Chat", + "chat": "Obrolan", "@chat": { "type": "text", "placeholders": {} @@ -605,16 +470,6 @@ "type": "text", "placeholders": {} }, - "changeWallpaper": "Ubah wallpaper", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Ubah server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, "changeTheNameOfTheGroup": "Ubah nama grup", "@changeTheNameOfTheGroup": { "type": "text", @@ -630,11 +485,6 @@ "type": "text", "placeholders": {} }, - "changelog": "Changelog", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changedTheRoomInvitationLink": "{username} mengubah tautan undangan", "@changedTheRoomInvitationLink": { "type": "text", @@ -709,14 +559,14 @@ "displayname": {} } }, - "changedTheChatPermissions": "{username} mengubah izin chat", + "changedTheChatPermissions": "{username} mengubah izin obrolan", "@changedTheChatPermissions": { "type": "text", "placeholders": { "username": {} } }, - "changedTheChatNameTo": "{username} mengubah nama chat ke: '{chatname}'", + "changedTheChatNameTo": "{username} mengubah nama obrolan ke: '{chatname}'", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -724,7 +574,7 @@ "chatname": {} } }, - "changedTheChatDescriptionTo": "{username} mengubah deskripsi chat ke: '{description}'", + "changedTheChatDescriptionTo": "{username} mengubah deskripsi obrolan ke: '{description}'", "@changedTheChatDescriptionTo": { "type": "text", "placeholders": { @@ -732,7 +582,7 @@ "description": {} } }, - "changedTheChatAvatar": "{username} mengubah avatar chat", + "changedTheChatAvatar": "{username} mengubah avatar obrolan", "@changedTheChatAvatar": { "type": "text", "placeholders": { @@ -756,11 +606,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Kunci dicache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "botMessages": "Pesan bot", "@botMessages": { "type": "text", @@ -784,7 +629,7 @@ "type": "text", "placeholders": {} }, - "banFromChat": "Cekal dari chat", + "banFromChat": "Cekal dari obrolan", "@banFromChat": { "type": "text", "placeholders": {} @@ -812,16 +657,6 @@ "type": "text", "placeholder": {} }, - "audioPlayerPlay": "Main", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Jeda", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Terima permintaan verifikasi dari {username}?", "@askVerificationRequest": { "type": "text", @@ -829,31 +664,16 @@ "username": {} } }, - "askSSSSVerify": "Mohon masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu untuk memverifikasi sesimu.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Untuk dapat menandatangani orang lain, silakan masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSCache": "Mohon masukkan frasa sandi atau kunci pemulihan penyimpanan aman Anda untuk men-cache kunci.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Apakah pengguna tamu diizinkan untuk bergabung", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "archivedRoom": "Ruangan yang Diarsipkan", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "appLock": "Kunci aplikasi", "@appLock": { "type": "text", @@ -871,31 +691,16 @@ }, "addToSpace": "Tambah ke space", "@addToSpace": {}, - "addNewFriend": "Tambah teman baru", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addEmail": "Tambah email", "@addEmail": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Pengaturan enkripsi ujung-ke-ujung", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Enkripsi tidak diaktifkan", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritma enkripsi", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "containsUserName": "Berisi nama pengguna", "@containsUserName": { "type": "text", @@ -911,11 +716,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Upaya koneksi gagal", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "connect": "Hubungkan", "@connect": { "type": "text", @@ -926,12 +726,12 @@ "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Bandingkan dan pastikan angka cocok di perangkat lainnya:", + "compareNumbersMatch": "Bandingkan angka", "@compareNumbersMatch": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Bandingkan dan pastikan emoji cocok di perangkat lainnya:", + "compareEmojiMatch": "Bandingkan emoji", "@compareEmojiMatch": { "type": "text", "placeholders": {} @@ -943,17 +743,12 @@ }, "clearArchive": "Bersihkan arsip", "@clearArchive": {}, - "chooseAUsername": "Pilih username", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "chooseAStrongPassword": "Pilih kata sandi yang kuat", "@chooseAStrongPassword": { "type": "text", "placeholders": {} }, - "chatDetails": "Detail chat", + "chatDetails": "Detail obrolan", "@chatDetails": { "type": "text", "placeholders": {} @@ -963,7 +758,7 @@ "type": "text", "placeholders": {} }, - "activatedEndToEndEncryption": "{username} mengaktifkan enkripsi ujung ke ujung", + "activatedEndToEndEncryption": "🔐 {username} mengaktifkan enkripsi ujung ke ujung", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -987,7 +782,7 @@ "type": "text", "placeholders": {} }, - "leftTheChat": "Keluar dari chat", + "leftTheChat": "Keluar dari obrolan", "@leftTheChat": { "type": "text", "placeholders": {} @@ -997,11 +792,6 @@ "type": "text", "placeholders": {} }, - "lastSeenIp": "IP terakhir dilihat", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, "lastActiveAgo": "Terakhir aktif: {localizedTimeShort}", "@lastActiveAgo": { "type": "text", @@ -1009,12 +799,12 @@ "localizedTimeShort": {} } }, - "kickFromChat": "Keluarkan dari chat", + "kickFromChat": "Keluarkan dari obrolan", "@kickFromChat": { "type": "text", "placeholders": {} }, - "kickedAndBanned": "{username} mengeluarkan dan mencekal {targetName}", + "kickedAndBanned": "🙅 {username} mengeluarkan dan mencekal {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1022,7 +812,7 @@ "targetName": {} } }, - "kicked": "{username} mengeluarkan {targetName}", + "kicked": "👞 {username} mengeluarkan {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1030,22 +820,12 @@ "targetName": {} } }, - "keysMissing": "Tidak ada kunci", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Kunci telah dicache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Gabung ruangan", + "joinRoom": "Bergabung dengan ruangan", "@joinRoom": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} telah bergabung di chat", + "joinedTheChat": "👋 {username} telah bergabung dengan obrolan", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1057,11 +837,6 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Tidak menemukan ruangan publik…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noPermission": "Tidak ada izin", "@noPermission": { "type": "text", @@ -1077,12 +852,7 @@ "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Mohon menyalakan cadangan kunci online di Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Sepertinya kamu tidak memiliki layanan Google di ponselmu. Keputusan yang baik untuk privasimu! Untuk menerima pemberitahuan push di FluffyChat, sebaiknya kamu menggunakan https://microg.org/ atau https://unifiedpush.org/.", + "noGoogleServicesWarning": "Perpesanan Awan Firebase sepertinya tidak tersedia di perangkatmu. Untuk dapat menerima notifikasi dorongan, kami menyarankan memasang ntfy. Dengan ntfy atau penyedia UnifiedPush lainnya, kamu bisa menerima notifikasi dorongan dengan cara yang aman. Kamu bisa mengunduh ntfy dari Play Store atau F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1107,7 +877,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Pesan baru di FluffyChat", + "newMessageInFluffyChat": "💬 Pesan baru di FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1122,26 +892,16 @@ "type": "text", "placeholders": {} }, - "muteChat": "Bisukan chat", + "muteChat": "Bisukan obrolan", "@muteChat": { "type": "text", "placeholders": {} }, - "monday": "Senin", - "@monday": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Pesan akan dihapus untuk semua anggota", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "mention": "Sebutkan", "@mention": { "type": "text", @@ -1152,21 +912,6 @@ "type": "text", "placeholders": {} }, - "makeSureTheIdentifierIsValid": "Pastikan pengenalnya valid", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Jadikan admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Jadikan moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, "logout": "Keluar", "@logout": { "type": "text", @@ -1189,29 +934,12 @@ "type": "text", "placeholders": {} }, - "zoomOut": "Perkecil", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Perbesar", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Kamu akan dihubungkan ke {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "verified": "Terverifikasi", "@verified": { "type": "text", "placeholders": {} }, - "userLeftTheChat": "{username} keluar dari chat", + "userLeftTheChat": "🚪 {username} keluar dari obrolan", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -1228,26 +956,11 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Ketuk perangkat untuk memverifikasi", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "showPassword": "Tampilkan kata sandi", "@showPassword": { "type": "text", "placeholders": {} }, - "securityKeyLost": "Kunci keamanan hilang?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Kunci keamanan", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Hapus avatarmu", "@removeYourAvatar": { "type": "text", @@ -1268,11 +981,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "Mohon masukkan kunci keamananmu:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseChoose": "Mohon pilih", "@pleaseChoose": { "type": "text", @@ -1288,11 +996,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Cadangan Kunci Online dimatikan", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "online": "Online", "@online": { "type": "text", @@ -1308,18 +1011,6 @@ "type": "text", "placeholders": {} }, - "numberSelected": "{number} terpilih", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "notSupportedInWeb": "Tidak didukung di web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, "notificationsEnabledForThisAccount": "Notifikasi diaktifkan untuk akun ini", "@notificationsEnabledForThisAccount": { "type": "text", @@ -1330,46 +1021,21 @@ "type": "text", "placeholders": {} }, - "noStatusesFound": "Tidak ada status yang ditemukan sejauh ini.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Kunci publikmu", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Nama penggunamu sendiri", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Chatmu sedang disinkronasikan…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Kamu telah dicekal dari chat ini", + "youHaveBeenBannedFromThisChat": "Kamu telah dicekal dari obrolan ini", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Kamu tidak bisa mengundang kamu sendiri", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Kamu tidak berpartisipasi lagi di chat ini", + "youAreNoLongerParticipatingInThisChat": "Kamu tidak berpartisipasi lagi di obrolan ini", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Kamu diundang ke chat ini", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "you": "Kamu", "@you": { "type": "text", @@ -1390,7 +1056,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Hapus cadangan chat untuk membuat kunci pemulihan baru?", + "wipeChatBackup": "Hapus cadangan obrolan untuk membuat kunci pemulihan baru?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -1415,27 +1081,12 @@ "type": "text", "placeholders": {} }, - "welcomeText": "Selamat datang ke perpesanan instan yang paling lucu di jaringan Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Rabu", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Enkripsi ujung-ke-ujung saat ini masih dalam beta! Gunakan dengan risikomu sendiri!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, "warning": "Peringatan!", "@warning": { "type": "text", "placeholders": {} }, - "wallpaper": "Latar belakang", + "wallpaper": "Latar belakang:", "@wallpaper": { "type": "text", "placeholders": {} @@ -1470,7 +1121,7 @@ "type": "text", "placeholders": {} }, - "visibilityOfTheChatHistory": "Visibilitas sejarah chat", + "visibilityOfTheChatHistory": "Visibilitas sejarah obrolan", "@visibilityOfTheChatHistory": { "type": "text", "placeholders": {} @@ -1480,11 +1131,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifikasi Pengguna", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "verifyTitle": "Memverifikasi akun lain", "@verifyTitle": { "type": "text", @@ -1500,31 +1146,11 @@ "type": "text", "placeholders": {} }, - "verifyManual": "Verifikasi Secara Manual", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verify": "Verifikasi", "@verify": { "type": "text", "placeholders": {} }, - "verifiedSession": "Berhasil memverifikasi sesi!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Pengguna terverifikasi", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Pengguna memiliki status verifikasi yang tidak dikenal", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} mengirim peristiwa {type}", "@userSentUnknownEvent": { "type": "text", @@ -1533,11 +1159,6 @@ "type": {} } }, - "userNotVerified": "Pengguna tidak diverifikasi", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "username": "Nama Pengguna", "@username": { "type": "text", @@ -1566,19 +1187,7 @@ "count": {} } }, - "useAmoledTheme": "Gunakan warna yang kompatibel dengan AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "unreadMessages": "{unreadEvents, plural, =1{1 pesan belum dibaca} other{{unreadEvents} pesan belum dibaca}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "unreadChats": "{unreadCount, plural, =1{1 chat belum dibaca} other{{unreadCount} chat belum dibaca}}", + "unreadChats": "{unreadCount, plural, =1{1 obrolan belum dibaca} other{{unreadCount} obrolan belum dibaca}}", "@unreadChats": { "type": "text", "placeholders": { @@ -1590,21 +1199,11 @@ "type": "text", "placeholders": {} }, - "unmuteChat": "Bunyikan chat", + "unmuteChat": "Bunyikan obrolan", "@unmuteChat": { "type": "text", "placeholders": {} }, - "unlockChatBackup": "Buka cadangan chat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unknownSessionVerify": "Sesi tidak dikenal, mohon verifikasi", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unknownEvent": "Peristiwa tidak dikenal '{type}'", "@unknownEvent": { "type": "text", @@ -1635,11 +1234,6 @@ "targetName": {} } }, - "tuesday": "Selasa", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "tryToSendAgain": "Coba kirim lagi", "@tryToSendAgain": { "type": "text", @@ -1671,26 +1265,6 @@ "type": "text", "placeholders": {} }, - "timeOfDay": "{hours12}.{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "thursday": "Kamis", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ruangan ini telah diarsipkan.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, "theyMatch": "Cocok", "@theyMatch": { "type": "text", @@ -1701,16 +1275,6 @@ "type": "text", "placeholders": {} }, - "tapToShowMenu": "Ketuk untuk menampilkan menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Ketuk untuk menampilkan gambar", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Sistem", "@systemTheme": { "type": "text", @@ -1721,11 +1285,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Minggu", - "@sunday": { - "type": "text", - "placeholders": {} - }, "submit": "Kirim", "@submit": { "type": "text", @@ -1741,11 +1300,6 @@ "type": "text", "placeholders": {} }, - "startYourFirstChat": "Mulai chat pertamamu sekarang juga! 🙂\n- Ketuk 'Chat baru'\n- Pindai kode QR temanmu\n- Selamat bersenang-senang chattingan", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "startedACall": "{senderName} memulai panggilan", "@startedACall": { "type": "text", @@ -1768,11 +1322,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Suara, getaran warna LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "skip": "Lewat", "@skip": { "type": "text", @@ -1783,11 +1332,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Daftar", - "@signUp": { - "type": "text", - "placeholders": {} - }, "shareLocation": "Bagikan lokasi", "@shareLocation": { "type": "text", @@ -1825,31 +1369,11 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Tetapkan deskripsi grup", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "Tetapkan emote kustom", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "setAProfilePicture": "Tetapkan gambar profil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesi telah diverifikasi", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "Informasi tentang privasimu: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, "sentCallInformations": "{senderName} mengirim informasi panggilan", "@sentCallInformations": { "type": "text", @@ -1857,57 +1381,41 @@ "senderName": {} } }, - "sentAVideo": "{username} mengirim video", + "sentAVideo": "🎥 {username} mengirim video", "@sentAVideo": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} mengirim stiker", + "sentASticker": "😊 {username} mengirim stiker", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} mengirim gambar", + "sentAPicture": "🖼️ {username} mengirim gambar", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} mengirim suara", + "sentAnAudio": "🎤 {username} mengirim suara", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAFile": "{username} mengirim file", + "sentAFile": "📁 {username} mengirim file", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "seenByUserAndUser": "Dilihat oleh {username} dan {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Dilihat oleh {username} dan {count} lainnya}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, "seenByUser": "Dilihat oleh {username}", "@seenByUser": { "type": "text", @@ -1920,31 +1428,11 @@ "type": "text", "placeholders": {} }, - "searchForAChat": "Cari chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "search": "Cari", "@search": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Simpan file ke folder ini", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Hilangkan semua izin", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Minta membaca pesan lama", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, "requestPermission": "Minta izin", "@requestPermission": { "type": "text", @@ -1970,12 +1458,7 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Hapus pesan", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Hilangkan cekalan dari chat", + "unbanFromChat": "Hilangkan cekalan dari obrolan", "@unbanFromChat": { "type": "text", "placeholders": {} @@ -2019,21 +1502,11 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Mohon masukkan ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Mohon klik tautan di email dan lanjut.", "@pleaseClickOnLink": { "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Mohon pilih nama pengguna", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseChooseAPasscode": "Mohon pilih kode sandi", "@pleaseChooseAPasscode": { "type": "text", @@ -2076,11 +1549,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Perangkat pengguna yang disertai", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "participant": "Peserta", "@participant": { "type": "text", @@ -2091,11 +1559,6 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Opsional) Nama grup", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "serverRequiresEmail": "Server ini harus memvalidasi alamat email kamu untuk registrasi.", "@serverRequiresEmail": {}, "openInMaps": "Buka di peta", @@ -2149,18 +1612,8 @@ "count": {} } }, - "newUsernameDescription": "ID penggunamu akan memiliki format @namapengguna:namaserver", - "@newUsernameDescription": {}, - "newPasswordDescription": "Untuk bisa memulihkan kata sandi, kamu nanti harus menambahkan alamat email ke akunmu.", - "@newPasswordDescription": {}, "scanQrCode": "Pindai kode QR", "@scanQrCode": {}, - "typeInInviteLinkManually": "Masukkan tautan undangan secara manual...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Bagikan tautan undanganmu", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Cukup pindai kode QR atau bagikan tautan undanganmu jika kamu tidak bersebelahan.", - "@createNewChatExplaination": {}, "noMatrixServer": "{server1} itu bukan server Matrix, gunakan {server2} saja?", "@noMatrixServer": { "type": "text", @@ -2169,16 +1622,6 @@ "server2": {} } }, - "noDescription": "Tidak ada deskripsi", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat saat ini tidak mendukung penandatanganan silang. Mohon aktifkan di Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "no": "Tidak", "@no": { "type": "text", @@ -2189,25 +1632,11 @@ "type": "text", "placeholders": {} }, - "moreEvents": "{count,plural, =1{1 peristiwa lebih} other{{count} peristiwa lebih}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "messages": "Pesan", "@messages": { "type": "text", "placeholders": {} }, - "loginWith": "Masuk dengan {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "locationDisabledNotice": "Layanan lokasi dinonaktifkan. Mohon diaktifkan untuk bisa membagikan lokasimu.", "@locationDisabledNotice": { "type": "text", @@ -2223,16 +1652,6 @@ "type": "text", "placeholders": {} }, - "lastSeenLongTimeAgo": "Terlihat beberapa waktu yang lalu", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Email tidak valid", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inoffensive": "Tidak menyinggung", "@inoffensive": { "type": "text", @@ -2253,11 +1672,6 @@ "type": "text", "placeholders": {} }, - "friends": "Teman", - "@friends": { - "type": "text", - "placeholders": {} - }, "fontSize": "Ukuran font", "@fontSize": { "type": "text", @@ -2272,54 +1686,22 @@ }, "homeserver": "Homeserver", "@homeserver": {}, - "enterASpacepName": "Masukkan nama space", - "@enterASpacepName": {}, "enableEncryption": "Aktifkan enkripsi", "@enableEncryption": { "type": "text", "placeholders": {} }, - "enableChatBackup": "Aktifkan cadangan chat untuk tidak kehilangan akses chatmu.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "Edit avatar ruangan", "@editRoomAvatar": { "type": "text", "placeholders": {} }, - "editChatPermissions": "Edit izin chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editBlockedServers": "Edit server yang diblokir", "@editBlockedServers": { "type": "text", "placeholders": {} }, - "dontAskAgain": "Batalkan dan jangan tanya lagi", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "donate": "Beri Donasi", - "@donate": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Temukan grup", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "Temukan", - "@discover": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Level izin default", + "defaultPermissionLevel": "Level izin bawaan untuk pengguna baru", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2339,7 +1721,7 @@ "type": "text", "placeholders": {} }, - "configureChat": "Konfigurasikan chat", + "configureChat": "Konfigurasi obrolan", "@configureChat": { "type": "text", "placeholders": {} @@ -2426,28 +1808,13 @@ "type": "text", "description": "Usage hint for the command /ban" }, - "clearText": "Bersihkan teks", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Chat telah dikeluarkan dari space ini", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat telah ditambahkan ke space ini", + "chatHasBeenAddedToThisSpace": "Obrolan telah ditambahkan ke space ini", "@chatHasBeenAddedToThisSpace": {}, "changeTheme": "Ubah tema", "@changeTheme": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Perubahan telah disimpan", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "extremeOffensive": "Sangat menyinggung", "@extremeOffensive": { "type": "text", @@ -2483,11 +1850,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Izinkan mengirim laporan bug dengan sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendAudio": "Kirim suara", "@sendAudio": { "type": "text", @@ -2512,23 +1874,11 @@ "type": "text", "placeholders": {} }, - "savedFileAs": "File disimpan sebagai {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "roomHasBeenUpgraded": "Ruangan telah ditingkatkan", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "Sabtu", - "@saturday": { - "type": "text", - "placeholders": {} - }, "removeDevice": "Hapus perangkat", "@removeDevice": { "type": "text", @@ -2556,21 +1906,11 @@ "type": "text", "placeholders": {} }, - "publicSpace": "Space publik", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Ruangan Publik", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicKey": "Kunci Publik", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "privacy": "Privasi", "@privacy": { "type": "text", @@ -2598,31 +1938,12 @@ }, "link": "Tautan", "@link": {}, - "setupChatBackup": "Siapkan cadangan pesan", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Saya telah menuliskan kuncinya", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Cadangan pesanmu telah disiapkan.", + "yourChatBackupHasBeenSetUp": "Cadangan obrolanmu telah disiapkan.", "@yourChatBackupHasBeenSetUp": {}, - "yourUserId": "ID penggunamu:", - "@yourUserId": {}, - "setupChatBackupDescription": "Untuk melindungi pesanmu, kami telah membuat kunci pemulihan untukmu.\nSilakan simpan kuncinya di tempat yang aman, seperti manajer kata sandi.", - "@setupChatBackupDescription": {}, "unverified": "Tidak terverifikasi", "@unverified": {}, - "pleaseEnterValidEmail": "Mohon masukkan alamat email yang valid.", - "@pleaseEnterValidEmail": {}, - "pleaseChooseAtLeastChars": "Mohon pilih minimal {min} karakter.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "repeatPassword": "Ulangi kata sandi", "@repeatPassword": {}, - "passwordsDoNotMatch": "Kata sandi tidak cocok!", - "@passwordsDoNotMatch": {}, "messageInfo": "Informasi pesan", "@messageInfo": {}, "time": "Waktu", @@ -2633,23 +1954,13 @@ "@sender": {}, "openGallery": "Buka galeri", "@openGallery": {}, - "addToSpaceDescription": "Pilih sebuah space untuk menambahkan chat ke spacenya.", + "addToSpaceDescription": "Pilih sebuah space untuk menambahkan obrolan ke spacenya.", "@addToSpaceDescription": {}, "start": "Mulai", "@start": {}, - "setupChatBackupNow": "Mulai menyiapkan cadangan chatmu", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Simpan kunci keamanannya", - "@saveTheSecurityKeyNow": {}, - "loginWithOneClick": "Masuk dengan satu klik", - "@loginWithOneClick": {}, - "removeFromSpaceDescription": "Ini akan menghilangkan chat ini dari space saat ini. Ini juga masih ada di \"Semua chat\".", - "@removeFromSpaceDescription": {}, "removeFromSpace": "Hilangkan dari space", "@removeFromSpace": {}, - "pleaseEnterSecurityKeyDescription": "Untuk mengakses cadangan chatmu, mohon masukkan kunci keamanan kamu yang telah dibuat di sesi sebelumnya. Kunci keamananmu BUKAN kata sandimu.", - "@pleaseEnterSecurityKeyDescription": {}, - "commandHint_clearcache": "Bersihkan cache", + "commandHint_clearcache": "Bersihkan tembolok", "@commandHint_clearcache": { "type": "text", "description": "Usage hint for the command /clearcache" @@ -2659,43 +1970,23 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_dm": "Memulai sebuah chat langsung\nGunakan --no-encryption untuk menonaktifkan enkripsi", + "commandHint_dm": "Mulai sebuah obrolan langsung\nGunakan --no-encryption untuk menonaktifkan enkripsi", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" }, - "commandHint_create": "Buat sebuah chat grup kosong\nGunakan --no-encryption untuk menonaktifkan enkripsi", + "commandHint_create": "Buat sebuah grup obrolan kosong\nGunakan --no-encryption untuk menonaktifkan enkripsi", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" }, - "thisUserHasNotPostedAnythingYet": "Pengguna ini belum memposting apa pun di cerita mereka", - "@thisUserHasNotPostedAnythingYet": {}, "openVideoCamera": "Buka kamera untuk merekam video", "@openVideoCamera": { "type": "text", "placeholders": {} }, - "addToStory": "Tambahkan ke cerita", - "@addToStory": {}, "publish": "Publikasi", "@publish": {}, - "whoCanSeeMyStories": "Siapa saja yang dapat melihat cerita saya?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Batalkan langganan cerita", - "@unsubscribeStories": {}, - "yourStory": "Ceritamu", - "@yourStory": {}, - "replyHasBeenSent": "Balasan telah dikirim", - "@replyHasBeenSent": {}, - "storyFrom": "Cerita dari {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2703,21 +1994,6 @@ "size": {} } }, - "bubbleSize": "Ukuran gelembung", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whoCanSeeMyStoriesDesc": "Diingat bahwa orang-orang dapat melihat dan kontak sesama di ceritamu.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Apa yang sedang terjadi?", - "@whatIsGoingOn": {}, - "addDescription": "Tambahkan deskripsi", - "@addDescription": {}, - "iUnderstand": "Saya mengerti", - "@iUnderstand": {}, - "storyPrivacyWarning": "Diingat bahwa orang-orang dapat melihat dan kontak satu bersama di ceritamu. Ceritamu akan terlihat selama 24 jam tetapi tidak ada jaminan bahwa itu akan dihapus oleh semua perangkat dan server.", - "@storyPrivacyWarning": {}, "dismiss": "Abaikan", "@dismiss": {}, "markAsRead": "Tandai sebagai dibaca", @@ -2726,12 +2002,6 @@ "@reportUser": {}, "openChat": "Buka Chat", "@openChat": {}, - "integrationsNotImplemented": "Mengedit widget dan integrasi belum dapat dilakukan.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Edit widget dan integrasi", - "@editIntegrations": {}, - "matrixWidgets": "Widget Matrix", - "@matrixWidgets": {}, "reactedWith": "{sender} bereaksi dengan {reaction}", "@reactedWith": { "type": "text", @@ -2744,8 +2014,6 @@ "@emojis": {}, "pinMessage": "Sematkan ke ruangan", "@pinMessage": {}, - "pinnedEventsError": "Terjadi kesalahan memuat pesan-pesan yang disematkan", - "@pinnedEventsError": {}, "confirmEventUnpin": "Apakah kamu yakin untuk melepaskan pin peristiwa ini secara permanen?", "@confirmEventUnpin": {}, "unsupportedAndroidVersionLong": "Fitur ini memerlukan versi Android yang baru. Mohon periksa untuk pembaruan atau dukungan LineageOS.", @@ -2785,43 +2053,36 @@ "@widgetName": {}, "addWidget": "Tambahkan widget", "@addWidget": {}, - "editWidgets": "Edit widget", - "@editWidgets": {}, "widgetVideo": "Video", "@widgetVideo": {}, "widgetUrlError": "Ini bukan URL yang valid.", "@widgetUrlError": {}, "widgetNameError": "Mohon sediakan sebuah nama tampilan.", "@widgetNameError": {}, - "separateChatTypes": "Pisahkan Pesan Langsung, Grup, dan Space", + "separateChatTypes": "Pisahkan Pesan Langsung dan Grup", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Tampilkan Pesan Langsung yang berkait di Space", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youInvitedBy": "Kamu telah diundang oleh {user}", + "youInvitedBy": "📩 Kamu telah diundang oleh {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "Kamu mengundang {user}", + "youInvitedUser": "📩 Kamu mengundang {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "Kamu mengeluarkan {user}", + "youKicked": "👞 Kamu mengeluarkan {user}", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Kamu mengeluarkan dan mencekal {user}", + "youKickedAndBanned": "🙅 Kamu mengeluarkan dan mencekal {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2831,7 +2092,7 @@ "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Kamu bergabung ke obrolan", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Kamu menerima undangannya", + "youAcceptedTheInvitation": "👍 Kamu menerima undangannya", "@youAcceptedTheInvitation": {}, "youBannedUser": "Kamu mencekal {user}", "@youBannedUser": { @@ -2851,14 +2112,8 @@ "user": {} } }, - "showSpaces": "Tampilkan daftar space", - "@showSpaces": {}, - "noEmailWarning": "Mohon tambahkan sebuah alamat email. Atau kamu tidak akan dapat mengatur ulang kata sandimu. Jika kamu tidak ingin, ketuk lagi untuk melanjitkan.", - "@noEmailWarning": {}, "pleaseEnterRecoveryKeyDescription": "Untuk mengakses pesan lamamu, mohon masukkan kunci pemulihanmu yang telah dibuat di sesi sebelumnya. Kunci pemulihanmu BUKAN kata sandimu.", "@pleaseEnterRecoveryKeyDescription": {}, - "saveTheRecoveryKeyNow": "Simpan kunci pemulihan sekarang", - "@saveTheRecoveryKeyNow": {}, "users": "Pengguna", "@users": {}, "storeInSecureStorageDescription": "Simpan kunci pemulihan di penyimpanan aman perangkat ini.", @@ -2867,8 +2122,6 @@ "@saveKeyManuallyDescription": {}, "recoveryKey": "Kunci pemulihan", "@recoveryKey": {}, - "stories": "Cerita", - "@stories": {}, "storeInAppleKeyChain": "Simpan di Apple KeyChain", "@storeInAppleKeyChain": {}, "pleaseEnterRecoveryKey": "Mohon masukkan kunci pemulihanmu:", @@ -2879,8 +2132,766 @@ "@recoveryKeyLost": {}, "storeInAndroidKeystore": "Simpan di Android KeyStore", "@storeInAndroidKeystore": {}, - "enableAutoBackups": "Aktifkan cadangan otomatis", - "@enableAutoBackups": {}, "storeSecurlyOnThisDevice": "Simpan secara aman di perangkat ini", - "@storeSecurlyOnThisDevice": {} + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} file", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "hydrate": "Pulihkan dari file cadangan", + "@hydrate": {}, + "indexedDbErrorTitle": "Masalah dengan mode privat", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "Penyimpanan pesan sayangnya tidak diaktifkan dalam mode privat secara default.\nMohon kunjungi\n- about:config\n- tetapkan dom.indexedDB.privateBrowsing.enabled ke true\nJika tidak ditetapkan, FluffyChat tidak akan dapat dijalankan.", + "@indexedDbErrorLong": {}, + "dehydrate": "Ekspor sesi dan bersihkan perangkat", + "@dehydrate": {}, + "dehydrateWarning": "Tindakan ini tidak dapat diurungkan. Pastikan kamu telah menyimpan file cadangan dengan aman.", + "@dehydrateWarning": {}, + "dehydrateTor": "Pengguna Tor: Ekspor sesi", + "@dehydrateTor": {}, + "hydrateTorLong": "Apakah kamu mengekspor sesimu terakhir kali di Tor? Impor dengan cepat dan lanjut mengobrol.", + "@hydrateTorLong": {}, + "dehydrateTorLong": "Pengguna Tor disarankan untuk mengekspor sesi sebelum menutup jendela.", + "@dehydrateTorLong": {}, + "hydrateTor": "Pengguna Tor: Impor eksporan sesi", + "@hydrateTor": {}, + "custom": "Kustom", + "@custom": {}, + "user": "Pengguna", + "@user": {}, + "confirmMatrixId": "Mohon konfirmasi ID Matrix Anda untuk menghapus akun Anda.", + "@confirmMatrixId": {}, + "supposedMxid": "Ini seharusnya {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasdm": "Tandai sebagai ruangan pesan langsung untuk ID Matrix yang ditentukan", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Tandai sebagai grup", + "@commandHint_markasgroup": {}, + "screenSharingTitle": "membagikan layar", + "@screenSharingTitle": {}, + "appearOnTopDetails": "Memperbolehkan aplikasi untuk ditampilkan di atas (tidak dibutuhkan jika kamu memiliki FluffyChat ditetapkan sebagai akun pemanggilan)", + "@appearOnTopDetails": {}, + "callingAccountDetails": "Memperbolehkan FluffyChat untuk menggunakan aplikasi penelepon Android bawaan.", + "@callingAccountDetails": {}, + "noKeyForThisMessage": "Hal ini bisa terjadi jika pesan dikirim sebelum kamu masuk ke akunmu di perangkat ini.\n\nMungkin juga pengirim telah memblokir perangkatmu atau ada yang tidak beres dengan koneksi internet.\n\nApakah kamu bisa membaca pesan pada sesi lain? Maka kamu bisa mentransfer pesan dari sesi tersebut! Buka Pengaturan > Perangkat dan pastikan bahwa perangkat Anda telah ditandatangani secara silang. Ketika kamu membuka ruangan di lain waktu dan kedua sesi berada di latar depan, kunci akan ditransmisikan secara otomatis.\n\nApakah kamu tidak mau kehilangan kunci saat keluar atau berpindah perangkat? Pastikan bahwa kamu telah mengaktifkan cadangan obrolan dalam pengaturan.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Notifikasi ini ditampilkan ketika layanan latar depan berjalan.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Perizinan panggilan", + "@callingPermissions": {}, + "appearOnTop": "Tampilkan di atas", + "@appearOnTop": {}, + "callingAccount": "Akun pemanggilan", + "@callingAccount": {}, + "otherCallingPermissions": "Mikrofon, kamera dan perizinan FluffyChat lainnya", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Mengapa pesan ini tidak bisa dibaca?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Grup baru", + "@newGroup": {}, + "newSpace": "Space baru", + "@newSpace": {}, + "enterSpace": "Masuk space", + "@enterSpace": {}, + "enterRoom": "Masuk ruangan", + "@enterRoom": {}, + "allSpaces": "Semua space", + "@allSpaces": {}, + "screenSharingDetail": "Kamu membagikan layarmu di FluffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} obrolan", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Sembunyikan peristiwa keadaan yang tidak penting", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Jangan tampilkan lagi", + "@doNotShowAgain": {}, + "hugContent": "{senderName} memeluk kamu", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "googlyEyesContent": "{senderName} mengirim mata googly", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} berpelukan dengan kamu", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "Kirim mata googly", + "@commandHint_googly": {}, + "commandHint_hug": "Kirim pelukan", + "@commandHint_hug": {}, + "commandHint_cuddle": "Kirim berpelukan", + "@commandHint_cuddle": {}, + "wasDirectChatDisplayName": "Obrolan kosong (sebelumnya {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "startFirstChat": "Mulai obrolan pertamamu", + "@startFirstChat": {}, + "newSpaceDescription": "Fitur space bisa membantu untuk memisahkan obrolanmu dan membuat komunitas pribadi atau publik.", + "@newSpaceDescription": {}, + "sorryThatsNotPossible": "Maaf... itu tidak mungkin", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Kunci perangkat:", + "@deviceKeys": {}, + "encryptThisChat": "Enkripsi obrolan ini", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Demi keamanan kamu tidak bisa menonaktifkan enkripsi dalam sebuah obrolan di mana sebelumbya sudah diaktifkan.", + "@disableEncryptionWarning": {}, + "reopenChat": "Buka obrolan lagi", + "@reopenChat": {}, + "noBackupWarning": "Peringatan! Tanpa mengaktifkan cadangan percakapan, kamu akan kehilangan akses ke pesan terenkripsimu. Disarankan untuk mengaktifkan cadangan percakapan terlebih dahulu sebelum keluar dari akun.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Tidak ada perangkat lain yang ditemukan", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Tidak dapat mengirim! Server hanya mendukung lampiran sampai dengan {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Berkas telah disimpan di {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Pergi ke pesan terakhir dibaca", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Baca sampai sini", + "@readUpToHere": {}, + "jump": "Lompat", + "@jump": {}, + "openLinkInBrowser": "Buka tautan dalam peramban", + "@openLinkInBrowser": {}, + "allRooms": "Semua Percakapan Grup", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "report": "laporkan", + "@report": {}, + "reportErrorDescription": "😭 Aduh. Ada yang salah. Jika kamu mau, kamu bisa melaporkan kutu ini kepada para pengembang.", + "@reportErrorDescription": {}, + "signInWithPassword": "Masuk dengan kata sandi", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Silakan coba lagi nanti atau pilih server yang lain.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Masuk dengan {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Bukan berkas gambar.", + "@notAnImage": {}, + "importNow": "Impor sekarang", + "@importNow": {}, + "importFromZipFile": "Impor dari berkas .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Ekspor paket Emote sebagai .zip", + "@exportEmotePack": {}, + "replace": "Ganti", + "@replace": {}, + "importEmojis": "Impor Emoji", + "@importEmojis": {}, + "sendTypingNotifications": "Kirim notifikasi pengetikan", + "@sendTypingNotifications": {}, + "createGroup": "Buat grup", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Apakah kamu ingin mengundang {contact} ke obrolan \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Coba ulang", + "@tryAgain": {}, + "messagesStyle": "Pesan:", + "@messagesStyle": {}, + "shareInviteLink": "Bagikan tautan undangan", + "@shareInviteLink": {}, + "setTheme": "Atur tema:", + "@setTheme": {}, + "invalidServerName": "Nama server tidak valid", + "@invalidServerName": {}, + "addChatDescription": "Tambahkan deskripsi obrolan...", + "@addChatDescription": {}, + "chatPermissions": "Perizinan obrolan", + "@chatPermissions": {}, + "chatDescription": "Deskripsi obrolan", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Deskripsi obrolan diubah", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Deskripsi obrolan belum dibuat.", + "@noChatDescriptionYet": {}, + "redactMessageDescription": "Pesan akan dihilangkan untuk semua anggota dalam percakapan ini. Ini tidak dapat diurungkan.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(Opsional) Alasan menghilangkan pesan ini...", + "@optionalRedactReason": {}, + "redactedBy": "Dihilangkan oleh {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "Chat langsung", + "@directChat": {}, + "redactedByBecause": "Dihilangkan oleh {username} karena: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "setChatDescription": "Lihat deskripsi obrolan", + "@setChatDescription": {}, + "profileNotFound": "Pengguna ini tidak dapat ditemukan di server. Mungkin ada masalah koneksi atau penggunanya tidak ada.", + "@profileNotFound": {}, + "setColorTheme": "Atur tema warna:", + "@setColorTheme": {}, + "invite": "Undang", + "@invite": {}, + "inviteGroupChat": "📨 Undang percakapan grup", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Undang percakapan privat", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Emote yang telah digunakan akan muncul di sini...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "Masukan tidak valid!", + "@invalidInput": {}, + "wrongPinEntered": "PIN yang dimasukkan salah! Coba lagi dalam {seconds} detik...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "banUserDescription": "Pengguna akan dicekal dari percakapan dan tidak akan dapat memasuki percakapan lagi sampai dibatalkan cekalannya.", + "@banUserDescription": {}, + "removeDevicesDescription": "Kamu akan dikeluarkan dari perangkat ini dan tidak akan dapat menerima pesan lagi.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Pengguna akan dapat memasuki percakapannya lagi jika dicoba.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Notifikasi dorongan tidak tersedia", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Setelah kamu membuat pengguna ini admin, kamu tidak akan dapat mengurungkan ini karena penggunanya akan memiliki perizinan yang sama seperti kamu.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Percakapan akan dipindahkan ke arsip. Pengguna lain akan melihat bahwa kamu telah meninggalkan percakapan.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} telah dikeluarkan", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Pelajari lebih lanjut", + "@learnMore": {}, + "roomUpgradeDescription": "Percakapannya akan dibuat ulang dengan versi ruangan yang baru. Semua anggota akan diberi tahu bahwa mereka harus ganti ke percakapan yang baru. Kamu bisa mempelajari lebih lanjut tentang versi ruangan di https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Silakan masukkan angka lebih dari 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Pengguna ini dikeluarkan dari percakapan tetapi tidak dicekal. Dalam percakapan publik, penggunanya dapat bergabung ulang kapan pun.", + "@kickUserDescription": {}, + "groupCanBeFoundViaSearch": "Grup dapat dicari melalui pencarian", + "@groupCanBeFoundViaSearch": {}, + "groupName": "Nama grup", + "@groupName": {}, + "wrongRecoveryKey": "Maaf... ini sepertinya bukan kunci pemulihan yang benar.", + "@wrongRecoveryKey": {}, + "addChatOrSubSpace": "Tambahkan percakapan atau subspace", + "@addChatOrSubSpace": {}, + "pleaseChooseAStrongPassword": "Silakan pilih kata sandi yang kuat", + "@pleaseChooseAStrongPassword": {}, + "joinSpace": "Bergabung ke space", + "@joinSpace": {}, + "acceptedKeyVerification": "{sender} menerima verifikasi kunci", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} membatalkan verifikasi kunci", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} siap untuk verifikasi kunci", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "verifyOtherDevice": "🔐 Verifikasi perangkat lain", + "@verifyOtherDevice": {}, + "requestedKeyVerification": "{sender} meminta verifikasi kunci", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} memulai verifikasi kunci", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "formattedMessagesDescription": "Tampilkan konten pesan kaya seperti teks tebal menggunakan Markdown.", + "@formattedMessagesDescription": {}, + "noUsersFoundWithQuery": "Sayangnya tidak ada pengguna yang dapat ditemukan dengan \"{query}\". Silakan periksa jika ada tipo.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "databaseBuildErrorBody": "Tidak dapat membangun basis data SQLite. Aplikasi mencoba menggunakan basis data lawas untuk sekarang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "passwordIsWrong": "Kata sandi yang kamu masukkan salah", + "@passwordIsWrong": {}, + "searchChatsRooms": "Cari #percakapan, @pengguna...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Buat sebuah grup dan undang pengguna", + "@createGroupAndInviteUsers": {}, + "pleaseEnterYourCurrentPassword": "Silakan masukkan kata sandimu saat ini", + "@pleaseEnterYourCurrentPassword": {}, + "passwordsDoNotMatch": "Kata sandi tidak cocok", + "@passwordsDoNotMatch": {}, + "publicLink": "Tautan publik", + "@publicLink": {}, + "sendTypingNotificationsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu sedang mengetik sebuah pesan baru.", + "@sendTypingNotificationsDescription": {}, + "forwardMessageTo": "Teruskan pesan ke {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceipts": "Kirim laporan dibaca", + "@sendReadReceipts": {}, + "formattedMessages": "Pesan yang diformat", + "@formattedMessages": {}, + "verifyOtherUser": "🔐 Verifikasi pengguna lain", + "@verifyOtherUser": {}, + "sessionLostBody": "Sesimu hilang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Aplikasi sekarang mencoba memulihkan sesimu dari cadangan. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "presenceStyle": "Presensi:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Tampilkan pesan status dari pengguna lain", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "youInvitedToBy": "📩 Kamu telah diundang melalui surel ke:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "publicSpaces": "Space publik", + "@publicSpaces": {}, + "commandHint_sendraw": "Kirim JSON mentah", + "@commandHint_sendraw": {}, + "sendReadReceiptsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu membaca sebuah pesan.", + "@sendReadReceiptsDescription": {}, + "block": "Blokir", + "@block": {}, + "blockedUsers": "Pengguna yang terblokir", + "@blockedUsers": {}, + "blockListDescription": "Kamu bisa memblokir pengguna yang sedang menganggumu. Kamu tidak akan mendapatkan pesan atau undangan ruangan dari pengguna dalam daftar blokiran pribadimu.", + "@blockListDescription": {}, + "blockUsername": "Abaikan nama pengguna", + "@blockUsername": {}, + "hidePresences": "Sembunyikan Daftar Status?", + "@hidePresences": {}, + "transparent": "Transparan", + "@transparent": {}, + "stickers": "Stiker", + "@stickers": {}, + "discover": "Jelajahi", + "@discover": {}, + "startConversation": "Mulai percakapan", + "@startConversation": {}, + "yourGlobalUserIdIs": "ID pengguna globalmu adalah: ", + "@yourGlobalUserIdIs": {}, + "select": "Pilih", + "@select": {}, + "subspace": "Subspace", + "@subspace": {}, + "decline": "Tolak", + "@decline": {}, + "nothingFound": "Tidak ada yang ditemukan...", + "@nothingFound": {}, + "thisDevice": "Perangkat ini:", + "@thisDevice": {}, + "newPassword": "Kata sandi baru", + "@newPassword": {}, + "incomingMessages": "Pesan masuk", + "@incomingMessages": {}, + "databaseMigrationTitle": "Basis data sudah dioptimalkan", + "@databaseMigrationTitle": {}, + "searchForUsers": "Cari @pengguna...", + "@searchForUsers": {}, + "completedKeyVerification": "{sender} menyelesaikan verifikasi kunci", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "databaseMigrationBody": "Silakan tunggu. Ini dapat membutuhkan beberapa waktu.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Tinggalkan kosong untuk menghapus statusmu.", + "@leaveEmptyToClearStatus": {}, + "initAppError": "Terjadi kesalahan saat init aplikasi", + "@initAppError": {}, + "verifyOtherDeviceDescription": "Saat kamu memverifikasi perangkat lain, perangkat tersebut dapat bertukar kunci, sehingga meningkatkan keamananmu secara keseluruhan. 💪 Saat Anda memulai verifikasi, sebuah pemberitahuan akan muncul di aplikasi pada kedua perangkat. Di situ kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain. Sebaiknya siapkan kedua perangkat sebelum kamu memulai verifikasi. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherUserDescription": "Jika kamu memverifikasi pengguna lain, kamu bisa yakin bahwa kamu tahu kepada siapa sebenarnya kamu menulis pesan kepadanya. 💪\n\nSaat kamu memulai verifikasi, kamu dan pengguna lain akan melihat pemberitahuan di aplikasi. Di sana kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain.\n\nCara terbaik untuk melakukannya adalah dengan bertemu secara langsung atau memulai panggilan video. 👭", + "@verifyOtherUserDescription": {}, + "commandHint_ignore": "Abaikan ID Matrix yang diberikan", + "@commandHint_ignore": {}, + "commandHint_unignore": "Batalkan pengabaian ID Matrix yang diberikan", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} obrolan belum dibaca", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "Enkripsi basis data tidak didukung di platform ini", + "@noDatabaseEncryption": {}, + "customEmojisAndStickersBody": "Tambakan atau bagikan emoji atau stiker kustom yang dapat digunakan dalam obrolan apa pun.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Sembunyikan pesan yang dihapus", + "@hideRedactedMessages": {}, + "appLockDescription": "Kunci aplikasi ketika tidak digunakan dengan kode PIN", + "@appLockDescription": {}, + "accessAndVisibility": "Akses dan keterlihatan", + "@accessAndVisibility": {}, + "globalChatId": "ID obrolan global", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Siapa yang diperbolehkan bergabung ke obrolan ini dan bagaimana obrolannya dapat ditemukan.", + "@accessAndVisibilityDescription": {}, + "calls": "Panggilan", + "@calls": {}, + "customEmojisAndStickers": "Emoji dan stiker kustom", + "@customEmojisAndStickers": {}, + "hideRedactedMessagesBody": "Jika seseorang menghapus pesan, pesannya tidak akan terlihat lagi dalam obrolan.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChatsBody": "Jangan tampilkan dalam lini masa obrolan jika seseorang bergabung atau keluar dari obrolan untuk meningkatkan keterlihatan.", + "@hideMemberChangesInPublicChatsBody": {}, + "notifyMeFor": "Beri tahu aku untuk", + "@notifyMeFor": {}, + "hideInvalidOrUnknownMessageFormats": "Sembunyikan format pesan yang tidak valid atau tidak diketahui", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Sembunyikan perubahan anggota dalam obrolan publik", + "@hideMemberChangesInPublicChats": {}, + "overview": "Ikhtisar", + "@overview": {}, + "passwordRecoverySettings": "Pengaturan pemulihan kata sandi", + "@passwordRecoverySettings": {}, + "usersMustKnock": "Pengguna harus mengetuk", + "@usersMustKnock": {}, + "noOneCanJoin": "Tidak ada siapa pun yang dapat bergabung", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} ingin bergabung dengan obrolan.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Belum ada tautan publik yang dibuat", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Ketuk", + "@knock": {}, + "knocking": "Mengetuk", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Obrolan dapat ditemukan melalui pencarian di {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "thereAreCountUsersBlocked": "Saat ini ada {count} pengguna yang diblokir.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "publicChatAddresses": "Alamat obrolan umum", + "@publicChatAddresses": {}, + "createNewAddress": "Buat alamat baru", + "@createNewAddress": {}, + "userRole": "Peran pengguna", + "@userRole": {}, + "minimumPowerLevel": "{level} adalah tingkat daya minimum.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "swipeRightToLeftToReply": "Usap dari kanan ke kiri untuk membalas", + "@swipeRightToLeftToReply": {}, + "searchMore": "Cari lebih banyak...", + "@searchMore": {}, + "gallery": "Galeri", + "@gallery": {}, + "searchIn": "Cari dalam obrolan \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "files": "Berkas", + "@files": {}, + "restricted": "Dibatasi", + "@restricted": {}, + "knockRestricted": "Ketukan dibatasi", + "@knockRestricted": {}, + "alwaysUse24HourFormat": "tidak", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "sendCanceled": "Pengiriman dibatalkan", + "@sendCanceled": {}, + "noChatsFoundHere": "Belum ada chat di sini. Mulai chat baru dengan seseorang menggunakan tombol di bawah. ⤵️", + "@noChatsFoundHere": {}, + "invitedBy": "📩 Diundang oleh {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "markAsUnread": "Tandai sebagai belum dibaca", + "@markAsUnread": {}, + "goToSpace": "Pergi ke space: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "changeTheChatPermissions": "Ubah perizinan chat", + "@changeTheChatPermissions": {}, + "changeTheCanonicalRoomAlias": "Ubah alamat chat publik utama", + "@changeTheCanonicalRoomAlias": {}, + "changeTheVisibilityOfChatHistory": "Ubah keterlihatan riwayat chat", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheDescriptionOfTheGroup": "Ubah deskripsi chat", + "@changeTheDescriptionOfTheGroup": {}, + "sendingAttachment": "Mengirim lampiran...", + "@sendingAttachment": {}, + "compressVideo": "Mengompres video...", + "@compressVideo": {}, + "calculatingFileSize": "Menghitung ukuran berkas...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Menyiapkan pengiriman lampiran...", + "@prepareSendingAttachment": {}, + "sendingAttachmentCountOfCount": "Mengirim lampiran {index} dari {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "userLevel": "{level} - Pengguna", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Ubah pengaturan chat umum", + "@changeGeneralChatSettings": {}, + "discoverHomeservers": "Jelajahi homeserver", + "@discoverHomeservers": {}, + "loginWithMatrixId": "Masuk dengan ID Matrix", + "@loginWithMatrixId": {}, + "doesNotSeemToBeAValidHomeserver": "Sepertinya bukan homeserver yang kompatibel. URL salah?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} chat dan {participants} anggota", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "unread": "Tidak dibaca", + "@unread": {}, + "space": "Space", + "@space": {}, + "spaces": "Space", + "@spaces": {}, + "joinedChats": "Bergabung chat", + "@joinedChats": {}, + "noMoreChatsFound": "Tidak ada chat lagi yang ditemukan...", + "@noMoreChatsFound": {}, + "generatingVideoThumbnail": "Membuat gambar kecil video...", + "@generatingVideoThumbnail": {}, + "changelog": "Catatan perubahan", + "@changelog": {}, + "whatIsAHomeserver": "Apa itu homeserver?", + "@whatIsAHomeserver": {}, + "sendRoomNotifications": "Kirim notifikasi @room", + "@sendRoomNotifications": {}, + "updateInstalled": "🎉 Pembaruan {version} terpasang!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "inviteOtherUsers": "Undang pengguna lain ke chat ini", + "@inviteOtherUsers": {}, + "serverLimitReached": "Batasan server tercapai! Menunggu {seconds} detik...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "chatPermissionsDescription": "Tentukan tingkat kekuasaan yang diperlukan untuk tindakan tertentu dalam chat ini. Tingkat kekuasaan 0, 50 dan 100 biasanya mewakili pengguna, moderator dan admin, tetapi gradasi apa pun dimungkinkan.", + "@chatPermissionsDescription": {}, + "homeserverDescription": "Semua data Anda disimpan di dalam server, seperti halnya penyedia email. Anda dapat memilih homeserver mana yang ingin Anda gunakan, sementara Anda masih dapat berkomunikasi dengan semua orang. Pelajari lebih lanjut di https://matrix.org.", + "@homeserverDescription": {}, + "oneOfYourDevicesIsNotVerified": "Salah satu perangkat Anda tidak terverifikasi", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Catatan: Ketika Anda menghubungkan semua perangkat Anda ke cadangan chat, mereka akan diverifikasi secara otomatis.", + "@noticeChatBackupDeviceVerification": {}, + "welcomeText": "Halo 👋 Ini FluffyChat. Kamu bisa masuk ke homeserver mana pun, yang kompatibel dengan https://matrix.org. Lalu, chat dengan siapa pun. Ini merupakan jaringan perpesanan besar yang terdesentralisasi!", + "@welcomeText": {}, + "continueText": "Lanjutkan", + "@continueText": {}, + "aboutHomeserver": "Tentang {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "blur": "Buram:", + "@blur": {}, + "contactServerAdmin": "Hubungi admin server", + "@contactServerAdmin": {}, + "opacity": "Opasitas:", + "@opacity": {}, + "setWallpaper": "Atur later belakang", + "@setWallpaper": {}, + "serverInformation": "Informasi server:", + "@serverInformation": {}, + "noContactInformationProvided": "Server tidak menyediakan informasi kontak valid apa pun", + "@noContactInformationProvided": {}, + "supportPage": "Laman dukungan", + "@supportPage": {}, + "version": "Versi", + "@version": {}, + "website": "Situs Web", + "@website": {}, + "manageAccount": "Kelola akun", + "@manageAccount": {}, + "contactServerSecurity": "Hubungi keamanan server", + "@contactServerSecurity": {}, + "name": "Nama", + "@name": {}, + "compressBeforeSending": "Kompres sebelum mengirim", + "@compressBeforeSending": {}, + "strikeThrough": "Coret", + "@strikeThrough": {}, + "pleaseFillOut": "Silakan isi", + "@pleaseFillOut": {}, + "addLink": "Tambahkan tautan", + "@addLink": {}, + "invalidUrl": "URL tidak valid", + "@invalidUrl": {}, + "sendUncompressed": "Kirim tanpa kompresi", + "@sendUncompressed": {}, + "boldText": "Teks tebal", + "@boldText": {}, + "italicText": "Teks miring", + "@italicText": {}, + "unableToJoinChat": "Tidak dapat bergabung dalam chat. Mungkin pihak lain telah menutup percakapan.", + "@unableToJoinChat": {}, + "sendImages": "Kirim {count} gambar", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Kompres", + "@compress": {} } diff --git a/assets/l10n/intl_ie.arb b/assets/l10n/intl_ie.arb new file mode 100644 index 0000000000..eea5fe54a8 --- /dev/null +++ b/assets/l10n/intl_ie.arb @@ -0,0 +1,2124 @@ +{ + "group": "Gruppe", + "@group": { + "type": "text", + "placeholders": {} + }, + "identity": "Identitá", + "@identity": { + "type": "text", + "placeholders": {} + }, + "close": "Cluder", + "@close": { + "type": "text", + "placeholders": {} + }, + "confirm": "Confirmar", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "text", + "placeholders": {} + }, + "chats": "Conversationes", + "@chats": { + "type": "text", + "placeholders": {} + }, + "containsUserName": "Contene li nómine", + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "containsDisplayName": "Contene li visibil nómine", + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "copiedToClipboard": "Copiat al Paperiere", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "copyToClipboard": "Copiar al Paperiere", + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "createNewSpace": "Crear un spacie", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "currentlyActive": "Activ actualmen", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "deleteAccount": "Destructer li conto", + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "Remover li missage", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "editBlockedServers": "Modificar blocat servitores", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "everythingReady": "Omni es pret!", + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "extremeOffensive": "Extremmen offensiv", + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "fileName": "Nómine de file", + "@fileName": { + "type": "text", + "placeholders": {} + }, + "fontSize": "Dimension de fonde", + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "fromJoining": "Pro adhesion", + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "enterYourHomeserver": "Provide vor hem-servitor", + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "fromTheInvitation": "Pro invitation", + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "groupIsPublic": "Gruppe es public", + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "help": "Auxilie", + "@help": { + "type": "text", + "placeholders": {} + }, + "hideUnknownEvents": "Celar ínconosset evenimentes", + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "text", + "placeholders": {} + }, + "ignoredUsers": "Ignorat usatores", + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "invitedUsersOnly": "Solmen invitat usatores", + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "login": "Aperter li session", + "@login": { + "type": "text", + "placeholders": {} + }, + "isTyping": "tippa…", + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "joinRoom": "Adherer al chambre", + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "loadMore": "Cargar plu…", + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "inviteForMe": "Invitationes por me", + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "lastActiveAgo": "Ultim activité: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "mention": "Mentionar", + "@mention": { + "type": "text", + "placeholders": {} + }, + "next": "Sequent", + "@next": { + "type": "text", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "text", + "placeholders": {} + }, + "offensive": "Offensiv", + "@offensive": { + "type": "text", + "placeholders": {} + }, + "offline": "For del rete", + "@offline": { + "type": "text", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "text", + "placeholders": {} + }, + "online": "In li rete", + "@online": { + "type": "text", + "placeholders": {} + }, + "memberChanges": "Cambios inter membres", + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "muteChat": "Assurdar li conversation", + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "newChat": "Crear un conversation", + "@newChat": { + "type": "text", + "placeholders": {} + }, + "newVerificationRequest": "Nov demanda de verification!", + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "scanQrCode": "Scannar un code QR", + "@scanQrCode": {}, + "noRoomsFound": "Null chambres trovat…", + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "openInMaps": "Aperter in mappas", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "password": "Contrasigne", + "@password": { + "type": "text", + "placeholders": {} + }, + "passwordForgotten": "Li contrasigne esset obliviat", + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "passwordRecovery": "Reganiar li contrasigne", + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "pleaseChoose": "Ples selecter", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "pushRules": "Regules de push-notificationes", + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "redactMessage": "Redacter li missage", + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "removeDevice": "Remover li aparate", + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "saveFile": "Gardar li file", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "recoveryKey": "Clave de regania", + "@recoveryKey": {}, + "sendMessages": "Inviar missages", + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "sendVideo": "Inviar video", + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "shareLocation": "Partir un localisation", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "spaceName": "Nómine de spacie", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "unavailable": "Índisponibil", + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "toggleUnread": "Marcar quam (ín)leet", + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "unblockDevice": "Deblocar li aparate", + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "unknownDevice": "Ínconosset aparate", + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "voiceMessage": "Voce-missage", + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "wallpaper": "Tapete", + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "messageType": "Tip de missage", + "@messageType": {}, + "start": "Iniciar", + "@start": {}, + "messageInfo": "Information pri li missage", + "@messageInfo": {}, + "openGallery": "Aperter li galerie", + "@openGallery": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "reportUser": "Raportar li usator", + "@reportUser": {}, + "voiceCall": "Telefonada", + "@voiceCall": {}, + "nextAccount": "Sequent conto", + "@nextAccount": {}, + "previousAccount": "Precedent conto", + "@previousAccount": {}, + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "all": "Omni", + "@all": { + "type": "text", + "placeholders": {} + }, + "create": "Crear", + "@create": { + "type": "text", + "placeholders": {} + }, + "connect": "Conexer", + "@connect": { + "type": "text", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "text", + "placeholders": {} + }, + "darkTheme": "Obscur", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "messages": "Missages", + "@messages": { + "type": "text", + "placeholders": {} + }, + "none": "Null", + "@none": { + "type": "text", + "placeholders": {} + }, + "rejoin": "Re-adherer", + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "remove": "Remover", + "@remove": { + "type": "text", + "placeholders": {} + }, + "notifications": "Notificationes", + "@notifications": { + "type": "text", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "text", + "placeholders": {} + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "delete": "Remover", + "@delete": { + "type": "text", + "placeholders": {} + }, + "search": "Sercha", + "@search": { + "type": "text", + "placeholders": {} + }, + "devices": "Aparates", + "@devices": { + "type": "text", + "placeholders": {} + }, + "lightTheme": "Lucid", + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "edit": "Redacter", + "@edit": { + "type": "text", + "placeholders": {} + }, + "security": "Securitá", + "@security": { + "type": "text", + "placeholders": {} + }, + "settings": "Parametres", + "@settings": { + "type": "text", + "placeholders": {} + }, + "share": "Partir", + "@share": { + "type": "text", + "placeholders": {} + }, + "systemTheme": "Del sistema", + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "username": "Nómine de usator", + "@username": { + "type": "text", + "placeholders": {} + }, + "verify": "Verificar", + "@verify": { + "type": "text", + "placeholders": {} + }, + "submit": "Inviar", + "@submit": { + "type": "text", + "placeholders": {} + }, + "unpin": "Defixar", + "@unpin": { + "type": "text", + "placeholders": {} + }, + "verified": "Verificat", + "@verified": { + "type": "text", + "placeholders": {} + }, + "warning": "Avise!", + "@warning": { + "type": "text", + "placeholders": {} + }, + "yes": "Yes", + "@yes": { + "type": "text", + "placeholders": {} + }, + "time": "Hora", + "@time": {}, + "publish": "Publicar", + "@publish": {}, + "sender": "Autor", + "@sender": {}, + "dismiss": "Demisser", + "@dismiss": {}, + "custom": "Personalisat", + "@custom": {}, + "emojis": "Emoji", + "@emojis": {}, + "widgetCustom": "Personalisat", + "@widgetCustom": {}, + "users": "Usatores", + "@users": {}, + "user": "Usator", + "@user": {}, + "forward": "Avan", + "@forward": { + "type": "text", + "placeholders": {} + }, + "groups": "Gruppes", + "@groups": { + "type": "text", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "text", + "placeholders": {} + }, + "inoffensive": "Ínoffensiv", + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "invited": "Invitat", + "@invited": { + "type": "text", + "placeholders": {} + }, + "leave": "Forlassar", + "@leave": { + "type": "text", + "placeholders": {} + }, + "license": "Licentie", + "@license": { + "type": "text", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "text", + "placeholders": {} + }, + "link": "Ligament", + "@link": {}, + "participant": "Participante", + "@participant": { + "type": "text", + "placeholders": {} + }, + "reason": "Cause", + "@reason": { + "type": "text", + "placeholders": {} + }, + "people": "Homes", + "@people": { + "type": "text", + "placeholders": {} + }, + "pin": "Fixar", + "@pin": { + "type": "text", + "placeholders": {} + }, + "privacy": "Privatie", + "@privacy": { + "type": "text", + "placeholders": {} + }, + "recording": "Registrante", + "@recording": { + "type": "text", + "placeholders": {} + }, + "register": "Inregistrar se", + "@register": { + "type": "text", + "placeholders": {} + }, + "reject": "Refuser", + "@reject": { + "type": "text", + "placeholders": {} + }, + "repeatPassword": "Repetir li contrasigne", + "@repeatPassword": {}, + "addEmail": "Adjunter e-post", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "changePassword": "Cambiar li contrasigne", + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "clearArchive": "Vacuar li archive", + "@clearArchive": {}, + "commandHint_clearcache": "Vacuar li cache", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_send": "Inviar li textu", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "configureChat": "Configurar li conversation", + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "directChats": "Direct conversationes", + "@directChats": { + "type": "text", + "placeholders": {} + }, + "enableEncryption": "Activar li ciffration", + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "downloadFile": "Descargar li file", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "emoteSettings": "Parametres de emotiones", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "emoteShortcode": "Curt-code de emotion", + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "emptyChat": "Vacui conversation", + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "videoCall": "Videotelefonada", + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "openChat": "Aperter li conversation", + "@openChat": {}, + "reportMessage": "Raportar li missage", + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "noPermission": "Sin permission", + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "openCamera": "Aperter li cámera", + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "showPassword": "Monstrar li contrasigne", + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "sendFile": "Inviar un file", + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "sendImage": "Inviar un image", + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "sendOriginal": "Inviar li originale", + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "theyMatch": "Corresponde", + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "anyoneCanJoin": "Alquí posse adherer se", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "obtainingLocation": "Obtenente li localisation…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "addWidget": "Adjunter un widget", + "@addWidget": {}, + "addAccount": "Adjunter un conto", + "@addAccount": {}, + "publicRooms": "Public chambres", + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "verifyStart": "Iniciar li verification", + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "roomVersion": "Version del chambre", + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "sendAudio": "Inviar audio", + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "sendSticker": "Inviar un nota adhesiv", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "setStatus": "Assignar li statu", + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "sourceCode": "Code de fonte", + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "play": "Reproducter {fileName}", + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "about": "Pri", + "@about": { + "type": "text", + "placeholders": {} + }, + "accept": "Acceptar", + "@accept": { + "type": "text", + "placeholders": {} + }, + "confirmMatrixId": "Ples confirmar vor Matrix ID por destructer vor conto.", + "@confirmMatrixId": {}, + "allChats": "Omni conversationes", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "addToSpace": "Adjunter al spacie", + "@addToSpace": {}, + "askVerificationRequest": "Esque acceptar ti demanda de verification de {username}?", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "autoplayImages": "Automaticmen reproducter animat images", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "sendOnEnter": "Inviar per Enter", + "@sendOnEnter": {}, + "blocked": "Blocat", + "@blocked": { + "type": "text", + "placeholders": {} + }, + "blockDevice": "Blocar li aparate", + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "botMessages": "Missages de robots", + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "changeDeviceName": "Cambiar li nómine de aparate", + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "changeTheHomeserver": "Cambiar li hem-servitor", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "chat": "Conversation", + "@chat": { + "type": "text", + "placeholders": {} + }, + "changeYourAvatar": "Cambiar vor avatar", + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "chatBackup": "Archive de conversation", + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "Detallies del conversation", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "commandHint_me": "Ples descrir vos", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Forlassar ti chambre", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandInvalid": "Comande es ínvalid", + "@commandInvalid": { + "type": "text" + }, + "widgetEtherpad": "Textual nota", + "@widgetEtherpad": {}, + "banFromChat": "Bannir del conversation", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "changeTheme": "Cambiar li stil", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "commandHint_markasgroup": "Marcar quam gruppe", + "@commandHint_markasgroup": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "screenSharingTitle": "partir li ecran", + "@screenSharingTitle": {}, + "callingPermissions": "Permissiones de telefonada", + "@callingPermissions": {}, + "callingAccount": "Conto telefonante", + "@callingAccount": {}, + "bannedUser": "{username} ha bannit {targetName}", + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "commandHint_html": "Inviar contenete HTML", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "commandHint_plain": "Inviar textu sin formate", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "editRoomAliases": "Modificar pseudonimos del chambre", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "emoteExists": "Emotion ja existe!", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "editRoomAvatar": "Modificar li avatar del chambre", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "groupWith": "Gruppe con {displayname}", + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "invitedUser": "{username} invitat {targetName}", + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "leftTheChat": "Surtit ex li conversation", + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "loadingPleaseWait": "Cargante... ples atender.", + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} ha acceptat li invitation", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "supposedMxid": "To deve esser {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "areYouSureYouWantToLogout": "Esque vu vole cluder li session?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "Li hem-servitor supporta ti tipes de autentication:\n{serverVersions}\nMa ti-ci application supporta solmen:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "cantOpenUri": "Ne successat aperter li adresse {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "badServerVersionsException": "Li hem-servitor supporta ti versiones de specification:\n{serverVersions}\nMa ti-ci application supporta solmen {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "device": "Aparate", + "@device": { + "type": "text", + "placeholders": {} + }, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetName": "Nómine", + "@widgetName": {}, + "account": "Conto", + "@account": { + "type": "text", + "placeholders": {} + }, + "alias": "pseudonim", + "@alias": { + "type": "text", + "placeholders": {} + }, + "archive": "Archive", + "@archive": { + "type": "text", + "placeholders": {} + }, + "banned": "Bannit", + "@banned": { + "type": "text", + "placeholders": {} + }, + "cancel": "Anullar", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "encrypted": "Ciffrat", + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "encryption": "Ciffration", + "@encryption": { + "type": "text", + "placeholders": {} + }, + "homeserver": "Hem-servitor", + "@homeserver": {}, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "text", + "placeholders": {} + }, + "newGroup": "Crear un gruppe", + "@newGroup": {}, + "newSpace": "Crear un spacie", + "@newSpace": {}, + "enterSpace": "Intrar li spacie", + "@enterSpace": {}, + "enterRoom": "Intrar li chambre", + "@enterRoom": {}, + "allSpaces": "Omni spacies", + "@allSpaces": {}, + "numChats": "{number} conversationes", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "logout": "Cluder li session", + "@logout": { + "type": "text", + "placeholders": {} + }, + "send": "Inviar", + "@send": { + "type": "text", + "placeholders": {} + }, + "you": "Vu", + "@you": { + "type": "text", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "skip": "Omisser", + "@skip": { + "type": "text", + "placeholders": {} + }, + "status": "Statu", + "@status": { + "type": "text", + "placeholders": {} + }, + "unverified": "Ínverificat", + "@unverified": {}, + "deviceId": "ID de aparate", + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "editDisplayname": "Redacter li visibil nómine", + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "inviteContact": "Invitar un contacte", + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "requestPermission": "Demandar li permission", + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "areYouSure": "Esque vu es cert?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@chatHasBeenAddedToThisSpace": {}, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@setColorTheme": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@youAcceptedTheInvitation": {}, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@encryptThisChat": {}, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@addToBundle": {}, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@importFromZipFile": {}, + "@dehydrateWarning": {}, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@unlockOldMessages": {}, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@experimentalVideoCalls": {}, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@report": {}, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@openLinkInBrowser": {}, + "@appLock": { + "type": "text", + "placeholders": {} + }, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@notAnImage": {}, + "@chatDescriptionHasBeenChanged": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@sorryThatsNotPossible": {}, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@youJoinedTheChat": {}, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@hydrateTorLong": {}, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@noBackupWarning": {}, + "@storeInSecureStorageDescription": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@importNow": {}, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@invite": {}, + "@enableMultiAccounts": {}, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + } +} \ No newline at end of file diff --git a/assets/l10n/intl_it.arb b/assets/l10n/intl_it.arb index 9bfc520075..3a34141fa2 100644 --- a/assets/l10n/intl_it.arb +++ b/assets/l10n/intl_it.arb @@ -10,7 +10,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} ha accettato l'invito", + "acceptedTheInvitation": "👍 {username} ha accettato l'invito", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -22,12 +22,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informazioni account", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ha abilitato la crittografia end to end", + "activatedEndToEndEncryption": "🔐 {username} ha abilitato la crittografia end to end", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -39,16 +34,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Aggiungi una descrizione al gruppo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Aggiungi un nuovo amico", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Amministratore", "@admin": { "type": "text", @@ -64,11 +49,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Hai già un account?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} ha risposto alla chiamata", "@answeredTheCall": { "type": "text", @@ -91,11 +71,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Stanza archiviata", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Gli utenti ospiti possono partecipare", "@areGuestsAllowedToJoin": { "type": "text", @@ -111,21 +86,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Per favore inserisci la tua frase segrata o chiave di recuparo per mettere in cache le chiavi.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Per far accedere l'altra persona, per favore inserisci la tua frase segreta o chiave di recupero.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Per favore inserisci la tua frase segreta o chiave di recupero per verificare la sessione.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Accettare questa richiesta di verifica da {username}?", "@askVerificationRequest": { "type": "text", @@ -133,26 +98,6 @@ "username": {} } }, - "audioPlayerPause": "Pausa", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Riproduci", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticazione", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar cambiato", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "L'homeserver supporta i tipi di accesso:\n{serverVersions}\nMa questa applicazione supporta solo:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -202,11 +147,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Chiavi in cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancella", "@cancel": { "type": "text", @@ -247,7 +187,7 @@ "username": {} } }, - "changedTheDisplaynameTo": "{username} ha cambiato nome in: {displayname}", + "changedTheDisplaynameTo": "{username} ha cambiato nome in: '{displayname}'", "@changedTheDisplaynameTo": { "type": "text", "placeholders": { @@ -321,21 +261,11 @@ "username": {} } }, - "changelog": "Registro cambiamenti", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Cambia la password", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "I cambiamenti sono stati salvati", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Cambia il server principale", "@changeTheHomeserver": { "type": "text", @@ -351,16 +281,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Cambia server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Cambia sfondo", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "La crittografia è corrotta", "@channelCorruptedDecryptError": { "type": "text", @@ -376,7 +296,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "Il backup della discussione è protetto da una chiave di sicurezza. Assicurati di non perderla.", + "chatBackupDescription": "I tuoi vecchi messaggi sono protetti da una chiave di sicurezza. Assicurati di non perderla.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -396,27 +316,17 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Scegli un username", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearText": "Cancella il testo", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Chiudi", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Confronta e assicurati che le seguenti emoji corrispondano a quelle dell'altro dispositivo:", + "compareEmojiMatch": "Per favore confronta gli emoji", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Confronta e assicurati che le seguenti emoji corrispondano a quelle dell'altro dispositivo:", + "compareNumbersMatch": "Per favore confronta i numeri", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -436,11 +346,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Tentativo di connessione fallito", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Il contatto è stato invitato nel gruppo", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -461,11 +366,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Visualizzatore contenuti", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copiato negli Appunti", "@copiedToClipboard": { "type": "text", @@ -488,16 +388,6 @@ "error": {} } }, - "couldNotSetAvatar": "Impossibile impostare avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Impossibile impostare nome", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} partecipanti", "@countParticipants": { "type": "text", @@ -510,33 +400,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Crea ora un account", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} ha creato la chat", + "createdTheChat": "💬 {username} ha creato la chat", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Crea un nuovo gruppo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Firma incrociata disabilitata", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Firma incrociata abilitata", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Attualmente attivo", "@currentlyActive": { "type": "text", @@ -577,7 +447,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Livello di autorizzazione predefinito", + "defaultPermissionLevel": "Livello di autorizzazione predefinito per i nuovi utenti", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -597,11 +467,6 @@ "type": "text", "placeholders": {} }, - "deny": "Declina", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Dispositivo", "@device": { "type": "text", @@ -617,41 +482,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "La crittografia è sicura solo quando tutti i dispositivi sono stati verificati.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Discussioni dirette", + "directChats": "Chat dirette", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Rimuovi l'immagine", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Scopri", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Scopri gruppi", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Il nominativo è stato cambiato", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Dona", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Scarica il file", "@downloadFile": { "type": "text", @@ -667,21 +507,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Modifica le autorizzazioni discussione", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Modifica il nominativo", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Cambia l'istanza Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "Modifica l'avatar della stanza", "@editRoomAvatar": { "type": "text", @@ -747,21 +577,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritmo crittografia", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Crittografia non abilitata", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Impostazioni crittografia dall'inizio alla fine", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} è entrato in chiamata", "@endedTheCall": { "type": "text", @@ -769,21 +589,11 @@ "senderName": {} } }, - "enterAGroupName": "Inserisci un nome del gruppo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Inserisci un indirizzo e-mail", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Inserisci un username", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Inserisci il tuo server principale", "@enterYourHomeserver": { "type": "text", @@ -804,11 +614,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Dimensione del file", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -824,16 +629,6 @@ "type": "text", "placeholders": {} }, - "friday": "venerdì", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amici", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Dall'adesione", "@fromJoining": { "type": "text", @@ -854,16 +649,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Descrizione del gruppo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descrizione del gruppo modificata", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Il gruppo è pubblico", "@groupIsPublic": { "type": "text", @@ -914,11 +699,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Il server principale non è compatibile", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Quanto è offensivo questo contenuto?", "@howOffensiveIsThisContent": { "type": "text", @@ -944,16 +724,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Puoi ignorare gli utenti che ti stanno disturbando. Non sarai in grado di ricevere messaggi o inviti a stanze virtuali dagli utenti nel tuo elenco personale da ignorare.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignora il nome utente", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Ho cliccato sul collegamento", "@iHaveClickedOnLink": { "type": "text", @@ -986,7 +756,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} ha invitato {targetName}", + "invitedUser": "📩 {username} ha invitato {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -994,7 +764,7 @@ "targetName": {} } }, - "invitedUsersOnly": "Solo per gli utenti invitati", + "invitedUsersOnly": "Solo utenti invitati", "@invitedUsersOnly": { "type": "text", "placeholders": {} @@ -1004,7 +774,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} ti ha invitato/a a FluffyChat.\n1. Installa FluffyChat: https://fluffychat.im\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: {link}", + "inviteText": "{username} ti ha invitato/a a FluffyChat.\n1. Visita fluffychat.im e installa l'applicazione\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1012,17 +782,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "La chiave del dispositivo seguente è corretta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "sta scrivendo…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} si è unito/a alla chat", + "joinedTheChat": "👋 {username} si è unito/a alla chat", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1034,17 +799,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Le chiave sono memorizzate nella cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Mancano le chiavi", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} ha espulso {targetName}", + "kicked": "👞 {username} ha espulso {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1052,7 +807,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} ha espulso e bandito {targetName}", + "kickedAndBanned": "🙅 {username} ha espulso e bandito {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1060,7 +815,7 @@ "targetName": {} } }, - "kickFromChat": "Espulsa dalla discussione", + "kickFromChat": "Espelli dalla chat", "@kickFromChat": { "type": "text", "placeholders": {} @@ -1072,16 +827,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "IP ultimo visto", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto/a molto tempo fa", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Lascia", "@leave": { "type": "text", @@ -1136,21 +881,6 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Promuovi come moderatore", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Promuovi come amministratore", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Assicurati che l'identificatore sia valido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Cambiamenti di membri", "@memberChanges": { "type": "text", @@ -1166,28 +896,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Il messaggio verrà rimosso per tutti i partecipanti", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderatore", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "lunedì", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural =1{1 altro evento} other{{count} altri eventi}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Silenzia discussione", "@muteChat": { "type": "text", @@ -1203,7 +916,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nuovo messaggio in FluffyChat", + "newMessageInFluffyChat": "💬 Nuovo messaggio in FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1228,16 +941,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat attualmente non supporta l'abilitazione della firma incrociata. Abilitala dall'interno di Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Nessuna descrizione", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Nessun emote trovato. 😕", "@noEmotesFound": { "type": "text", @@ -1248,16 +951,11 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Sembra che tu non abbia servizi Google sul tuo telefono. Questa è una buona decisione per la tua riservatezza! Per ricevere notifiche push in FluffyChat consigliamo di utilizzare https://microg.org/ o https://unifiedpush.org/.", + "noGoogleServicesWarning": "Firebase Cloud Messaging non sembra essere disponibile sul tuo dispositivo. Per continuare a ricevere notifiche push, ti consigliamo di installare ntfy. Con ntfy o un altro provider Unified Push puoi ricevere notifiche push in modo sicuro per i dati. Puoi scaricare ntfy dal PlayStore o da F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Fluffychat attualmente non supporta l'attivazione del backup delle chiavi in linea. Abilitalo da Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Nessuno", "@none": { "type": "text", @@ -1273,21 +971,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Nessuna stanza pubblica trovata……", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Nessuna stanza trovata…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Nessuno stato trovato finora.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notifiche", "@notifications": { "type": "text", @@ -1298,18 +986,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Non supportato nel Web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selezionato/i", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} utenti stanno scrivendo…", "@numUsersTyping": { "type": "text", @@ -1327,7 +1003,7 @@ "type": "text", "placeholders": {} }, - "ok": "OK", + "ok": "Ok", "@ok": { "type": "text", "placeholders": {} @@ -1337,11 +1013,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Il backup delle chiavi in linea è disabilitato", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Il backup delle chiavi in linea è abilitato", "@onlineKeyBackupEnabled": { "type": "text", @@ -1362,21 +1033,11 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Opzionale) Nome del gruppo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "participant": "Partecipante", "@participant": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "Dispositivi partecipanti", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "frase segreta o chiave di recupero", "@passphraseOrKey": { "type": "text", @@ -1429,11 +1090,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Si prega di scegliere un nome utente", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Clicca sul collegamenti nell'e-mail e poi procedi.", "@pleaseClickOnLink": { "type": "text", @@ -1444,16 +1100,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Inserisci un identificatore Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Inserisci la tua chiave di sicurezza:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Inserisci la tua password", "@pleaseEnterYourPassword": { "type": "text", @@ -1474,16 +1120,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Gruppi pubblici", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chiave pubblica", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Stanze pubbliche", "@publicRooms": { "type": "text", @@ -1560,11 +1196,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Rimuovi il messaggio", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Mostra i contenuti ricchi dei messaggi", "@renderRichContent": { "type": "text", @@ -1590,16 +1221,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Richiedi di leggere i messaggi più vecchi", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revoca tutte le autorizzazioni", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "La stanza è stata aggiornata", "@roomHasBeenUpgraded": { "type": "text", @@ -1610,36 +1231,16 @@ "type": "text", "placeholders": {} }, - "saturday": "sabato", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "Cerca", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Cerca una discussione", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Sicurezza", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Chiave di sicurezza", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Chiave di sicurezza persa?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Visto da {username}", "@seenByUser": { "type": "text", @@ -1647,22 +1248,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Visto da {username} e {count} altri}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto da {username} e {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Invia", "@send": { "type": "text", @@ -1678,13 +1263,8 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Consenti l'invio di segnalazioni di errore con sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Invia un file", - "@sendFile": { + "sendFile": "Invia un file", + "@sendFile": { "type": "text", "placeholders": {} }, @@ -1708,35 +1288,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} ha inviato un file", + "sentAFile": "📁 {username} ha inviato un file", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} ha inviato un file audio", + "sentAnAudio": "🎤 {username} ha inviato un file audio", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} ha inviato un'immagine", + "sentAPicture": "🖼️ {username} ha inviato un'immagine", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} ha inviato un adesivo", + "sentASticker": "😊 {username} ha inviato un adesivo", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} ha inviato un video", + "sentAVideo": "🎥 {username} ha inviato un video", "@sentAVideo": { "type": "text", "placeholders": { @@ -1750,31 +1330,11 @@ "senderName": {} } }, - "sentryInfo": "Informazioni sulla privacy: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "La sessione è verificata", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Imposta un'immagine di profilo", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "Imposta emoticon personalizzate", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "setGroupDescription": "Imposta una descrizione del gruppo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Imposta il collegamento di invito", "@setInvitationLink": { "type": "text", @@ -1800,7 +1360,7 @@ "type": "text", "placeholders": {} }, - "sharedTheLocation": "{username} ha condiviso la sua posizione", + "sharedTheLocation": "{username} ha condiviso la sua posizione", "@sharedTheLocation": { "type": "text", "placeholders": { @@ -1812,21 +1372,11 @@ "type": "text", "placeholders": {} }, - "signUp": "Iscriviti", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Ignora", "@skip": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Suono, vibrazione, colore diodo", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Codice sorgente", "@sourceCode": { "type": "text", @@ -1839,11 +1389,6 @@ "senderName": {} } }, - "startYourFirstChat": "Inizia subito la tua prima discussione! 🙂\n- Tocca «+»\n- Inserisci il nome utente di un amico\n- Divertiti a chiacchierare", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Stato", "@status": { "type": "text", @@ -1859,26 +1404,11 @@ "type": "text", "placeholders": {} }, - "sunday": "domenica", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Sistema", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Tocca un dispositivo per verificarlo", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tocca per mostrare il menù", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Non corrispondono", "@theyDontMatch": { "type": "text", @@ -1889,26 +1419,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Questa stanza è stata archiviata.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "giovedì", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1945,11 +1455,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "martedì", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Non disponibile", "@unavailable": { "type": "text", @@ -1978,23 +1483,13 @@ "type": "text", "placeholders": {} }, - "unknownEvent": "Evento sconosciuto «{tipo}»", + "unknownEvent": "Evento sconosciuto «{type}»", "@unknownEvent": { "type": "text", "placeholders": { "type": {} } }, - "unknownSessionVerify": "Sessione sconosciuta, verifica", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Sblocca il backup della discussione", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Riattiva l'audio della discussione", "@unmuteChat": { "type": "text", @@ -2005,25 +1500,13 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} discussioni non lette}}", + "unreadChats": "{unreadCount, plural, =1{1 discussione non letta} other{{unreadCount} discussioni non lette}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} messaggi non letti}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Usare i colori compatibili con AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} e {count} altri stanno scrivendo…", "@userAndOthersAreTyping": { "type": "text", @@ -2047,7 +1530,7 @@ "username": {} } }, - "userLeftTheChat": "{username} ha lasciato la chat", + "userLeftTheChat": "🚪 {username} ha lasciato la chat", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2059,11 +1542,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "L'utente non è verificato", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} ha inviato un evento {type}", "@userSentUnknownEvent": { "type": "text", @@ -2072,36 +1550,16 @@ "type": {} } }, - "userUnknownVerification": "L'utente ha uno stato di verifica sconosciuto", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "L'utente è verificato", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Verificato", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sessione verificata con successo!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verifica", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verifica manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Avvia la verifica", "@verifyStart": { "type": "text", @@ -2117,11 +1575,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifica l'utente", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videochiamata", "@videoCall": { "type": "text", @@ -2162,7 +1615,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Immagine di sfondo", + "wallpaper": "Immagine di sfondo:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2172,21 +1625,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "La crittografia dall'inizio alla fine è attualmente in beta! Utilizzala a proprio rischio!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "mercoledì", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Benvenuto/a nella messaggistica istantanea più carina della rete Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Ti abbiamo inviato un'e-mail", "@weSentYouAnEmail": { "type": "text", @@ -2207,7 +1645,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Cancellare il backup della discussione per creare una nuova chiave di sicurezza?", + "wipeChatBackup": "Cancellare il backup della discussione per creare una nuova chiave di ripristino?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2232,53 +1670,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Sei invitato/a a questa chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Non stai più partecipando a questa chat", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Non puoi invitare te stesso", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Sei stato/a bandito/a da questa chat", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Il tuo nome utente", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "La tua chiave pubblica", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Verrai connesso/a a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Ingrandisci", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Rimpicciolisci", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Accesso singolo", "@singlesignon": { "type": "text", @@ -2314,28 +1720,11 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Facoltativo) Il tuo indirizzo e-mail", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, "oopsPushError": "Ops! Purtroppo si è verificato un errore durante l'impostazione delle notifiche push.", "@oopsPushError": { "type": "text", "placeholders": {} }, - "loginWith": "Accedi con {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "invalidEmail": "E-mail non valida", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Modifica gli alias della stanza", "@editRoomAliases": { "type": "text", @@ -2355,23 +1744,17 @@ }, "addToSpace": "Aggiungi a uno spazio", "@addToSpace": {}, - "passwordsDoNotMatch": "Le password non corrispondono!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Inserire un indirizzo email valido.", - "@pleaseEnterValidEmail": {}, - "yourUserId": "Il tuo ID utente:", - "@yourUserId": {}, "commandHint_leave": "Lascia questa stanza", "@commandHint_leave": { "type": "text", "description": "Usage hint for the command /leave" }, - "commandHint_ban": "Banna l'utente specificato da questa stanza.", + "commandHint_ban": "Banna l'utente specificato da questa stanza", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" }, - "sendSticker": "Invia sticker", + "sendSticker": "Invia adesivo", "@sendSticker": { "type": "text", "placeholders": {} @@ -2401,18 +1784,8 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Abilita il backup delle chat per non perdere mai l'accesso alle tue chat.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "serverRequiresEmail": "Questo server ha bisogno di validare la tua email per la registrazione.", "@serverRequiresEmail": {}, - "saveFileToFolder": "Salva file in questa cartella", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "openInMaps": "Apri in maps", "@openInMaps": { "type": "text", @@ -2424,25 +1797,18 @@ "@addAccount": {}, "unverified": "Non verificato", "@unverified": {}, - "pleaseChooseAtLeastChars": "Per favore scegli almeno {min} caratteri.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "sendAsText": "Invia come testo", "@sendAsText": { "type": "text" }, "repeatPassword": "Ripeti password", "@repeatPassword": {}, - "autoplayImages": "Riproduci automaticamente sticker animati ed emoticon", + "autoplayImages": "Riproduci automaticamente adesivi ed emote animati", "@autoplayImages": { "type": "text", "placeholder": {} }, - "cantOpenUri": "Impossibile aprire l'URI", + "cantOpenUri": "Impossibile aprire l'URI {uri}", "@cantOpenUri": { "type": "text", "placeholders": { @@ -2460,12 +1826,1072 @@ "type": "text", "placeholders": {} }, - "setupChatBackup": "Imposta backup delle chat", - "@setupChatBackup": {}, "yourChatBackupHasBeenSetUp": "Il tuo backup delle chat è stato configurato.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Per proteggere i tuoi messaggi, abbiamo generato una chiave di sicurezza. \nConservala in un luogo sicuro, come ad esempio un software di gestione password.", - "@setupChatBackupDescription": {}, - "iWroteDownTheKey": "Ho trascritto la chiave", - "@iWroteDownTheKey": {} + "hugContent": "{senderName} ti abbraccia", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "jumpToLastReadMessage": "Salta all'ultimo messaggio letto", + "@jumpToLastReadMessage": {}, + "allRooms": "Tutte le chat di gruppo", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "obtainingLocation": "Ottengo la posizione…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "commandHint_cuddle": "Invia una coccola", + "@commandHint_cuddle": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "dismiss": "Chiudi", + "@dismiss": {}, + "reportErrorDescription": "😭 Oh no. Qualcosa è andato storto. Se vuoi, puoi segnalare questo bug agli sviluppatori.", + "@reportErrorDescription": {}, + "chatHasBeenAddedToThisSpace": "La chat è stata aggiunta a questo spazio", + "@chatHasBeenAddedToThisSpace": {}, + "unsupportedAndroidVersion": "Versione di Android non supportata", + "@unsupportedAndroidVersion": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "messageType": "Tipo del Messaggio", + "@messageType": {}, + "indexedDbErrorLong": "Sfortunatamente l'archiviazione dei messaggi non è abilitata in modalità privata per impostazione predefinita.\nPer favore visita\n - about:config\n - imposta dom.indexedDB.privateBrowsing.enabled su true\nAltrimenti, non è possibile eseguire FluffyChat.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Uno dei tuoi client è stato disconnesso", + "@oneClientLoggedOut": {}, + "startFirstChat": "Inizia la tua prima chat", + "@startFirstChat": {}, + "callingAccount": "Account di chiamata", + "@callingAccount": {}, + "setColorTheme": "Imposta tema colore:", + "@setColorTheme": {}, + "nextAccount": "Account successivo", + "@nextAccount": {}, + "commandHint_create": "Crea una chat di gruppo vuota\nUtilizza --no-encryption per disattivare la criptazione", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "allSpaces": "Tutti gli spazi", + "@allSpaces": {}, + "supposedMxid": "Dovrebbe essere {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "user": "Utente", + "@user": {}, + "youAcceptedTheInvitation": "👍 Hai accettato l'invito", + "@youAcceptedTheInvitation": {}, + "noMatrixServer": "{server1} non è un server matrix, vuoi invece usare {server2}?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "youInvitedBy": "📩 Sei stato invitato/a da {user}", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "banUserDescription": "L'utente sarà bannato dalla chat e non sarà in grado di rientrare finché non verrà sbannato.", + "@banUserDescription": {}, + "widgetEtherpad": "Nota di testo", + "@widgetEtherpad": {}, + "removeDevicesDescription": "Sarai disconnesso da questo dispositivo e non potrai più ricevere messaggi.", + "@removeDevicesDescription": {}, + "separateChatTypes": "Separare le chat dirette e i gruppi", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "tryAgain": "Riprova", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Hai rimosso e bannato {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "unbanUserDescription": "L'utente potrà rientrare nella chat.", + "@unbanUserDescription": {}, + "sendOnEnter": "Invia quando premi Invio", + "@sendOnEnter": {}, + "youRejectedTheInvitation": "Hai rifiutato l'invito", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Microfono, fotocamera e altri permessi di FluffyChat", + "@otherCallingPermissions": {}, + "messagesStyle": "Messaggi:", + "@messagesStyle": {}, + "widgetUrlError": "Questo non è un URL valido.", + "@widgetUrlError": {}, + "emailOrUsername": "Email o nome utente", + "@emailOrUsername": {}, + "newSpaceDescription": "Gli spazi ti permettono di consolidare le tue chat e di creare comunità private o pubbliche.", + "@newSpaceDescription": {}, + "chatDescription": "Descrizione della chat", + "@chatDescription": {}, + "callingAccountDetails": "Dai l'autorizzazione a FluffyChat di usare l'app di composizione Android nativa.", + "@callingAccountDetails": {}, + "enterSpace": "Unirsi allo spazio", + "@enterSpace": {}, + "encryptThisChat": "Cifra questa chat", + "@encryptThisChat": {}, + "previousAccount": "Account precedente", + "@previousAccount": {}, + "reopenChat": "Riapri la chat", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Per favore inserisci la tua chiave di recupero:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "Per favore fornire un nome da visualizzare.", + "@widgetNameError": {}, + "addToBundle": "Aggiungi al bundle", + "@addToBundle": {}, + "spaceIsPublic": "Lo spazio è pubblico", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "addWidget": "Aggiungi widget", + "@addWidget": {}, + "countFiles": "{count} file", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noKeyForThisMessage": "Questo può accadere se il messaggio è stato inviato prima che hai fatto l'accesso in questo dispositivo.\n\nÈ anche possibile che il mittente abbia bloccato il tuo dispositivo o che qualcosa sia andato storto con la tua connessione ad internet.\n\nSei in grado di leggere il messaggio su altre sessioni? Allora puoi trasferire il messaggio da lì! Vai su Impostazioni > Dispositivi e verifica che i tuoi dispositivi siano verificati l'un l'altro. Quando aprirai la stanza la prossima volta ed entrambe le sessioni sono in primo piano, le chiavi saranno trasmesse automaticamente.\n\nNon vuoi perdere le chiavi quando ti disconnetti o cambi dispositivo? Assicurati di aver attivato il backup delle chat nelle impostazioni.", + "@noKeyForThisMessage": {}, + "commandHint_markasgroup": "Segna come gruppo", + "@commandHint_markasgroup": {}, + "errorObtainingLocation": "Errore cercando di ottenere la posizione: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "hydrateTor": "Utenti TOR: Importa l'esportazione della sessione", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "Notifiche push non disponibili", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Salva nel portachiavi di Apple", + "@storeInAppleKeyChain": {}, + "hydrate": "Ripristina dal file di backup", + "@hydrate": {}, + "invalidServerName": "Nome server non valido", + "@invalidServerName": {}, + "chatPermissions": "Permessi della chat", + "@chatPermissions": {}, + "sender": "Mittente", + "@sender": {}, + "storeInAndroidKeystore": "Salva nel KeyStore di Android", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "Accedi con la password", + "@signInWithPassword": {}, + "makeAdminDescription": "Una volta che fai questo utente amministratore, potresti non essere in grado di rimuoverlo, in quanto avrà i tuoi stessi privilegi.", + "@makeAdminDescription": {}, + "synchronizingPleaseWait": "Sincronizzazione... Attendere prego.", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "commandHint_clearcache": "Pulisci cache", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "saveKeyManuallyDescription": "Salva questa chiave manualmente attivando la finestra di condivisione o gli appunti.", + "@saveKeyManuallyDescription": {}, + "editBundlesForAccount": "Modifica i bundle per questo account", + "@editBundlesForAccount": {}, + "whyIsThisMessageEncrypted": "Perché questo messaggio è illeggibile?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Imposta la descrizione della chat", + "@setChatDescription": {}, + "spaceName": "Nome dello spazio", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "importFromZipFile": "Importa da file .zip", + "@importFromZipFile": {}, + "dehydrateWarning": "Questa azione non può essere annullata. Assicurarsi di aver salvato il file di backup.", + "@dehydrateWarning": {}, + "noOtherDevicesFound": "Nessun altro dispositivo trovato", + "@noOtherDevicesFound": {}, + "redactedBy": "Rimosso da {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "videoCallsBetaWarning": "Nota che le video chiamate sono attualmente in beta. Potrebbero non funzionare come previsto o non funzionare del tutto su alcune piattaforme.", + "@videoCallsBetaWarning": {}, + "signInWith": "Accedi con {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "fileIsTooBigForServer": "Impossibile inviare! Il server supporta solo allegati fino a {max}.", + "@fileIsTooBigForServer": {}, + "homeserver": "Homeserver", + "@homeserver": {}, + "callingPermissions": "Permessi di chiamata", + "@callingPermissions": {}, + "readUpToHere": "Letto fino a qui", + "@readUpToHere": {}, + "start": "Inizio", + "@start": {}, + "unlockOldMessages": "Sblocca i vecchi messaggi", + "@unlockOldMessages": {}, + "numChats": "{number} chat", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "optionalRedactReason": "(Opzionale) Ragione per rimuovere questo messaggio...", + "@optionalRedactReason": {}, + "dehydrate": "Esporta la sessione e cancella il dispositivo", + "@dehydrate": {}, + "locationPermissionDeniedNotice": "Permesso per accedere alla posizione negato. Per favore concedilo per essere in grado di condividere la tua posizione.", + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "archiveRoomDescription": "Questa chat sarà archiviata. Gli altri utenti saranno in grado di vedere che hai lasciato la chat.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Esporta pack di Emote come .zip", + "@exportEmotePack": {}, + "switchToAccount": "Passa all'account {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "experimentalVideoCalls": "Video chiamate sperimentali", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "Per sbloccare i tuoi vecchi messaggi, per favore inserisci la tua chiave di recupero che è stata generata nella tua sessione precedente. La tua chiave di recupero NON è la tua password.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "Vuoi invitare {contact} nella chat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Rimosso da {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "Hai revocato l'invito per {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "appearOnTopDetails": "Permetti all'app di apparire in alto (non necessario se hai già impostato Fluffychat come account di chiamata)", + "@appearOnTopDetails": {}, + "enterRoom": "Unirsi alla stanza", + "@enterRoom": {}, + "reportUser": "Segnala utente", + "@reportUser": {}, + "confirmEventUnpin": "Sei sicuro di voler permanentemente sfissare l'evento?", + "@confirmEventUnpin": {}, + "youInvitedUser": "📩 Hai invitato {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "fileHasBeenSavedAt": "Il file è stato salvato in {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "commandMissing": "{command} non è un comando.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "redactMessageDescription": "Questo messaggio sarà rimosso per tutti i partecipanti di questa conversazione. Questa operazione non può essere annullata.", + "@redactMessageDescription": {}, + "recoveryKey": "Chiave di recupero", + "@recoveryKey": {}, + "commandHint_discardsession": "Scarta sessione", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "invalidInput": "Contenuto non valido!", + "@invalidInput": {}, + "dehydrateTorLong": "Per gli utenti TOR, è raccomandato esportare la sessione prima di chiudere la finestra.", + "@dehydrateTorLong": {}, + "commandHint_myroomnick": "Imposta il nome visualizzato per questa stanza", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "doNotShowAgain": "Non mostrare più", + "@doNotShowAgain": {}, + "report": "segnala", + "@report": {}, + "hideUnimportantStateEvents": "Nascondi gli eventi di stato non importanti", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "condivisione schermo", + "@screenSharingTitle": {}, + "widgetCustom": "Personalizzati", + "@widgetCustom": {}, + "addToSpaceDescription": "Seleziona una spazio a cui aggiungere questa chat.", + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} ti ha inviato degli occhi finti", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "youBannedUser": "Hai bannato {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "addChatDescription": "Aggiungi una descrizione chat...", + "@addChatDescription": {}, + "commandHint_myroomavatar": "Importa la foto profilo per questa stanza ( mxc-uri)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "hasKnocked": "🚪 {user} ha bussato", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "publish": "Pubblicare", + "@publish": {}, + "openLinkInBrowser": "Apri il collegamento nel browser", + "@openLinkInBrowser": {}, + "commandHint_react": "Rispondi con una reazione", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "commandHint_me": "Descriviti", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "messageInfo": "Informazioni del messaggio", + "@messageInfo": {}, + "disableEncryptionWarning": "Per motivi di sicurezza non puoi disabilitare la crittografia in una chat, se era stata abilitata in precedenza.", + "@disableEncryptionWarning": {}, + "directChat": "Chat diretta", + "@directChat": {}, + "wrongPinEntered": "È stato inserito il pin sbagliato! Riprova tra {seconds} secondi...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Invia notifiche di scrittura", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Invita a una chat di gruppo", + "@inviteGroupChat": {}, + "appearOnTop": "Appare in alto", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Invita a una chat privata", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "Questa notifica viene mostrata quando il servizio in primo piano è in esecuzione.", + "@foregroundServiceRunning": {}, + "voiceCall": "Chiamata vocale", + "@voiceCall": {}, + "commandHint_kick": "Rimuovi l'utente fornito da questa stanza", + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "createNewSpace": "Nuovo spazio", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "commandHint_unban": "Sbanna l'utente fornito da questa stanza", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa Emoji", + "@importEmojis": {}, + "wasDirectChatDisplayName": "Chat vuota (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "La descrizione della chat non è ancora stata creata.", + "@noChatDescriptionYet": {}, + "removeFromBundle": "Rimuovi da questo bundle", + "@removeFromBundle": {}, + "confirmMatrixId": "Per eliminare il tuo account, conferma il tuo Matrix ID.", + "@confirmMatrixId": {}, + "learnMore": "Scopri di più", + "@learnMore": {}, + "notAnImage": "Non è un file immagine.", + "@notAnImage": {}, + "users": "Utenti", + "@users": {}, + "openGallery": "Apri la galleria", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Descrizione della chat cambiata", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "Nuovo gruppo", + "@newGroup": {}, + "bundleName": "Nome del bundle", + "@bundleName": {}, + "dehydrateTor": "Utenti TOR: Esporta la sessione", + "@dehydrateTor": {}, + "removeFromSpace": "Rimuovi dallo spazio", + "@removeFromSpace": {}, + "commandHint_op": "Imposta il livello di privilegi dell'utente specificato (predefinito: 50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_join": "Unisciti alla stanza fornita", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "roomUpgradeDescription": "Questa chat sarà ricreata con la nuova versione della stanza. Tutti i partecipanti saranno avvertiti che devono passare alla nuova chat. Puoi leggere di più riguardo le versioni delle stanze su https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "commandHint_invite": "Invia l utente fornito in questa stanza", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "pleaseEnterANumber": "Per favore inserisci un numero maggiore di 0", + "@pleaseEnterANumber": {}, + "youKicked": "👞 Hai rimosso {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "profileNotFound": "Impossibile trovare l'utente sul server. Forse c'è un problema di connessione oppure l'utente non esiste.", + "@profileNotFound": {}, + "jump": "Salta", + "@jump": {}, + "reactedWith": "{sender} ha reagito con {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "sorryThatsNotPossible": "Scusa... questo non è possibile", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "shareInviteLink": "Condividi link d'invito", + "@shareInviteLink": {}, + "commandHint_markasdm": "Contrassegna questo Matrix ID come stanza di messaggi diretti", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Chiave di recupero smarrita?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} ti coccola", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "deviceKeys": "Chiavi del dispositivo:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Le emoticon recentemente usate appariranno qui...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Imposta tema:", + "@setTheme": {}, + "youJoinedTheChat": "Sei entrato/a nella chat", + "@youJoinedTheChat": {}, + "openVideoCamera": "Apri la fotocamera per un video", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "markAsRead": "Segna come letto", + "@markAsRead": {}, + "widgetName": "Nome", + "@widgetName": {}, + "errorAddingWidget": "Errore aggiungendo il widget.", + "@errorAddingWidget": {}, + "commandHint_dm": "Avvia una chat diretta\nUsa --no-encryption per disabilitare la crittografia", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Invia un abbraccio", + "@commandHint_hug": {}, + "replace": "Sostituisci", + "@replace": {}, + "youUnbannedUser": "Hai sbannato {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "newSpace": "Nuovo spazio", + "@newSpace": {}, + "emojis": "Emoji", + "@emojis": {}, + "commandHint_googly": "Invia degli occhi finti", + "@commandHint_googly": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Per favore riprova più tardi o scegli un server diverso.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Crea gruppo", + "@createGroup": {}, + "hydrateTorLong": "Hai esportato la tua sessione l'ultima volta con TOR? Importala velocemente e continua a chattare.", + "@hydrateTorLong": {}, + "time": "Tempo", + "@time": {}, + "custom": "Personalizzato", + "@custom": {}, + "noBackupWarning": "Attenzione! Senza abilitare il backup della chat, perderai l'accesso ai tuoi messaggi crittografati. Si consiglia vivamente di abilitare il backup della chat prima di disconnettersi.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "Salva la chiave di recupero nell'archivio sicuro di questo dispositivo.", + "@storeInSecureStorageDescription": {}, + "openChat": "Apri la Chat", + "@openChat": {}, + "kickUserDescription": "L'utente è stato rimosso, ma non bannato. Nelle chat pubbliche, l'utente potrà rientrare quando vuole.", + "@kickUserDescription": {}, + "importNow": "Importa ora", + "@importNow": {}, + "pinMessage": "Fissa alla stanza", + "@pinMessage": {}, + "invite": "Invitare", + "@invite": {}, + "enableMultiAccounts": "(BETA) Abilita account multipli su questo dispositivo", + "@enableMultiAccounts": {}, + "indexedDbErrorTitle": "Problemi con la modalità privata", + "@indexedDbErrorTitle": {}, + "unsupportedAndroidVersionLong": "Questa funzionalità richiede una versione di Android più recente. Si prega di verificare la presenza di aggiornamenti o supporto per Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Salva in modo sicuro su questo dispositivo", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "Stai condividendo il tuo schermo in FuffyChat", + "@screenSharingDetail": {}, + "placeCall": "Fai una chiamata", + "@placeCall": {}, + "blockListDescription": "Puoi bloccare gli utenti che ti disturbano. Non sarai più in grado di ricevere messaggi o inviti alle stanze dalle persone che hai bloccato.", + "@blockListDescription": {}, + "blockedUsers": "Utenti bloccati", + "@blockedUsers": {}, + "blockUsername": "Nome utente da ignorare", + "@blockUsername": {}, + "createGroupAndInviteUsers": "Crea un gruppo e invita gli utenti", + "@createGroupAndInviteUsers": {}, + "startConversation": "Inizia una conversazione", + "@startConversation": {}, + "groupCanBeFoundViaSearch": "Il gruppo può essere cercato", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Sfortunatamente non è stato trovato nessun utente con \"{query}\". Per favore controlla se hai fatto un errore di battitura.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "Blocca", + "@block": {}, + "yourGlobalUserIdIs": "Il tuo ID dell'utente globale è: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Manda un json grezzo", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Mi dispiace... questa non sembra essere la chiave di recupero corretta.", + "@wrongRecoveryKey": {}, + "groupName": "Nome gruppo", + "@groupName": {}, + "databaseMigrationTitle": "Il database è ottimizzato", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Cerca per #chat, @utenti...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Attendere prego. L'operazione potrebbe richiedere un momento.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "📩 Sei stato invitato tramite link in:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "addChatOrSubSpace": "Aggiungi chat o sottospazio", + "@addChatOrSubSpace": {}, + "subspace": "Sottospazio", + "@subspace": {}, + "publicSpaces": "Spazio pubblico", + "@publicSpaces": {}, + "hidePresences": "Nascondere l'elenco degli stati?", + "@hidePresences": {}, + "pleaseEnterYourCurrentPassword": "Per favore inserisci la tua password attuale", + "@pleaseEnterYourCurrentPassword": {}, + "passwordIsWrong": "La password inserita è sbagliata", + "@passwordIsWrong": {}, + "databaseBuildErrorBody": "Impossibile costruire il database SQlite. L'applicazione proverà ad usare il database legacy per ora. Per favore segnala questo errore agli sviluppatori su {url}. Il messaggio di errore è: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "select": "Seleziona", + "@select": {}, + "newPassword": "Nuova password", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Per favore scegli una password forte", + "@pleaseChooseAStrongPassword": {}, + "thisDevice": "Questo dispositivo:", + "@thisDevice": {}, + "forwardMessageTo": "Inoltra messaggio in {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "verifyOtherUser": "🔐 Verifica altro utente", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "Se verifichi un altro utente, puoi essere certo di sapere a chi stai realmente scrivendo. 💪\n\nQuando inizi una verifica, tu e l'altro utente vedrete un popup nell'app. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro.\n\nIl modo migliore per farlo è incontrarsi o avviare una videochiamata. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDevice": "🔐 Verifica altro dispositivo", + "@verifyOtherDevice": {}, + "verifyOtherDeviceDescription": "Quando verifichi un altro dispositivo, questi dispositivi possono scambiarsi le chiavi, aumentando la tua sicurezza complessiva. 💪 Quando inizi una verifica, apparirà un popup nell'app su entrambi i dispositivi. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro. È meglio avere entrambi i dispositivi a portata di mano prima di iniziare la verifica. 🤳", + "@verifyOtherDeviceDescription": {}, + "discover": "Scopri", + "@discover": {}, + "presencesToggle": "Mostra i messaggi di stato di altri utenti", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "publicLink": "Link pubblico", + "@publicLink": {}, + "leaveEmptyToClearStatus": "Lascia vuoto per cancellare il tuo stato.", + "@leaveEmptyToClearStatus": {}, + "decline": "Declina", + "@decline": {}, + "transparent": "Trasparente", + "@transparent": {}, + "incomingMessages": "Messaggi in arrivo", + "@incomingMessages": {}, + "noChatsFoundHere": "Nessuna chat trovata. Inizia una nuova chat con qualcuno usando il pulsante qui sotto. ⤵️", + "@noChatsFoundHere": {}, + "joinedChats": "Chat a cui partecipi", + "@joinedChats": {}, + "unread": "Non letti", + "@unread": {}, + "space": "Spazio", + "@space": {}, + "spaces": "Spazi", + "@spaces": {}, + "notifyMeFor": "Avvisami per", + "@notifyMeFor": {}, + "invitedBy": "📩 Invitato da {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "knock": "Bussa", + "@knock": {}, + "hideInvalidOrUnknownMessageFormats": "Nascondi formati di messaggi non validi o sconosciuti", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Panoramica", + "@overview": {}, + "presenceStyle": "Presenza:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "swipeRightToLeftToReply": "Scorri da destra a sinistra per rispondere", + "@swipeRightToLeftToReply": {}, + "globalChatId": "ID chat globale", + "@globalChatId": {}, + "hideMemberChangesInPublicChats": "Nascondi le modifiche dei membri nelle chat pubbliche", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Per migliorare la leggibilità, non mostrare nella cronologia della chat se qualcuno si unisce o abbandona una chat pubblica.", + "@hideMemberChangesInPublicChatsBody": {}, + "userWouldLikeToChangeTheChat": "{user} vorrebbe unirsi alla chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Non è stato ancora creato alcun link pubblico", + "@noPublicLinkHasBeenCreatedYet": {}, + "appLockDescription": "Blocca l'app con un codice PIN quando non è in uso", + "@appLockDescription": {}, + "noOneCanJoin": "Nessuno può unirsi", + "@noOneCanJoin": {}, + "usersMustKnock": "Gli utenti devono bussare", + "@usersMustKnock": {}, + "alwaysUse24HourFormat": "disattivato", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "accessAndVisibility": "Accesso e visibilità", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Chi è autorizzato a partecipare a questa chat e come è possibile scoprirla.", + "@accessAndVisibilityDescription": {}, + "calls": "Chiamate", + "@calls": {}, + "customEmojisAndStickers": "Emoji e adesivi personalizzati", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Aggiungi o condividi emoji o adesivi personalizzati che possono essere utilizzati in qualsiasi chat.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Mostra i messaggi rimossi", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Se qualcuno rimuove un messaggio, il messaggio non sarà più visibile nella chat.", + "@hideRedactedMessagesBody": {}, + "passwordRecoverySettings": "Impostazioni di recupero password", + "@passwordRecoverySettings": {}, + "noMoreChatsFound": "Non sono state trovate altre chat...", + "@noMoreChatsFound": {}, + "countChatsAndCountParticipants": "{chats} chat e {participants} partecipanti", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "stickers": "Adesivi", + "@stickers": {}, + "searchMore": "Cerca di più...", + "@searchMore": {}, + "sessionLostBody": "La tua sessione è andata persa. Segnala questo errore agli sviluppatori all'indirizzo {url}. Il messaggio di errore è: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "formattedMessagesDescription": "Visualizza contenuti di messaggi complessi, come testo in grassetto, utilizzando il markdown.", + "@formattedMessagesDescription": {}, + "canceledKeyVerification": "{sender} ha annullato la verifica della chiave", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "chatPermissionsDescription": "Definisci quale livello di privilegi è necessario per determinate azioni in questa chat. I livelli di privilegi 0, 50 e 100 rappresentano solitamente utenti, moderatori e amministratori, ma qualsiasi valore intermedio è possibile.", + "@chatPermissionsDescription": {}, + "passwordsDoNotMatch": "Le password non corrispondono", + "@passwordsDoNotMatch": {}, + "initAppError": "Si è verificato un errore durante l'inizializzazione dell'app", + "@initAppError": {}, + "startedKeyVerification": "{sender} ha avviato la verifica della chiave", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "La chat può essere trovata tramite la ricerca su {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "unreadChatsInApp": "{appname}: {unread} chat non lette", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "thereAreCountUsersBlocked": "Al momento ci sono {count} utenti bloccati.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "nothingFound": "Non è stato trovato nulla...", + "@nothingFound": {}, + "joinSpace": "Unisciti allo spazio", + "@joinSpace": {}, + "commandHint_ignore": "Ignora il Matrix ID fornito", + "@commandHint_ignore": {}, + "commandHint_unignore": "Ignora il Matrix ID specificato", + "@commandHint_unignore": {}, + "noDatabaseEncryption": "La crittografia del database non è supportata su questa piattaforma", + "@noDatabaseEncryption": {}, + "knocking": "Bussare", + "@knocking": {}, + "sendReadReceipts": "Invia ricevute di lettura", + "@sendReadReceipts": {}, + "knockRestricted": "Limitato al bussare", + "@knockRestricted": {}, + "restricted": "Limitato", + "@restricted": {}, + "publicChatAddresses": "Indirizzi di chat pubblici", + "@publicChatAddresses": {}, + "createNewAddress": "Crea un nuovo indirizzo", + "@createNewAddress": {}, + "userRole": "Ruolo utente", + "@userRole": {}, + "minimumPowerLevel": "{level} è il livello minimo di privilegi.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchIn": "Cerca nella chat \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "gallery": "Galleria", + "@gallery": {}, + "formattedMessages": "Messaggi formattati", + "@formattedMessages": {}, + "files": "File", + "@files": {}, + "restoreSessionBody": "L'app ora tenta di ripristinare la sessione dal backup. Segnala questo errore agli sviluppatori all'indirizzo {url}. Il messaggio di errore è: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "acceptedKeyVerification": "{sender} ha accettato la verifica della chiave", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} ha completato la verifica della chiave", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} è pronto per la verifica della chiave", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "searchForUsers": "Cerca @utenti...", + "@searchForUsers": {}, + "sendTypingNotificationsDescription": "Gli altri partecipanti alla chat possono vedere quando stai scrivendo un nuovo messaggio.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Gli altri partecipanti alla chat possono vedere quando hai letto un messaggio.", + "@sendReadReceiptsDescription": {}, + "requestedKeyVerification": "{sender} ha richiesto la verifica della chiave", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "changeTheChatPermissions": "Cambia i permessi della chat", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Cambia la visibilità della cronologia chat", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Cambia l'indirizzo principale della chat pubblica", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Invia notifiche alla @stanza", + "@sendRoomNotifications": {}, + "sendCanceled": "Invio annullato", + "@sendCanceled": {}, + "calculatingFileSize": "Calcolo della dimensione del file...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Preparazione per l'invio dell'allegato...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Invio allegato...", + "@sendingAttachment": {}, + "compressVideo": "Compressione video...", + "@compressVideo": {}, + "generatingVideoThumbnail": "Generazione miniatura video...", + "@generatingVideoThumbnail": {}, + "sendingAttachmentCountOfCount": "Invio dell'allegato {index} di {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "Limite server raggiunto! Attendere {seconds} secondi...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Uno dei tuoi dispositivi non è verificato", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nota: quando colleghi tutti i tuoi dispositivi al backup della chat, vengono verificati automaticamente.", + "@noticeChatBackupDeviceVerification": {}, + "moderatorLevel": "{level} - Moderatore", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeTheDescriptionOfTheGroup": "Cambia la descrizione della chat", + "@changeTheDescriptionOfTheGroup": {}, + "updateInstalled": "🎉 Aggiornamento {version} installato!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "inviteOtherUsers": "Invita altri utenti a questa chat", + "@inviteOtherUsers": {}, + "userLevel": "{level} - Utente", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Amministratore", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Modifica le impostazioni generali della chat", + "@changeGeneralChatSettings": {}, + "loginWithMatrixId": "Accedi con il Matrix ID", + "@loginWithMatrixId": {}, + "homeserverDescription": "Tutti i tuoi dati sono archiviati sull'homeserver, proprio come un provider di posta elettronica. Puoi scegliere quale homeserver vuoi usare, mentre puoi comunque comunicare con tutti. Scopri di più su https://matrix.org.", + "@homeserverDescription": {}, + "discoverHomeservers": "Scopri gli homeserver", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Cos'è un homeserver?", + "@whatIsAHomeserver": {}, + "changelog": "Registro delle modifiche", + "@changelog": {}, + "doesNotSeemToBeAValidHomeserver": "Non sembra essere un homeserver compatibile. URL sbagliato?", + "@doesNotSeemToBeAValidHomeserver": {}, + "goToSpace": "Vai allo spazio: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Contrassegna come non letto", + "@markAsUnread": {}, + "compressBeforeSending": "Comprimi prima di inviare", + "@compressBeforeSending": {}, + "aboutHomeserver": "Informazioni su {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "continueText": "Continua", + "@continueText": {}, + "welcomeText": "Hey Hey 👋 Questa è FluffyChat. Puoi accedere a qualsiasi homeserver compatibile con https://matrix.org. E poi chattare con chiunque. È un'enorme rete di messaggistica decentralizzata!", + "@welcomeText": {}, + "blur": "Sfocatura:", + "@blur": {}, + "opacity": "Opacità:", + "@opacity": {}, + "setWallpaper": "Imposta sfondo", + "@setWallpaper": {}, + "manageAccount": "Gestisci account", + "@manageAccount": {}, + "noContactInformationProvided": "Il server non fornisce alcuna informazione di contatto valida", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Contatta l'amministratore del server", + "@contactServerAdmin": {}, + "contactServerSecurity": "Contatta la sicurezza del server", + "@contactServerSecurity": {}, + "supportPage": "Pagina di supporto", + "@supportPage": {}, + "serverInformation": "Informazioni sul server:", + "@serverInformation": {}, + "name": "Nome", + "@name": {}, + "version": "Versione", + "@version": {}, + "website": "Sito web", + "@website": {}, + "sendUncompressed": "Invia non compresso", + "@sendUncompressed": {}, + "boldText": "Testo in grassetto", + "@boldText": {}, + "italicText": "Testo in corsivo", + "@italicText": {}, + "strikeThrough": "Barrato", + "@strikeThrough": {}, + "pleaseFillOut": "Si prega di compilare", + "@pleaseFillOut": {}, + "invalidUrl": "URL non valido", + "@invalidUrl": {}, + "addLink": "Aggiungi collegamento", + "@addLink": {}, + "unableToJoinChat": "Impossibile partecipare alla chat. Forse l'altra parte ha già chiuso la conversazione.", + "@unableToJoinChat": {}, + "sendImages": "Invia {count} immagine", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Comprimere", + "@compress": {} } diff --git a/assets/l10n/intl_ja.arb b/assets/l10n/intl_ja.arb index dbb345de84..70db07f8fb 100644 --- a/assets/l10n/intl_ja.arb +++ b/assets/l10n/intl_ja.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username}が招待を承諾しました", + "acceptedTheInvitation": "👍{username}が招待を承諾しました", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "アカウント情報", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}がエンドツーエンド暗号化を有効にしました", + "activatedEndToEndEncryption": "🔐{username}がエンドツーエンド暗号化を有効にしました", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "グループの説明を追加する", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "友達を追加", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "管理者", "@admin": { "type": "text", @@ -65,11 +50,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "アカウントをすでにお持ちですか?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName}は通話に出ました", "@answeredTheCall": { "type": "text", @@ -92,11 +72,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "アーカイブされた部屋", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "ゲストユーザーの参加を許可する", "@areGuestsAllowedToJoin": { "type": "text", @@ -112,21 +87,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "鍵をキャッシュするためにはパスフレーズやリカバリーキーを入力してください。", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "他の人を署名するためにはパスフレーズやリカバリーキーを入力してください。", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "セッションを検証するためにはパスフレーズやリカバリーキーを入力してください。", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "{username}の検証リクエストを承認しますか?", "@askVerificationRequest": { "type": "text", @@ -134,27 +99,7 @@ "username": {} } }, - "audioPlayerPause": "一時停止", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "再生", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "認証", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "アバターが変更されました", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "ホームサーバーでサポートされているログインタイプ:\n{serverVersions}\nアプリでは{supportedVersions}しかサポートされていません", + "badServerLoginTypesException": "ホームサーバーでサポートされているログインタイプ:\n{serverVersions}\nアプリがサポートしているログインタイプ:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", "placeholders": { @@ -203,11 +148,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "鍵をキャッシュしました", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "キャンセル", "@cancel": { "type": "text", @@ -322,21 +262,11 @@ "username": {} } }, - "changelog": "変更履歴", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "パスワードを変更", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "変更が保存されました", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "ホームサーバーの変更", "@changeTheHomeserver": { "type": "text", @@ -352,16 +282,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "サーバーを変更する", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "壁紙を変更する", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "暗号が破損しています", "@channelCorruptedDecryptError": { "type": "text", @@ -377,7 +297,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "チャットのバックアップは秘密鍵によって保存されます。失くさないように気をつけてください。", + "chatBackupDescription": "古いメッセージはリカバリーキーで保護されます。紛失しないようにご注意ください。", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -397,18 +317,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "ユーザー名を選択してください", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "アーカイブを消去", "@clearArchive": {}, - "clearText": "テキストを消す", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "閉じる", "@close": { "type": "text", @@ -439,11 +349,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "接続が失敗しました", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "連絡先に登録された人が招待されました", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -464,11 +369,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "コンテンツビューアー", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "クリップボードにコピーされました", "@copiedToClipboard": { "type": "text", @@ -491,16 +391,6 @@ "error": {} } }, - "couldNotSetAvatar": "アバターをセットできませんでした", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "表示名をセットできませんでした", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count}名の参加者", "@countParticipants": { "type": "text", @@ -513,33 +403,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "アカウントを作成する", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}がチャットを作成しました", + "createdTheChat": "💬 {username}がチャットを作成しました", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "グループを作成する", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "相互署名OFF", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "相互署名ON", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "現在アクティブです", "@currentlyActive": { "type": "text", @@ -600,11 +470,6 @@ "type": "text", "placeholders": {} }, - "deny": "拒否", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "デバイス", "@device": { "type": "text", @@ -620,41 +485,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "安全に暗号化を使うためには全てのデバイスを認証する必要があります。", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "ダイレクトチャット", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "画像を無視する", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "発見する", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "グループを発見", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "表示名が変更されました", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "寄付する", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "ファイルのダウンロード", "@downloadFile": { "type": "text", @@ -670,21 +510,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "チャット権限の変更", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "表示名を編集", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Jitsiインスタンスを編集する", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "ルームエイリアスを編集", "@editRoomAliases": { "type": "text", @@ -755,21 +585,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "暗号化アルゴリズム", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "暗号化されていません", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "エンドツーエンド暗号化設定", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName}は通話を切断しました", "@endedTheCall": { "type": "text", @@ -777,21 +597,11 @@ "senderName": {} } }, - "enterAGroupName": "グループ名を入力してください", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "メールアドレスを入力してください", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "ユーザー名を入力してください", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "ホームサーバーを入力してください", "@enterYourHomeserver": { "type": "text", @@ -812,11 +622,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "ファイルサイズ", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -832,16 +637,6 @@ "type": "text", "placeholders": {} }, - "friday": "金曜日", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "友達", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "参加時点から閲覧可能", "@fromJoining": { "type": "text", @@ -862,16 +657,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "グループの説明", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "グループの説明が変更されました", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "グループは公開されています", "@groupIsPublic": { "type": "text", @@ -922,11 +707,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "このホームサーバーは互換性がありません", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "どのくらい攻撃的でしたか?", "@howOffensiveIsThisContent": { "type": "text", @@ -952,16 +732,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "ユーザーは無視することができます。無視したユーザーからのメッセージやルームの招待は受け取れません。", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "ユーザー名を無視する", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "リンクをクリックしました", "@iHaveClickedOnLink": { "type": "text", @@ -977,11 +747,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "無効なメールアドレス", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "連絡先から招待する", "@inviteContact": { "type": "text", @@ -999,7 +764,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username}が{targetName}を招待しました", + "invitedUser": "📩 {username} が {targetName} を招待しました", "@invitedUser": { "type": "text", "placeholders": { @@ -1025,17 +790,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "このデバイスキーは正しいですか?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "が入力しています…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username}がチャットに参加しました", + "joinedTheChat": "👋 {username} がチャットに参加しました", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1047,17 +807,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "鍵はキャッシュされたいます", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "鍵がありません", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}は{targetName}をキックしました", + "kicked": "👞 {username} は {targetName} をキックしました", "@kicked": { "type": "text", "placeholders": { @@ -1065,7 +815,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username}は{targetName}をキックしBANしました", + "kickedAndBanned": "🙅 {username} が {targetName} をキックしブロックしました", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1085,16 +835,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "最終IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "ずいぶん前", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "退室する", "@leave": { "type": "text", @@ -1149,21 +889,6 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "モデレータにする", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "管理者にする", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "識別子が正しいか確認してください", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "メンバーの変更", "@memberChanges": { "type": "text", @@ -1179,28 +904,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "メッセージはすべての参加者から消去されます", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "モデレータ", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "月曜日", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{もう1つのイベント} other{{count}個のイベント}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "チャットのミュート", "@muteChat": { "type": "text", @@ -1216,7 +924,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "FluffyChatに新しいメッセージがあります", + "newMessageInFluffyChat": "💬 FluffyChatに新しいメッセージがあります", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1241,16 +949,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChatは現在相互署名機能をサポートしていません。Elementから有効化してください。", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "説明がありません", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Emoteは見つかりませんでした😕", "@noEmotesFound": { "type": "text", @@ -1261,16 +959,11 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "あなたのスマホにはグーグルサービスがないようですね。プライバシーを保護するための良い選択です!Push通知を受け取るにはmicroGを使うことを推奨しています: https://microg.org/", + "noGoogleServicesWarning": "あなたのスマホにはGoogleサービスがないようですね。プライバシーを保護するための良い選択です!プッシュ通知を受け取るには https://microg.org/ または https://unifiedpush.org/ を使うことをお勧めします。", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "鍵のオンラインバックアップはElementから有効化にしてください。", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "なし", "@none": { "type": "text", @@ -1286,21 +979,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "公開ルームが見つかりませんでした…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "部屋は見つかりませんでした…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "ステータスが見つかりませんでした。", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "通知", "@notifications": { "type": "text", @@ -1311,18 +994,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "ウェブではサポートされていません", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number}選択されています", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count}人が入力中…", "@numUsersTyping": { "type": "text", @@ -1350,11 +1021,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "オンライン鍵バックアップは使用されていません", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "オンライン鍵バックアップは使用されています", "@onlineKeyBackupEnabled": { "type": "text", @@ -1375,26 +1041,11 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(オプション) メールアドレス", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(任意)グループ名", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "participant": "参加者", "@participant": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "ユーザーの使用しているデバイス", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "パスフレーズかリカバリーキー", "@passphraseOrKey": { "type": "text", @@ -1447,11 +1098,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "ユーザー名を選択してください", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "メールのリンクから進めてください。", "@pleaseClickOnLink": { "type": "text", @@ -1462,16 +1108,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "マトリックスIDを入力してください。", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "セキュリティーキーを入力してください:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "パスワードを入力してください", "@pleaseEnterYourPassword": { "type": "text", @@ -1497,16 +1133,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "公開グループ", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "公開鍵", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "公開された部屋", "@publicRooms": { "type": "text", @@ -1578,16 +1204,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "追放を取り消し", + "unbanFromChat": "チャットからのブロックを解除する", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "メッセージを削除", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "リッチメッセージをレンダリングする", "@renderRichContent": { "type": "text", @@ -1613,16 +1234,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "過去のメッセージを読む権限を要求する", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "すべての権限を取り消す", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "部屋はアップグレードされました", "@roomHasBeenUpgraded": { "type": "text", @@ -1633,36 +1244,16 @@ "type": "text", "placeholders": {} }, - "saturday": "土曜日", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "検索", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "チャットを検索する", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "セキュリティ", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "セキュリティキー", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "セキュリティキーを紛失しましたか?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "{username}が既読", "@seenByUser": { "type": "text", @@ -1670,22 +1261,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{{username}と他{count}名が既読}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username}と{username2}が既読", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "送信", "@send": { "type": "text", @@ -1701,11 +1276,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "バグレポートをsentry.ioへ送信することを許可する", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "ファイルを送信", "@sendFile": { "type": "text", @@ -1731,35 +1301,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username}はファイルを送信しました", + "sentAFile": "📁 {username}はファイルを送信しました", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username}は音声を送信しました", + "sentAnAudio": "🎤 {username}は音声を送信しました", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username}は画像を送信しました", + "sentAPicture": "🖼️ {username}は画像を送信しました", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username}はステッカーを送信しました", + "sentASticker": "😊 {username}はステッカーを送信しました", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username}は動画を送信しました", + "sentAVideo": "🎥 {username}は動画を送信しました", "@sentAVideo": { "type": "text", "placeholders": { @@ -1773,21 +1343,6 @@ "senderName": {} } }, - "sentryInfo": "プライバシーについての情報: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "セッションは確認済みです", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "プロフィール画像を設定する", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "メインエイリアスに設定", "@setAsCanonicalAlias": { "type": "text", @@ -1798,11 +1353,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "グループの説明を設定する", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "招待リンクを設定する", "@setInvitationLink": { "type": "text", @@ -1840,21 +1390,11 @@ "type": "text", "placeholders": {} }, - "signUp": "サインアップ", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "スキップ", "@skip": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "音、振動、カラーLED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "ソースコード", "@sourceCode": { "type": "text", @@ -1867,11 +1407,6 @@ "senderName": {} } }, - "startYourFirstChat": "初めてのチャットを開始しましょう!🙂\n・+をタップして\n・友達のユーザー名を入力してください\n・楽しんでください", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "ステータス", "@status": { "type": "text", @@ -1887,26 +1422,11 @@ "type": "text", "placeholders": {} }, - "sunday": "日曜日", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "システム", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "デバイス上でタップして認証", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "メニューを表示するにはタップしてください", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "違います", "@theyDontMatch": { "type": "text", @@ -1917,26 +1437,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "この部屋はアーカイブされています。", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "木曜日", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1973,11 +1473,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "火曜日", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "不在", "@unavailable": { "type": "text", @@ -2013,16 +1508,6 @@ "type": {} } }, - "unknownSessionVerify": "不明なセッションです。再確認してください。", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "チャットのバックアップを解錠する", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "チャットをミュート解除する", "@unmuteChat": { "type": "text", @@ -2033,25 +1518,13 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{{unreadCount}の未読メッセージ}}", + "unreadChats": "{unreadCount, plural, =1{1件の未読メッセージ} other{{unreadCount}件の未読メッセージ}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents}件の未読メッセージ}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "有機EL(AMOLED)対応の色にしますか?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username}と他{count}名が入力しています…", "@userAndOthersAreTyping": { "type": "text", @@ -2075,7 +1548,7 @@ "username": {} } }, - "userLeftTheChat": "{username}は退室しました", + "userLeftTheChat": "🚪 {username}はチャットから退室しました", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2087,11 +1560,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "ユーザーは認証されていません", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username}は{type}イベントを送信しました", "@userSentUnknownEvent": { "type": "text", @@ -2100,36 +1568,16 @@ "type": {} } }, - "userUnknownVerification": "ユーザーは不明な認証状態です", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "ユーザーは認証されました", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "検証済み", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "セッションの確認ができました!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "確認", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "手動で確認", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "確認を始める", "@verifyStart": { "type": "text", @@ -2145,11 +1593,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "ユーザーの認証", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "音声通話", "@videoCall": { "type": "text", @@ -2200,21 +1643,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "エンドツーエンド暗号化は現在ベータ版です!これは自分自身の責任で行ってください!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "水曜日", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Matrixネットワークで一番かわいいチャットアプリへようこそ。", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "あなたにメールを送信しました", "@weSentYouAnEmail": { "type": "text", @@ -2230,12 +1658,12 @@ "type": "text", "placeholders": {} }, - "whyDoYouWantToReportThis": "なぜこれを通報したいのですか?", + "whyDoYouWantToReportThis": "これを通報する理由", "@whyDoYouWantToReportThis": { "type": "text", "placeholders": {} }, - "wipeChatBackup": "新しい秘密鍵を作るためにチャットのバックアップを消去しますか?", + "wipeChatBackup": "チャットのバックアップを消去して、新しいリカバリーキーを作りますか?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2260,69 +1688,28 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "チャットに招待されています", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "あなたはもうこのチャットの参加者ではありません", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "自分自身を招待することはできません", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "チャットからBANされてしまいました", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "あなたのユーザー名", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "あなたの公開鍵", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "{homeserver}に接続します", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "拡大", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "縮小", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "allChats": "すべて会話", "@allChats": { "type": "text", "placeholders": {} }, - "pleaseEnterValidEmail": "正しいメールアドレスを入力してください。", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "パスワードが一致しません!", - "@passwordsDoNotMatch": {}, "addToSpace": "スペースに追加", "@addToSpace": {}, - "bubbleSize": "ふきだしの大きさ", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "cantOpenUri": "URIが開けません {uri}", "@cantOpenUri": { "type": "text", @@ -2332,29 +1719,13 @@ }, "repeatPassword": "パスワードを繰り返そ", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "少なくとも{min}文字を選択してください。", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "autoplayImages": "GIFを自動的に再生する", "@autoplayImages": { "type": "text", "placeholder": {} }, - "yourUserId": "あなたのユーザーID:", - "@yourUserId": {}, - "setupChatBackup": "チャットバックアップを設定する", - "@setupChatBackup": {}, "yourChatBackupHasBeenSetUp": "チャットバックアップを設定ました。", "@yourChatBackupHasBeenSetUp": {}, - "chatHasBeenRemovedFromThisSpace": "チャットはこのスペースに削除されました", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "sendOnEnter": "Enterで送信", "@sendOnEnter": {}, "changeYourAvatar": "アバタるを変化しする", @@ -2362,8 +1733,6 @@ "type": "text", "placeholders": {} }, - "iWroteDownTheKey": "私は鍵を書きました", - "@iWroteDownTheKey": {}, "chatHasBeenAddedToThisSpace": "このスペースにチャットが追加されました", "@chatHasBeenAddedToThisSpace": {}, "commandHint_ban": "このユーザーを禁止する", @@ -2376,6 +1745,463 @@ "type": "text", "description": "Usage hint for the command /clearcache" }, - "addToStory": "ストーリーに追加", - "@addToStory": {} + "commandInvalid": "コマンドが無効", + "@commandInvalid": { + "type": "text" + }, + "commandHint_create": "空のグループチャットを作成\n暗号化を無効にするには、--no-encryption を使用", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "セッションを破棄", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "confirmMatrixId": "アカウントを削除するには、Matrix IDを確認してください。", + "@confirmMatrixId": {}, + "commandHint_markasgroup": "グループとしてマーク", + "@commandHint_markasgroup": {}, + "commandHint_join": "指定した部屋に参加", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "commandHint_send": "テキストを送信", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "hydrate": "バックアップファイルから復元", + "@hydrate": {}, + "commandHint_html": "HTML形式のテキストを送信", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "指定したユーザーをこの部屋に招待", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "commandMissing": "{command} はコマンドではありません。", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "oneClientLoggedOut": "クライアントの 1つがログアウトしました", + "@oneClientLoggedOut": {}, + "addAccount": "アカウントを追加", + "@addAccount": {}, + "editBundlesForAccount": "このアカウントのバンドルを編集", + "@editBundlesForAccount": {}, + "unverified": "未検証", + "@unverified": {}, + "sender": "送信者", + "@sender": {}, + "placeCall": "電話をかける", + "@placeCall": {}, + "voiceCall": "音声通話", + "@voiceCall": {}, + "unsupportedAndroidVersionLong": "この機能を利用するには、より新しいAndroidのバージョンが必要です。アップデートまたはLineage OSのサポートをご確認ください。", + "@unsupportedAndroidVersionLong": {}, + "widgetVideo": "動画", + "@widgetVideo": {}, + "widgetName": "名称", + "@widgetName": {}, + "widgetCustom": "カスタム", + "@widgetCustom": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "dehydrateWarning": "この操作は元に戻せません。バックアップファイルを安全に保存してください。", + "@dehydrateWarning": {}, + "dehydrate": "セッションのエクスポートとデバイスの消去", + "@dehydrate": {}, + "messageType": "メッセージの種類", + "@messageType": {}, + "start": "開始", + "@start": {}, + "publish": "公開", + "@publish": {}, + "indexedDbErrorTitle": "プライベートモードに関する問題", + "@indexedDbErrorTitle": {}, + "addWidget": "ウィジェットを追加", + "@addWidget": {}, + "youBannedUser": "{user} を禁止しました", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "youJoinedTheChat": "チャットに参加しました", + "@youJoinedTheChat": {}, + "youHaveWithdrawnTheInvitationFor": "{user} への招待を取り下げました", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "users": "ユーザー", + "@users": {}, + "youRejectedTheInvitation": "招待を拒否しました", + "@youRejectedTheInvitation": {}, + "screenSharingDetail": "FuffyChatで画面を共有しています", + "@screenSharingDetail": {}, + "homeserver": "ホームサーバー", + "@homeserver": {}, + "scanQrCode": "QRコードをスキャン", + "@scanQrCode": {}, + "obtainingLocation": "位置情報を取得しています…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "addToBundle": "バンドルに追加", + "@addToBundle": {}, + "removeFromBundle": "このバンドルから削除", + "@removeFromBundle": {}, + "bundleName": "バンドル名", + "@bundleName": {}, + "noMatrixServer": "{server1} はMatrixのサーバーではありません。代わりに {server2} を使用しますか?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "openVideoCamera": "ビデオ用にカメラを開く", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "link": "リンク", + "@link": {}, + "or": "または", + "@or": { + "type": "text", + "placeholders": {} + }, + "register": "登録", + "@register": { + "type": "text", + "placeholders": {} + }, + "removeYourAvatar": "アバターを削除する", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "saveFile": "ファイルを保存", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "recoveryKey": "リカバリーキー", + "@recoveryKey": {}, + "singlesignon": "シングルサインオン", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "spaceIsPublic": "スペースは公開されています", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "spaceName": "スペース名", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "最初のチャットを開始する", + "@startFirstChat": {}, + "addToSpaceDescription": "このチャットを追加するスペースを選択してください。", + "@addToSpaceDescription": {}, + "messageInfo": "メッセージの情報", + "@messageInfo": {}, + "openGallery": "ギャラリーを開く", + "@openGallery": {}, + "removeFromSpace": "スペースから削除", + "@removeFromSpace": {}, + "pleaseEnterRecoveryKeyDescription": "古いメッセージを解除するには、以前のセッションで生成されたリカバリーキーを入力してください。リカバリーキーはパスワードではありません。", + "@pleaseEnterRecoveryKeyDescription": {}, + "videoWithSize": "ビデオ ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "openChat": "チャットを開く", + "@openChat": {}, + "experimentalVideoCalls": "実験的なビデオ通話", + "@experimentalVideoCalls": {}, + "emailOrUsername": "メールアドレスまたはユーザー名", + "@emailOrUsername": {}, + "switchToAccount": "アカウント {number} に切り替える", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "nextAccount": "次のアカウント", + "@nextAccount": {}, + "youAcceptedTheInvitation": "👍 招待を承諾しました", + "@youAcceptedTheInvitation": {}, + "errorAddingWidget": "ウィジェットの追加中にエラーが発生しました。", + "@errorAddingWidget": {}, + "widgetNameError": "表示名を入力してください。", + "@widgetNameError": {}, + "youUnbannedUser": "{user} の禁止を解除しました", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 {user} から招待されました", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youKicked": "👞 {user} をキックしました", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "youKickedAndBanned": "🙅 {user} をキックしてブロックしました", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "storeInAppleKeyChain": "Apple KeyChainに保存", + "@storeInAppleKeyChain": {}, + "storeInAndroidKeystore": "Android KeyStoreに保存する", + "@storeInAndroidKeystore": {}, + "storeInSecureStorageDescription": "このデバイスの安全なストレージにリカバリーキーを保存。", + "@storeInSecureStorageDescription": {}, + "unlockOldMessages": "古いメッセージのロックを解除する", + "@unlockOldMessages": {}, + "callingAccount": "通話アカウント", + "@callingAccount": {}, + "callingPermissions": "通話の権限", + "@callingPermissions": {}, + "screenSharingTitle": "画面共有", + "@screenSharingTitle": {}, + "foregroundServiceRunning": "この通知は、フォアグラウンド サービスの実行中に表示されます。", + "@foregroundServiceRunning": {}, + "custom": "カスタム", + "@custom": {}, + "countFiles": "{count}個のファイル", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "storeSecurlyOnThisDevice": "このデバイスに安全に保管する", + "@storeSecurlyOnThisDevice": {}, + "whyIsThisMessageEncrypted": "このメッセージが読めない理由", + "@whyIsThisMessageEncrypted": {}, + "otherCallingPermissions": "マイク、カメラ、その他FluffyChatの権限", + "@otherCallingPermissions": {}, + "appearOnTopDetails": "アプリをトップに表示できるようにする(すでに通話アカウントとしてFluffychatを設定している場合は必要ありません)", + "@appearOnTopDetails": {}, + "dehydrateTorLong": "TOR ユーザーの場合、ウィンドウを閉じる前にセッションをエクスポートすることをお勧めします。", + "@dehydrateTorLong": {}, + "hydrateTorLong": "前回、TOR でセッションをエクスポートしましたか?すぐにインポートしてチャットを続けましょう。", + "@hydrateTorLong": {}, + "enableMultiAccounts": "(ベータ版) このデバイスで複数のアカウントを有効にする", + "@enableMultiAccounts": {}, + "pleaseEnterRecoveryKey": "リカバリーキーを入力してください。", + "@pleaseEnterRecoveryKey": {}, + "serverRequiresEmail": "このサーバーは、登録のためにメールアドレスを検証する必要があります。", + "@serverRequiresEmail": {}, + "sendSticker": "ステッカーを送る", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "synchronizingPleaseWait": "同期中...お待ちください。", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "emojis": "絵文字", + "@emojis": {}, + "markAsRead": "既読にする", + "@markAsRead": {}, + "videoCallsBetaWarning": "ビデオ通話は、現在ベータ版であることにご注意ください。すべてのプラットフォームで期待通りに動作しない、あるいはまったく動作しない可能性があります。", + "@videoCallsBetaWarning": {}, + "confirmEventUnpin": "イベントの固定を完全に解除してもよろしいですか?", + "@confirmEventUnpin": {}, + "unsupportedAndroidVersion": "サポートされていないAndroidのバージョン", + "@unsupportedAndroidVersion": {}, + "user": "ユーザー", + "@user": {}, + "newGroup": "新しいグループ", + "@newGroup": {}, + "noBackupWarning": "警告!チャットのバックアップを有効にしないと、暗号化されたメッセージにアクセスできなくなります。ログアウトする前に、まずチャットのバックアップを有効にすることを強くお勧めします。", + "@noBackupWarning": {}, + "disableEncryptionWarning": "セキュリティ上の理由から、以前は暗号化が有効だったチャットで暗号化を無効にすることはできません。", + "@disableEncryptionWarning": {}, + "youInvitedUser": "📩 {user} を招待しました", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "reactedWith": "{sender} が {reaction} で反応しました", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "createNewSpace": "新しいスペース", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "widgetUrlError": "有効なURLではありません。", + "@widgetUrlError": {}, + "reportUser": "ユーザーを報告", + "@reportUser": {}, + "errorObtainingLocation": "位置情報の取得中にエラーが発生しました: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "pinMessage": "部屋にピン留めする", + "@pinMessage": {}, + "previousAccount": "前のアカウント", + "@previousAccount": {}, + "pleaseChoose": "選択してください", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "oopsPushError": "おっと!残念ながら、プッシュ通知の設定中にエラーが発生しました。", + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "noOtherDevicesFound": "他のデバイスが見つかりません", + "@noOtherDevicesFound": {}, + "recoveryKeyLost": "リカバリーキーを紛失した場合", + "@recoveryKeyLost": {}, + "shareLocation": "位置情報の共有", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "time": "時間", + "@time": {}, + "sendAsText": "テキストとして送信", + "@sendAsText": { + "type": "text" + }, + "commandHint_googly": "ぎょろ目を送る", + "@commandHint_googly": {}, + "commandHint_hug": "ハグを送る", + "@commandHint_hug": {}, + "encryptThisChat": "このチャットを暗号化する", + "@encryptThisChat": {}, + "commandHint_markasdm": "ダイレクトメッセージの部屋としてマークする", + "@commandHint_markasdm": {}, + "commandHint_dm": "ダイレクトチャットを開始する\n暗号化を無効にするには、--no-encryptionを使用してください", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "この部屋を退出", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "この部屋の写真を設定する (mxc-uriで)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "この部屋の表示名を設定する", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "書式設定されていないテキストを送信する", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "リアクションとして返信を送信する", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "dehydrateTor": "TOR ユーザー: セッションをエクスポート", + "@dehydrateTor": {}, + "hydrateTor": "TOR ユーザー: セッションのエクスポートをインポート", + "@hydrateTor": {}, + "locationDisabledNotice": "位置情報サービスが無効になっています。位置情報を共有できるようにするには、位置情報サービスを有効にしてください。", + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "位置情報の権限が拒否されました。位置情報を共有できるように許可してください。", + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "deviceKeys": "デバイスキー:", + "@deviceKeys": {}, + "sorryThatsNotPossible": "申し訳ありません...それは不可能です", + "@sorryThatsNotPossible": {}, + "wasDirectChatDisplayName": "空のチャット (以前は {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "doNotShowAgain": "今後表示しない", + "@doNotShowAgain": {}, + "hideUnimportantStateEvents": "重要でない状態イベントを非表示にする", + "@hideUnimportantStateEvents": {}, + "numChats": "{number} チャット", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "allSpaces": "すべてのスペース", + "@allSpaces": {}, + "enterRoom": "部屋に入る", + "@enterRoom": {}, + "enterSpace": "スペースに入る", + "@enterSpace": {}, + "newSpace": "新しいスペース", + "@newSpace": {}, + "reopenChat": "チャットを再開する", + "@reopenChat": {}, + "signInWith": "{provider}でログイン", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "signInWithPassword": "パスワードでログイン", + "@signInWithPassword": {} } diff --git a/assets/l10n/intl_ka.arb b/assets/l10n/intl_ka.arb new file mode 100644 index 0000000000..8c99e3c9ab --- /dev/null +++ b/assets/l10n/intl_ka.arb @@ -0,0 +1,744 @@ +{ + "alias": "მეტსახელი", + "@alias": { + "type": "text", + "placeholders": {} + }, + "appLockDescription": "პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება", + "@appLockDescription": {}, + "commandHint_hug": "მეგობრული ჩახუტვის გაგზავნა", + "@commandHint_hug": {}, + "areYouSure": "დარწმუნებული ხართ?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "დარწმუნებული ხართ, რომ გამოსვლა გსურთ?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "hugContent": "{senderName} მეგობრულად გეხუტება", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "askSSSSSign": "სხვა მომხმარებლის დადასტურებლად, გთხოვთ, ჩაწეროთ თქვენი ან საიდუმლო ფრაზა, ან აღდგენის გასაღები.", + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "autoplayImages": "ანიმირებული სტიკერებისა და ემოჯების ავტომატური ჩართვა", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "banFromChat": "ჩატიდან გაგდება და ბლოკირება", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "banned": "დაბლოკილია", + "@banned": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "ამ სერვერს აქვს შესვლის მეთოდების მხარდაჭერა:\n{serverVersions}\nმაგრამ ამ აპლიკაციას აქვს მხარდაჭერა მხოლოდ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "sendOnEnter": "გაგზავნა enter-ის დაჭერისას", + "@sendOnEnter": {}, + "bannedUser": "{username} დაბლოკა {targetName}", + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "blockDevice": "მოწყობილების ბლოკირება", + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "blocked": "დაბლოკილია", + "@blocked": { + "type": "text", + "placeholders": {} + }, + "botMessages": "ბოტის შეტყობინებები", + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "cancel": "გაუქმება", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} შეცვალა ისტორიის ხილვადობა: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheJoinRules": "{username} გაწევრიანების წესები შეცვალა", + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheProfileAvatar": "{username} შეცვალა პროფილის ფოტო", + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "chat": "ჩატი", + "@chat": { + "type": "text", + "placeholders": {} + }, + "changeYourAvatar": "პროფილის ფოტოს შეცვლა", + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "თქვენი ჩატის სარეზერვო საშუალება კონფიგურირებული იქნა.", + "@yourChatBackupHasBeenSetUp": {}, + "channelCorruptedDecryptError": "დაშიფვრა დაზიანდა", + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "chatBackupDescription": "თქვენი ძველი შეტყობინებები დაცულია აღდგების გასაღებით. არ დაკარგოთ ის.", + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "commandHint_discardsession": "სესიის გაუქმება", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_invite": "მოცემული მომხმარებლის მოწვევა ამ ოთახში", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "commandHint_plain": "არაფორმატირებული ტექსტის გაგზავნა", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "ტექსტის გაგზავნა", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "commandMissing": "{command} არაა ბრძანება.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "confirm": "დადასტურება", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "connect": "დაკავშირება", + "@connect": { + "type": "text", + "placeholders": {} + }, + "countParticipants": "{count} მონაწილე", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "createGroup": "ჯგუფის შექმნა", + "@createGroup": {}, + "deactivateAccountWarning": "ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?", + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "devices": "მოწყობილებები", + "@devices": { + "type": "text", + "placeholders": {} + }, + "darkTheme": "ბნელი", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "chatPermissions": "ჩატის უფლებები", + "@chatPermissions": {}, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "editRoomAliases": "ოთახის მეტსახელების შეცვლა", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "emoteExists": "ეს ემოცია უკვე არსებობს!", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "emoteInvalid": "ემოციის არასწორი მოკლე კოდი!", + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "importNow": "იმპორტი", + "@importNow": {}, + "importEmojis": "ემოჯის იმპორტი", + "@importEmojis": {}, + "importFromZipFile": "იმპორტი .zip ფაილიდან", + "@importFromZipFile": {}, + "exportEmotePack": "ემოციების .zip ფაილში ექსპორტი", + "@exportEmotePack": {}, + "replace": "ჩანაცვლება", + "@replace": {}, + "accept": "თანხმობა", + "@accept": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} მიიღო მოწვევა", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "account": "ანგარიში", + "@account": { + "type": "text", + "placeholders": {} + }, + "addEmail": "ელ.ფოსტის დამატება", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.", + "@confirmMatrixId": {}, + "addChatDescription": "ჩატის აღწერილობის დამატება...", + "@addChatDescription": {}, + "addToSpace": "სივრცეში დამატება", + "@addToSpace": {}, + "admin": "ადმინი", + "@admin": { + "type": "text", + "placeholders": {} + }, + "all": "ყველა", + "@all": { + "type": "text", + "placeholders": {} + }, + "allChats": "ყველა ჩატი", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "commandHint_cuddle": "ჩახუტების გაგზავნა", + "@commandHint_cuddle": {}, + "answeredTheCall": "{senderName} უპასუხა ზარს", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "anyoneCanJoin": "ყველას შეუძლია გაწევრიანება", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "appLock": "აპლიკაციის ბლოკირება", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "archive": "არქივი", + "@archive": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "გამოშტერილი თვალების გაგზავნა", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} გამოშტერილ თვალებს გიგზავნის", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} გეხუტება", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "areGuestsAllowedToJoin": "შეუძლიათ თუ არა სტუმარ მომხმარებლებს გაწევრიანება", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "askVerificationRequest": "მიიღებთ {username} დადასტურების მოთხოვნას?", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sendTypingNotifications": "წერის შეტყობინების გაგზავნა", + "@sendTypingNotifications": {}, + "cantOpenUri": "ვერ იხსნება ბმული {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "changeDeviceName": "მოწყობილების გადარქმევა", + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ჩატის ფოტო შეცვალა", + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheChatDescriptionTo": "{username} ჩატის ახალი აღწერილობა დააყენა: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "changedTheChatNameTo": "{username} ჩატი გადაარქვა: '{chatname}'", + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "changedTheChatPermissions": "{username} ჩატის უფლებები შეცვალა", + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheGuestAccessRules": "{username} შეცვალა სტუმრების წვდომის წესები", + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheGuestAccessRulesTo": "{username} შეცვალა სტუმრების წვდომის წესები: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheHistoryVisibility": "{username} შეცვალა ისტორიის ხილვადობა", + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheJoinRulesTo": "{username} გაწევრიანების წესები შეცვალა: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "changedTheRoomAliases": "{username} ოთახის მეტსახელები შეცვალა", + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheRoomInvitationLink": "{username} მოწვევის ბმული შეცვალა", + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changePassword": "პაროლის შეცვლა", + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "changeTheHomeserver": "სახლის სერვერის შეცვლა", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "changeTheme": "სტილის შეცვლა", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "ჯგუფის გადარქმევა", + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "chatBackup": "ჩატის სარეზერვო საშუალება", + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "ჩატის დეტალები", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "ჩატი დაემატა ამ სივრცეს", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "ჩატები", + "@chats": { + "type": "text", + "placeholders": {} + }, + "chooseAStrongPassword": "ძლიერი პაროლი აარჩიეთ", + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "clearArchive": "არქივის გაწმენდა", + "@clearArchive": {}, + "close": "დახურვა", + "@close": { + "type": "text", + "placeholders": {} + }, + "commandHint_markasgroup": "აღნიშვნა, როგორც ჯგუფის", + "@commandHint_markasgroup": {}, + "commandHint_ban": "მოცემული მომხმარებლის ბლოკირება ამ ოთახში", + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "­ქეშის გაწმენდა", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_join": "მოცემულ ოთახში გაწევრიანება", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "მოცემული მომხმარებლის წაშლა ამ ოთახიდან", + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "ამ ოთახიდან გასვლა", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "აღწერეთ თქვენი თავი", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "commandHint_unban": "ამ ოთახში მომხმარებლისგან ბლოკის მოხსნა", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "არასწორი ბრძანება", + "@commandInvalid": { + "type": "text" + }, + "compareEmojiMatch": "გთხოვთ, შეადაროთ ეს ემოჯი", + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "compareNumbersMatch": "გთხოვთ, შეადაროთ ეს რიცხვები", + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "configureChat": "ჩატის კონფიგურაცია", + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "კონტაქტი მოწვეული იქნა ჯგუფში", + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "containsUserName": "შეიცავს სახელს", + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "copiedToClipboard": "კოპირებულია ბუფერში", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "copy": "კოპირება", + "@copy": { + "type": "text", + "placeholders": {} + }, + "copyToClipboard": "კოპირება ბუფერში", + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "couldNotDecryptMessage": "შეტყობინების გაშიფვრის შეცდომა: {error}", + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "create": "შექმნა", + "@create": { + "type": "text", + "placeholders": {} + }, + "createdTheChat": "💬 {username} შექმნა ჩატი", + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "createNewSpace": "ახალი სივრცე", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "currentlyActive": "ახლა აქტიურია", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "delete": "წაშლა", + "@delete": { + "type": "text", + "placeholders": {} + }, + "deleteAccount": "ანგარიშის წაშლა", + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "შეტყობინების წაშლა", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "device": "მოწყობილება", + "@device": { + "type": "text", + "placeholders": {} + }, + "deviceId": "მოწყობილების ID", + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "directChats": "პირდაპირი ჩატები", + "@directChats": { + "type": "text", + "placeholders": {} + }, + "allRooms": "ყველა ჯგუფური ჩატები", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "downloadFile": "ფაილის ჩატვირთვა", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "edit": "რედაქტირება", + "@edit": { + "type": "text", + "placeholders": {} + }, + "editBlockedServers": "ბლოკირებული სერვერების რედაქტირება", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "editRoomAvatar": "ოთახის ფოტოს შეცვლა", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "emoteSettings": "ემოციების პარამეტრები", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "globalChatId": "გლობალური ჩატის ID", + "@globalChatId": {}, + "repeatPassword": "გაიმეორეთ პაროლი", + "@repeatPassword": {}, + "notAnImage": "ფაილი არაა სურათი.", + "@notAnImage": {}, + "remove": "წაშლა", + "@remove": { + "type": "text", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} გააქტიურა end to end დაშიფვრა", + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "supposedMxid": "ეს უნდა იყოს {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "about": "შესახებ", + "@about": { + "type": "text", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} შეცვალა ნაჩვენები სახელი: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "commandHint_create": "ცარიელი ჯგუფური ჩატის შექმნა\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "პირდაპირი ჩატის დაწყება\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "HTML ფორმატირებული ტექსტის გაგზავნა", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "commandHint_myroomavatar": "თქვენი ფოტოს დაყენება ამ ოთახისათვის(mxc-uri-ს დახმარებით)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "ამ ოთახისათვის ნაჩვენები სახელის დაყენება", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "მოცემული მომხმარებლისათვის უფლებების დონის დაყენება (ჩვეულებრივ: 50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "რეაქციის სახით პასუხის გაგზავნა", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "containsDisplayName": "ნაჩვენებ სახელს შეიცავს", + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "contentHasBeenReported": "ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან", + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "defaultPermissionLevel": "ნაგულისხმევი უფლების დონე", + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "displaynameHasBeenChanged": "ნაჩვენები სახელი შეიცვალა", + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "editDisplayname": "ნაჩვენები სახელის შეცვლა", + "@editDisplayname": { + "type": "text", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_ko.arb b/assets/l10n/intl_ko.arb index fa1d47e7a9..dbeb4ca6d2 100644 --- a/assets/l10n/intl_ko.arb +++ b/assets/l10n/intl_ko.arb @@ -27,7 +27,7 @@ "type": "text", "placeholders": {} }, - "commandHint_ban": "이 룸에서 주어진 유저 밴하기", + "commandHint_ban": "이 방에서 주어진 유저 영구 추방하기", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -62,7 +62,7 @@ "type": "text", "description": "Usage hint for the command /send" }, - "commandHint_unban": "주어진 유저 이 룸에서 밴 해제하기", + "commandHint_unban": "주어진 유저를 이 방에서 영구추방 해제하기", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" @@ -89,11 +89,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "올바르지 않은 이메일", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "help": "도움", "@help": { "type": "text", @@ -104,27 +99,17 @@ "type": "text", "placeholders": {} }, - "groups": "그룹", + "groups": "그룹 채팅", "@groups": { "type": "text", "placeholders": {} }, - "groupIsPublic": "그룸 공개됨", + "groupIsPublic": "그룹 채팅 공개됨", "@groupIsPublic": { "type": "text", "placeholders": {} }, - "groupDescriptionHasBeenChanged": "그룹 설명 바뀜", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "그룹 설명", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "group": "그룹", + "group": "그룹 채팅", "@group": { "type": "text", "placeholders": {} @@ -144,16 +129,6 @@ "type": "text", "placeholders": {} }, - "friends": "친구", - "@friends": { - "type": "text", - "placeholders": {} - }, - "friday": "금요일", - "@friday": { - "type": "text", - "placeholders": {} - }, "forward": "전달", "@forward": { "type": "text", @@ -169,11 +144,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "파일 크기", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fileName": "파일 이름", "@fileName": { "type": "text", @@ -196,23 +166,11 @@ }, "homeserver": "홈서버", "@homeserver": {}, - "enterAUsername": "유저 이름 입력", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "스페이스 이름 입력", - "@enterASpacepName": {}, "enterAnEmailAddress": "이메일 주소 입력", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAGroupName": "그룹 이름 입력", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} 이 통화를 종료했습니다", "@endedTheCall": { "type": "text", @@ -220,21 +178,11 @@ "senderName": {} } }, - "end2endEncryptionSettings": "종단간 암호화 설정`", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "암호화가 비활성화됨", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "암호화 알고리즘", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryption": "암호화", "@encryption": { "type": "text", @@ -260,11 +208,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "채팅을 잃지 않으려면 채팅 백업을 켜세요.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "emptyChat": "빈 채팅", "@emptyChat": { "type": "text", @@ -310,21 +253,11 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "Jitsi 인스턴스 수정", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "표시 이름 수정", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editChatPermissions": "채팅 권한 수정", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "edit": "수정", "@edit": { "type": "text", @@ -335,36 +268,11 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "취소하고 다시 묻지 않기", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "donate": "후원", - "@donate": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "표시 이름이 변경되었습니다", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "discoverGroups": "그룹 발견", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "발견", - "@discover": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "암호화는 모든 기기들이 확인되었을 때만 안전합니다.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "devices": "기기", "@devices": { "type": "text", @@ -380,11 +288,6 @@ "type": "text", "placeholders": {} }, - "deny": "거부", - "@deny": { - "type": "text", - "placeholders": {} - }, "deleteMessage": "메시지 삭제", "@deleteMessage": { "type": "text", @@ -400,7 +303,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "기본 권한 레벨", + "defaultPermissionLevel": "새로 참가하는 유저들의 기본 권한 레벨", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -420,23 +323,13 @@ "type": "text", "placeholders": {} }, - "createNewGroup": "새로운 그룹", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}이 채팅을 생성함", + "createdTheChat": "💬 {username}님이 채팅을 생성함", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createAccountNow": "지금 계정 생성하기", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "create": "생성", "@create": { "type": "text", @@ -449,16 +342,6 @@ "count": {} } }, - "couldNotSetDisplayname": "표시 이름 설정할 수 없음`", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "아바타 설정할 수 없음", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, "couldNotDecryptMessage": "메시지 복호화할 수 없음: {error}", "@couldNotDecryptMessage": { "type": "text", @@ -486,26 +369,21 @@ "type": "text", "placeholders": {} }, - "containsUserName": "유저 이름 포함", + "containsUserName": "내 아이디 포함", "@containsUserName": { "type": "text", "placeholders": {} }, - "containsDisplayName": "표시 이름 포함", + "containsDisplayName": "내 닉네임 포함", "@containsDisplayName": { "type": "text", "placeholders": {} }, - "contactHasBeenInvitedToTheGroup": "연락처가 그룹에 초대되었습니다", + "contactHasBeenInvitedToTheGroup": "연락처가 채팅에 초대되었습니다", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "연결 시도 실패", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "connect": "연결", "@connect": { "type": "text", @@ -521,12 +399,12 @@ "type": "text", "placeholders": {} }, - "compareNumbersMatch": "다른 기기에서도 아래의 숫자가 일치하는지 비교하세요:", + "compareNumbersMatch": "아래의 숫자가 일치하는지 비교하세요", "@compareNumbersMatch": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "다른 기기에서도 아래의 이모지가 일치하는지 비교하세요:", + "compareEmojiMatch": "아래의 이모지가 일치하는지 비교하세요", "@compareEmojiMatch": { "type": "text", "placeholders": {} @@ -578,28 +456,13 @@ "type": "text", "placeholders": {} }, - "clearText": "문자 지우기", - "@clearText": { - "type": "text", - "placeholders": {} - }, "clearArchive": "저장 지우기", "@clearArchive": {}, - "chooseAUsername": "닉네임 고르기", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "chooseAStrongPassword": "안전한 비밀번호를 설정하세요", "@chooseAStrongPassword": { "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "이 스페이스에서 채팅이 삭제되었습니다", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "이 스페이스에 채팅이 추가되었습니다", "@chatHasBeenAddedToThisSpace": {}, "chatDetails": "채팅 정보", @@ -607,7 +470,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "당신의 채팅 백업은 보안 키로 암호화됩니다. 이 키를 잃어버리지 마세요.", + "chatBackupDescription": "당신의 오래된 메시지는 보안 키로 보호됩니다. 이 키를 잃어버리지 마세요.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -632,17 +495,7 @@ "type": "text", "placeholders": {} }, - "changeWallpaper": "배경 바꾸기", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "서버 바꾸기", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "그룹의 이름 바꾸기", + "changeTheNameOfTheGroup": "채팅의 이름 바꾸기", "@changeTheNameOfTheGroup": { "type": "text", "placeholders": {} @@ -657,43 +510,33 @@ "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "변경들이 저장되었습니다", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changePassword": "비밀번호 바꾸기", "@changePassword": { "type": "text", "placeholders": {} }, - "changelog": "변경 기록", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changedTheRoomInvitationLink": "{username}이 초대 링크 바꿈", + "changedTheRoomInvitationLink": "{username}님이 초대 링크를 바꿈", "@changedTheRoomInvitationLink": { "type": "text", "placeholders": { "username": {} } }, - "changedTheRoomAliases": "{username}이 방 별명을 바꿈", + "changedTheRoomAliases": "{username}님이 방 별명을 바꿈", "@changedTheRoomAliases": { "type": "text", "placeholders": { "username": {} } }, - "changedTheProfileAvatar": "{username}이 자신의 아바타를 바꿈", + "changedTheProfileAvatar": "{username}님이 자신의 아바타를 바꿈", "@changedTheProfileAvatar": { "type": "text", "placeholders": { "username": {} } }, - "changedTheJoinRulesTo": "{username}이 참가 규칙을 {joinRules} 로 바꿈", + "changedTheJoinRulesTo": "{username}님이 참가 규칙을 {joinRules} 로 바꿈", "@changedTheJoinRulesTo": { "type": "text", "placeholders": { @@ -701,14 +544,14 @@ "joinRules": {} } }, - "changedTheJoinRules": "{username}이 참가 규칙을 바꿈", + "changedTheJoinRules": "{username}님이 참가 규칙을 바꿈", "@changedTheJoinRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheHistoryVisibilityTo": "{username}이 대화 기록 설정을 {rules} 로 바꿈", + "changedTheHistoryVisibilityTo": "{username}님이 대화 기록 설정을 {rules} 로 바꿈", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -716,14 +559,14 @@ "rules": {} } }, - "changedTheHistoryVisibility": "{username}이 대화 기록 설정을 변경함", + "changedTheHistoryVisibility": "{username}님이 대화 기록 설정을 변경함", "@changedTheHistoryVisibility": { "type": "text", "placeholders": { "username": {} } }, - "changedTheGuestAccessRulesTo": "{username}이 게스트 접근 규칙을 {rules} 로 변경함", + "changedTheGuestAccessRulesTo": "{username}님이 게스트 접근 규칙을 {rules} 로 변경함", "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { @@ -731,14 +574,14 @@ "rules": {} } }, - "changedTheGuestAccessRules": "{username}이 게스트 접근 규칙을 변경함", + "changedTheGuestAccessRules": "{username}님이 게스트 접근 규칙을 변경함", "@changedTheGuestAccessRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheDisplaynameTo": "{username}이 닉네임을 '{displayname}' 으로 바꿈", + "changedTheDisplaynameTo": "{username}님이 닉네임을 '{displayname}' 로 바꿈", "@changedTheDisplaynameTo": { "type": "text", "placeholders": { @@ -746,14 +589,14 @@ "displayname": {} } }, - "changedTheChatPermissions": "{username}이 채팅 권한을 바꿈", + "changedTheChatPermissions": "{username}님이 채팅 권한을 바꿈", "@changedTheChatPermissions": { "type": "text", "placeholders": { "username": {} } }, - "changedTheChatNameTo": "{username}이 채팅 이름을 '{chatname}' 으로 바꿈", + "changedTheChatNameTo": "{username}님이 채팅 이름을 '{chatname}' 으로 바꿈", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -761,7 +604,7 @@ "chatname": {} } }, - "changedTheChatDescriptionTo": "{username}이 채팅 설명을 '{description}' 으로 변경함", + "changedTheChatDescriptionTo": "{username}님이 채팅 설명을 '{description}' 으로 변경함", "@changedTheChatDescriptionTo": { "type": "text", "placeholders": { @@ -769,7 +612,7 @@ "description": {} } }, - "changedTheChatAvatar": "{username}이 채팅 아바타 바꿈", + "changedTheChatAvatar": "{username}님이 채팅 아바타를 바꿈", "@changedTheChatAvatar": { "type": "text", "placeholders": { @@ -786,11 +629,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "키 캐시됨", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "botMessages": "봇 메시지", "@botMessages": { "type": "text", @@ -806,7 +644,7 @@ "type": "text", "placeholders": {} }, - "bannedUser": "{username}이 {targetName} 밴함", + "bannedUser": "{username}님이 {targetName}님을 영구 추방함", "@bannedUser": { "type": "text", "placeholders": { @@ -814,12 +652,12 @@ "targetName": {} } }, - "banned": "밴됨", + "banned": "영구 추방됨", "@banned": { "type": "text", "placeholders": {} }, - "banFromChat": "채팅에서 밴", + "banFromChat": "채팅에서 영구 추방", "@banFromChat": { "type": "text", "placeholders": {} @@ -842,53 +680,23 @@ "supportedVersions": {} } }, - "avatarHasBeenChanged": "아바타 바뀜", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "자동으로 움직이는 스티커와 이모트 재생", "@autoplayImages": { "type": "text", "placeholder": {} }, - "authentication": "인증", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "재생", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "일시정지", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "{username}의 인증 요청을 수락할까요?", + "askVerificationRequest": "{username}님의 인증 요청을 수락할까요?", "@askVerificationRequest": { "type": "text", "placeholders": { "username": {} } }, - "askSSSSVerify": "당신의 세션을 인증하기 위해 저장 비밀번호나 복구 키를 입력해주세요.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "다른 사람을 서명하기 위해서, 저장 비밀번호나 복구 키를 입력해주세요.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSCache": "키를 캐시하기 위해 저장 비밀번호나 복구 키를 입력해주세요.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "areYouSureYouWantToLogout": "로그아웃하고 싶은 것이 확실한가요?", "@areYouSureYouWantToLogout": { "type": "text", @@ -904,11 +712,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "저장된 방", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "archive": "저장", "@archive": { "type": "text", @@ -924,63 +727,43 @@ "type": "text", "placeholders": {} }, - "answeredTheCall": "{senderName} 가 전화에 응답했습니다", + "answeredTheCall": "{senderName}님이 전화에 응답했습니다", "@answeredTheCall": { "type": "text", "placeholders": { "senderName": {} } }, - "alreadyHaveAnAccount": "이미 계정이 있나요?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "alias": "별명", "@alias": { "type": "text", "placeholders": {} }, - "admin": "관리자", + "admin": "운영자", "@admin": { "type": "text", "placeholders": {} }, "addToSpace": "스페이스에 추가", "@addToSpace": {}, - "addNewFriend": "새 친구 추가", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "그룹 소개 추가", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "addEmail": "이메일 추가", "@addEmail": { "type": "text", "placeholders": {} }, - "activatedEndToEndEncryption": "{username}가 종단간 암호화를 활성화함", + "activatedEndToEndEncryption": "🔐 {username}님이 종단간 암호화를 활성화함", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "accountInformation": "계정 정보", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "account": "계정", "@account": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username}가 초대를 수락함", + "acceptedTheInvitation": "👍 {username}님이 초대를 수락함", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -1007,11 +790,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "홈서버가 호환되지 않음", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "hideUnknownEvents": "알 수 없는 이벤트 숨기기", "@hideUnknownEvents": { "type": "text", @@ -1022,7 +800,7 @@ "type": "text", "placeholders": {} }, - "hasWithdrawnTheInvitationFor": "{username}이 {targetName}에 대한 초대를 철회함", + "hasWithdrawnTheInvitationFor": "{username}님이 {targetName}님에 대한 초대를 철회함", "@hasWithdrawnTheInvitationFor": { "type": "text", "placeholders": { @@ -1030,12 +808,12 @@ "targetName": {} } }, - "guestsAreForbidden": "게스트는 금지되어 있습니다", + "guestsAreForbidden": "게스트가 들어올 수 없음", "@guestsAreForbidden": { "type": "text", "placeholders": {} }, - "groupWith": "{displayname} 과의 그룹", + "groupWith": "{displayname}님과의 그룹", "@groupWith": { "type": "text", "placeholders": { @@ -1089,16 +867,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "콘텐츠 뷰어", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "당신은 이 채팅에 초대되었습니다", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "yes": "확인", "@yes": { "type": "text", @@ -1114,7 +882,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "새로운 보안 키를 생성하기 위해 채팅 백업을 초기화할까요?", + "wipeChatBackup": "새로운 복구키를 생성하기 위해 채팅 백업을 초기화할까요?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -1124,7 +892,7 @@ "type": "text", "placeholders": {} }, - "whoIsAllowedToJoinThisGroup": "누가 이 그룹에 들어오도록 허용할지", + "whoIsAllowedToJoinThisGroup": "누가 이 그룹 채팅에 들어오도록 허용할지", "@whoIsAllowedToJoinThisGroup": { "type": "text", "placeholders": {} @@ -1139,27 +907,12 @@ "type": "text", "placeholders": {} }, - "welcomeText": "Matrix 네트워크에서 가장 귀여운 인스턴트 메신저에 오신 걸 환영해요.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "wednesday": "수요일", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "종단간 암호화는 현재 베타입니다! 주의하여 사용하십시오!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, "warning": "경고!", "@warning": { "type": "text", "placeholders": {} }, - "wallpaper": "배경", + "wallpaper": "배경:", "@wallpaper": { "type": "text", "placeholders": {} @@ -1199,11 +952,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "유저 확인", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "verifyTitle": "다른 계정 확인 중", "@verifyTitle": { "type": "text", @@ -1219,56 +967,36 @@ "type": "text", "placeholders": {} }, - "verifyManual": "직접 확인", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verify": "확인", "@verify": { "type": "text", "placeholders": {} }, - "verifiedSession": "세션을 성공적으로 확인했어요!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verified": "확인됨", "@verified": { "type": "text", "placeholders": {} }, - "userVerified": "유저가 확인됨", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "유저가 확인되지 않음", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "username": "유저 이름", "@username": { "type": "text", "placeholders": {} }, - "userLeftTheChat": "{username}이 채팅을 나감", + "userLeftTheChat": "🚪 {username}님이 채팅을 나감", "@userLeftTheChat": { "type": "text", "placeholders": { "username": {} } }, - "userIsTyping": "{username}이 입력 중…", + "userIsTyping": "{username}님이 입력 중…", "@userIsTyping": { "type": "text", "placeholders": { "username": {} } }, - "userAndUserAreTyping": "{username}과 {username2}가 입력 중…", + "userAndUserAreTyping": "{username}님과 {username2}님이 입력 중…", "@userAndUserAreTyping": { "type": "text", "placeholders": { @@ -1276,7 +1004,7 @@ "username2": {} } }, - "userAndOthersAreTyping": "{username}과 {count}명이 입력 중…", + "userAndOthersAreTyping": "{username}님 + {count}명이 입력 중…", "@userAndOthersAreTyping": { "type": "text", "placeholders": { @@ -1289,11 +1017,6 @@ "type": "text", "placeholders": {} }, - "unlockChatBackup": "채팅 백업 잠금 해제", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unknownEncryptionAlgorithm": "알 수 없는 암호화 알고리즘", "@unknownEncryptionAlgorithm": { "type": "text", @@ -1304,16 +1027,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "화요일", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "공개 그룹", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "pin": "고정", "@pin": { "type": "text", @@ -1344,11 +1057,6 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(선택) 그룹 이름", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "openInMaps": "지도에서 열기", "@openInMaps": { "type": "text", @@ -1408,18 +1116,6 @@ "count": {} } }, - "numberSelected": "{number} 선택됨", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "notSupportedInWeb": "웹에서 지원되지 않음", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, "notificationsEnabledForThisAccount": "이 계정에서 알림이 활성화되었습니다", "@notificationsEnabledForThisAccount": { "type": "text", @@ -1437,12 +1133,6 @@ }, "scanQrCode": "QR 코드 스캔", "@scanQrCode": {}, - "typeInInviteLinkManually": "초대 링크 직접 입력...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "당신의 초대 링크 공유", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "서로 가깝지 않다면 초대 링크를 공유하거나 QR 코드를 스캔하세요.", - "@createNewChatExplaination": {}, "noMatrixServer": "{server1}은 matrix 서버가 아닙니다, {server2}를 대신 사용할까요?", "@noMatrixServer": { "type": "text", @@ -1456,13 +1146,6 @@ "type": "text", "placeholders": {} }, - "loginWith": "{brand} 로 로그인", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logInTo": "{homeserver} 에 로그인", "@logInTo": { "type": "text", @@ -1495,12 +1178,12 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "FluffyChat에서 새로운 메시지", + "newMessageInFluffyChat": "💬 FluffyChat에서 새로운 메시지", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} }, - "newChat": "새로운 채팅", + "newChat": "새 채팅", "@newChat": { "type": "text", "placeholders": {} @@ -1510,16 +1193,6 @@ "type": "text", "placeholders": {} }, - "monday": "월요일", - "@monday": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "모든 참여자에게서 메시지가 지워집니다", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "messages": "메시지", "@messages": { "type": "text", @@ -1530,30 +1203,11 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "관리자로 만들기", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, "logout": "로그아웃", "@logout": { "type": "text", "placeholders": {} }, - "moreEvents": "{count,plural, =1{1개 이상 이벤트} other{{count} 이벤트}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1개의 읽지 않은 메시지} other{{unreadEvents} 개}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, "unreadChats": "{unreadCount, plural, =1{읽지 않은 채팅 1} other{{unreadCount} 개}}", "@unreadChats": { "type": "text", @@ -1561,16 +1215,6 @@ "unreadCount": {} } }, - "timeOfDay": "{hours24}시 {minutes}분", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "renderRichContent": "풍부한 메시지 콘텐츠 렌더링", "@renderRichContent": { "type": "text", @@ -1581,83 +1225,21 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat은 현재 교차 서명을 활성화하는 것을 지원하지 않습니다. Element에서 활성화해주세요.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "식별자가 유효한지 확인하세요", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "운영자 만들기", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "사진 삭제", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "교차 서명 켜짐", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "교차 서명 꺼짐", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, "all": "모두", "@all": { "type": "text", "placeholders": {} }, - "zoomOut": "축소", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "확대", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "{homeserver} 에 연결됩니다", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "yourPublicKey": "당신의 공개 키", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "당신의 유저 이름", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "당신의 채팅이 동기화되는 중…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "당신은 이 채팅에서 밴되었습니다", + "youHaveBeenBannedFromThisChat": "당신은 이 채팅에서 영구 추방되었습니다", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "자신을 초대할 수 없습니다", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "당신은 더 이상 이 채팅에 참여하지 않습니다", "@youAreNoLongerParticipatingInThisChat": { "type": "text", @@ -1673,12 +1255,7 @@ "type": "text", "placeholders": {} }, - "userUnknownVerification": "사용자가 알 수 없는 확인 상태를 가짐", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username}이 {type} 이벤트 보냄", + "userSentUnknownEvent": "{username}님이 {type} 이벤트 보냄", "@userSentUnknownEvent": { "type": "text", "placeholders": { @@ -1686,21 +1263,11 @@ "type": {} } }, - "useAmoledTheme": "AMOLED 호환 색을 사용할까요?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "음소거 해제", "@unmuteChat": { "type": "text", "placeholders": {} }, - "unknownSessionVerify": "알 수 없는 세션, 확인해주세요", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unknownEvent": "알 수 없는 이벤트 '{type}'", "@unknownEvent": { "type": "text", @@ -1713,7 +1280,7 @@ "type": "text", "placeholders": {} }, - "unbannedUser": "{username}이 {targetName} 밴 해제함", + "unbannedUser": "{username}님이 {targetName}님에대한 영구추방을 해제함", "@unbannedUser": { "type": "text", "placeholders": { @@ -1757,16 +1324,6 @@ "type": "text", "placeholders": {} }, - "thursday": "목요일", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "이 방은 보관되었습니다.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, "theyMatch": "일치합니다", "@theyMatch": { "type": "text", @@ -1777,21 +1334,6 @@ "type": "text", "placeholders": {} }, - "tapToShowMenu": "탭하여 메뉴 표시", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "탭하여 이미지 표시", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "확인할 기기를 탭하세요", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "systemTheme": "시스템", "@systemTheme": { "type": "text", @@ -1802,11 +1344,6 @@ "type": "text", "placeholders": {} }, - "sunday": "일요일", - "@sunday": { - "type": "text", - "placeholders": {} - }, "submit": "제출", "@submit": { "type": "text", @@ -1822,11 +1359,6 @@ "type": "text", "placeholders": {} }, - "startYourFirstChat": "당신의 처음 채팅을 바로 시작하세요! 🙂\n- '새로운 채팅' 버튼을 누르고\n- 친구의 유저 이름 입력\n- 채팅을 즐기세요", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "startedACall": "{senderName} 가 통화 시작함", "@startedACall": { "type": "text", @@ -1849,34 +1381,11 @@ "type": "text", "placeholders": {} }, - "seenByUserAndCountOthers": "{count, plural, other{{username}과 이외 {count}명이 읽음}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, "pushRules": "푸시 규칙", "@pushRules": { "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Matrix ID를 입력해주세요.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "참여한 사용자 기기", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "lastSeenIp": "마지막 활동 IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, "lastActiveAgo": "마지막 활동: {localizedTimeShort}", "@lastActiveAgo": { "type": "text", @@ -1950,46 +1459,22 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "온라인 키 백업이 비활성화됨", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "아무 상태도 발견되지 않음.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "아무 방도 발견되지 않았어요…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "아무 공개 방도 발견되지 않았어요…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noPasswordRecoveryDescription": "당신은 비밀번호를 복구할 방법을 추가하지 않았습니다.", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} }, - "newUsernameDescription": "당신의 사용자 ID는 @사용자 이름:서버 이름 의 형식을 가질 것입니다", - "@newUsernameDescription": {}, - "newPasswordDescription": "비밀번호를 복구하기 위해서는, 당신의 계정에 이메일 주소를 추가해야합니다.", - "@newPasswordDescription": {}, "none": "없음", "@none": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "온라인 키 백업을 Element에서 켜주세요.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "이 휴대폰에 Google 서비스가 없는 것 같습니다. 프라이버시를 위해 좋은 결정이죠! FluffyChat에서 푸시 알림을 받으려면 https://microg.org/ 이나 https://unifiedpush.org/ 을 사용하는 것을 권장합니다.", + "noGoogleServicesWarning": "이 휴대폰에 Firebase Cloud Messaging 서비스가 없는 것 같습니다. FluffyChat에서 푸시 알림을 받으려면 ntfy 사용을 추천합니다. ntfy 혹은 다른 푸시 알림 제공자를 사용하면 알림을 보안적인 방법으로 받을 수 있습니다. ntfy는 PlayStore와 F-Droid에서 설치 가능합니다.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -2004,11 +1489,6 @@ "type": "text", "placeholders": {} }, - "noDescription": "설명 없음", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noConnectionToTheServer": "서버에 연결 없음", "@noConnectionToTheServer": { "type": "text", @@ -2044,31 +1524,16 @@ "type": "text", "placeholders": {} }, - "lastSeenLongTimeAgo": "오래 전 접속", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "sourceCode": "소스 코드", "@sourceCode": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "소리, 진동 LED-색", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "skip": "스킵", "@skip": { "type": "text", "placeholders": {} }, - "signUp": "가입", - "@signUp": { - "type": "text", - "placeholders": {} - }, "showPassword": "비밀번호 보이기", "@showPassword": { "type": "text", @@ -2079,7 +1544,7 @@ "type": "text", "placeholders": {} }, - "sharedTheLocation": "{username}이 위치 공유함", + "sharedTheLocation": "{username}님이 위치를 공유함", "@sharedTheLocation": { "type": "text", "placeholders": { @@ -2111,11 +1576,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "그룹 설명 설정", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "맞춤 이모트 설정", "@setCustomEmotes": { "type": "text", @@ -2126,21 +1586,6 @@ "type": "text", "placeholders": {} }, - "setAProfilePicture": "프로필 사진 설정", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "세션이 확인됨", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "당신의 프라이버시에 대한 정보: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, "sentCallInformations": "{senderName} 이 통화 정보 보냄", "@sentCallInformations": { "type": "text", @@ -2148,7 +1593,7 @@ "senderName": {} } }, - "sentAVideo": "{username}이 영상 보냄", + "sentAVideo": "🎥 {username}님이 영상을 보냄", "@sentAVideo": { "type": "text", "placeholders": { @@ -2175,11 +1620,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "sentry.io로 버그 제보 허용", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendAudio": "오디오 보내기", "@sendAudio": { "type": "text", @@ -2199,68 +1639,28 @@ "type": "text", "placeholders": {} }, - "seenByUserAndUser": "{username}, {username2}가 읽음", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "seenByUser": "{username}이 읽음", + "seenByUser": "{username}님이 읽음", "@seenByUser": { "type": "text", "placeholders": { "username": {} } }, - "securityKeyLost": "보안 키를 잃어버렸나요?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "보안 키", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "security": "보안", "@security": { "type": "text", "placeholders": {} }, - "searchForAChat": "채팅 검색", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "search": "검색", "@search": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "파일 이 폴더에 저장", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "saveFile": "파일 저장", "@saveFile": { "type": "text", "placeholders": {} }, - "savedFileAs": "파일 {filename} 으로 저장함", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saturday": "토요일", - "@saturday": { - "type": "text", - "placeholders": {} - }, "roomVersion": "방 버전", "@roomVersion": { "type": "text", @@ -2271,16 +1671,6 @@ "type": "text", "placeholders": {} }, - "revokeAllPermissions": "모든 권한 취소", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "오래된 메시지 읽도록 요청", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, "requestPermission": "권한 요청", "@requestPermission": { "type": "text", @@ -2291,21 +1681,11 @@ "type": "text", "placeholders": {} }, - "publicSpace": "공개 스페이스", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "publicRooms": "공개 방", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicKey": "공개 키", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "privacy": "프라이버시", "@privacy": { "type": "text", @@ -2331,44 +1711,24 @@ "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "보안 키를 입력해주세요:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "키가 없음", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "keysCached": "키가 캐시됨", - "@keysCached": { - "type": "text", - "placeholders": {} - }, "joinRoom": "방 들어가기", "@joinRoom": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username}이 채팅에 참가함", + "joinedTheChat": "👋 {username}님이 채팅에 참가함", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "isTyping": "가 입력 중…", + "isTyping": "입력 중…", "@isTyping": { "type": "text", "placeholders": {} }, - "isDeviceKeyCorrect": "아래 기기 키가 맞습니까?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username}이 당신을 FluffyChat에 초대했습니다.\n1. FluffyChat 설치: https://fluffychat.im\n2. 가입하거나 로그인\n3. 초대 링크 열기: {link}", + "inviteText": "{username}님이 당신을 FluffyChat에 초대했습니다.\n1. FluffyChat 설치: https://fluffychat.im \n2. 가입하거나 로그인 \n3. 초대 링크 열기: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -2376,17 +1736,17 @@ "link": {} } }, - "inviteForMe": "나를 위해 초대", + "inviteForMe": "초대됨", "@inviteForMe": { "type": "text", "placeholders": {} }, - "invitedUsersOnly": "초대한 사용자만", + "invitedUsersOnly": "초대된 유저만", "@invitedUsersOnly": { "type": "text", "placeholders": {} }, - "invitedUser": "{username}이 {targetName}을 초대함", + "invitedUser": "📩 {username}님이 {targetName}님을 초대함", "@invitedUser": { "type": "text", "placeholders": { @@ -2399,7 +1759,7 @@ "type": "text", "placeholders": {} }, - "inviteContactToGroup": "연락처 {groupName} 에 초대", + "inviteContactToGroup": "연락처를 {groupName}에 초대", "@inviteContactToGroup": { "type": "text", "placeholders": { @@ -2426,38 +1786,28 @@ "type": "text", "placeholders": {} }, - "ignoreUsername": "유저 이름 무시", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "당신을 방해하는 사용자들을 무시할 수 있습니다. 당신의 개인 무시 리스트에 있는 사용자들에게서 메시지나 방 초대를 수신할 수 없습니다.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "sentASticker": "{username}이 스티커 보냄", + "sentASticker": "😊 {username}님이 스티커를 보냄", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username}이 사진 보냄", + "sentAPicture": "🖼️ {username}님이 사진을 보냄", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username}이 오디오 보냄", + "sentAnAudio": "🎤 {username}님이 오디오를 보냄", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAFile": "{username}이 파일 보냄", + "sentAFile": "📁 {username}님이 파일을 보냄", "@sentAFile": { "type": "text", "placeholders": { @@ -2494,12 +1844,7 @@ "type": "text", "placeholders": {} }, - "removeMessage": "메시지 지우기", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "채팅에서 밴 해제", + "unbanFromChat": "채팅에서 영구추방 해제됨", "@unbanFromChat": { "type": "text", "placeholders": {} @@ -2531,7 +1876,7 @@ "type": "text", "placeholders": {} }, - "rejectedTheInvitation": "{username}이 초대를 거절함", + "rejectedTheInvitation": "{username}님이 초대를 거절함", "@rejectedTheInvitation": { "type": "text", "placeholders": { @@ -2553,7 +1898,7 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username}이 이벤트를 지움", + "redactedAnEvent": "{username}님이 이벤트를 지움", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -2570,17 +1915,12 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "유저 이름을 골라주세요", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "kickFromChat": "채팅에서 추방", "@kickFromChat": { "type": "text", "placeholders": {} }, - "kickedAndBanned": "{username}이 {targetName}을 추방하고 밴함", + "kickedAndBanned": "🙅 {username}님이 {targetName}님을 추방하고 차단함", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -2588,7 +1928,7 @@ "targetName": {} } }, - "kicked": "{username}이 {targetName}을 추방함", + "kicked": "👞 {username}님이 {targetName}님을 추방함", "@kicked": { "type": "text", "placeholders": { @@ -2598,18 +1938,10 @@ }, "link": "링크", "@link": {}, - "yourUserId": "당신의 유저 ID:", - "@yourUserId": {}, "unverified": "확인되지 않음", "@unverified": {}, - "setupChatBackup": "채팅 백업 설정", - "@setupChatBackup": {}, "yourChatBackupHasBeenSetUp": "당신의 채팅 백업이 설정되었습니다.", "@yourChatBackupHasBeenSetUp": {}, - "iWroteDownTheKey": "키를 적었습니다", - "@iWroteDownTheKey": {}, - "setupChatBackupDescription": "당신의 메시지를 보호하기 위해서, 보안 키를 생성했습니다.\n비밀번호 관리자와 같이 안전한 곳에 저장해주세요.", - "@setupChatBackupDescription": {}, "time": "시간", "@time": {}, "messageType": "메시지 유형", @@ -2618,37 +1950,16 @@ "@openGallery": {}, "sender": "발신자", "@sender": {}, - "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "최소 {min}자를 선택하세요.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageInfo": "메시지 정보", "@messageInfo": {}, - "pleaseEnterValidEmail": "유효한 이메일 주소를 입력해주세요.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "비밀번호 다시 입력", "@repeatPassword": {}, - "loginWithOneClick": "클릭 한 번으로 로그인", - "@loginWithOneClick": {}, "start": "시작", "@start": {}, - "setupChatBackupNow": "당신의 채팅 백업을 지금 설정하세요", - "@setupChatBackupNow": {}, "removeFromSpace": "스페이스에서 삭제", "@removeFromSpace": {}, - "removeFromSpaceDescription": "이것은 현재 채팅을 현재 스페이스로부터 지웁니다. 여전히 '모든 채팅'에서 접근할 수 있습니다.", - "@removeFromSpaceDescription": {}, "addToSpaceDescription": "이 채팅을 추가할 스페이스를 선택하세요.", "@addToSpaceDescription": {}, - "pleaseEnterSecurityKeyDescription": "채팅 백업을 잠금 해제하려면, 이전 세션에서 생성된 보안 키를 입력해주세요. 보안 키는 비밀번호가 아닙니다.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "보안 키를 지금 저장", - "@saveTheSecurityKeyNow": {}, "commandHint_discardsession": "세션 삭제", "@commandHint_discardsession": { "type": "text", @@ -2664,7 +1975,7 @@ "type": "text", "description": "Usage hint for the command /clearcache" }, - "commandHint_create": "빈 그룹 채팅을 생성\t\n--no-encryption을 사용해 암호화를 비활성화", + "commandHint_create": "빈 그룹 채팅을 생성\n--no-encryption을 사용해 암호화를 비활성화", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" @@ -2674,14 +1985,8 @@ "type": "text", "placeholders": {} }, - "addToStory": "스토리에 추가", - "@addToStory": {}, "publish": "공개", "@publish": {}, - "yourStory": "내 스토리", - "@yourStory": {}, - "replyHasBeenSent": "답장을 보냈습니다", - "@replyHasBeenSent": {}, "videoWithSize": "영상 ({size})", "@videoWithSize": { "type": "text", @@ -2689,49 +1994,14 @@ "size": {} } }, - "storyFrom": "{date}의 스토리:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "스토리에서 사람들이 서로를 보고 연락할 수 있다는 점에 유의하십시오.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "무슨 일이 일어나고 있나요?", - "@whatIsGoingOn": {}, - "addDescription": "설명 추가", - "@addDescription": {}, - "whoCanSeeMyStories": "누가 내 스토리를 볼 수 있나요?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "스토리 구독 해제", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "이 유저는 스토리에 아무것도 올리지 않았습니다", - "@thisUserHasNotPostedAnythingYet": {}, - "bubbleSize": "버블 크기", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "dismiss": "닫기", "@dismiss": {}, - "matrixWidgets": "Matrix 위젯", - "@matrixWidgets": {}, - "integrationsNotImplemented": "아직 위젯과 통합을 편집하는 것은 가능하지 않습니다.", - "@integrationsNotImplemented": {}, - "editIntegrations": "위젯과 통합 편집", - "@editIntegrations": {}, "markAsRead": "읽음으로 표시하기", "@markAsRead": {}, - "reportUser": "사용자 신고", + "reportUser": "유저 신고", "@reportUser": {}, "openChat": "채팅 열기", "@openChat": {}, - "storyPrivacyWarning": "사람들이 서로를 보고 연락할 수 있다는 점에 유의해주세요. 스토리는 24시간 동안 보이지만 모든 기기와 서버에서 삭제된다는 보장은 없습니다.", - "@storyPrivacyWarning": {}, - "iUnderstand": "동의합니다", - "@iUnderstand": {}, "reactedWith": "{sender}가 {reaction}로 반응함", "@reactedWith": { "type": "text", @@ -2744,8 +2014,6 @@ "@confirmEventUnpin": {}, "pinMessage": "방에 고정", "@pinMessage": {}, - "pinnedEventsError": "고정된 메시지 불러오는 중 오류", - "@pinnedEventsError": {}, "emojis": "이모지", "@emojis": {}, "voiceCall": "음성 통화", @@ -2761,5 +2029,842 @@ "videoCallsBetaWarning": "영상 통화는 베타임을 확인해주세요. 의도한 대로 작동하지 않거나 모든 플랫폼에서 작동하지 않을 수 있습니다.", "@videoCallsBetaWarning": {}, "emailOrUsername": "이메일이나 유저 이름", - "@emailOrUsername": {} + "@emailOrUsername": {}, + "confirmMatrixId": "계정을 삭제하려면 Matrix ID를 입력해 주세요.", + "@confirmMatrixId": {}, + "commandHint_googly": "왕눈이 눈알 보내기", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} 님이 왕눈이 눈알을 보냈습니다", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_markasgroup": "그룹 채팅으로 만들기", + "@commandHint_markasgroup": {}, + "dehydrate": "세션을 내보내고 기기 초기화 하기", + "@dehydrate": {}, + "dehydrateWarning": "이 동작은 되돌릴 수 없습니다. 백업 파일을 꼭 안전하게 보관하세요.", + "@dehydrateWarning": {}, + "hugContent": "{senderName}님이 당신을 허그합니다", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "jumpToLastReadMessage": "마지막으로 읽은 메시지로 이동", + "@jumpToLastReadMessage": {}, + "allRooms": "모든 그룹 채팅", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "commandHint_cuddle": "미소 보내기", + "@commandHint_cuddle": {}, + "widgetVideo": "영상", + "@widgetVideo": {}, + "reportErrorDescription": "😭 이런. 무언가 잘못되었습니다. 원한다면, 개발자에게 버그를 신고할 수 있습니다.", + "@reportErrorDescription": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "indexedDbErrorLong": "메시지 저장은 기본적으로 사생활 보호 모드에서 사용할 수 없습니다.\n- about:config 로 이동\n- dom.indexedDB.privateBrowsing.enabled 를 true로 설정\n그렇지 않으면 FluffyChat을 실행할 수 없습니다.", + "@indexedDbErrorLong": {}, + "startFirstChat": "첫 번째 채팅을 시작하기", + "@startFirstChat": {}, + "callingAccount": "통화 계정", + "@callingAccount": {}, + "setColorTheme": "색상 테마 설정:", + "@setColorTheme": {}, + "nextAccount": "다음 계정", + "@nextAccount": {}, + "allSpaces": "모든 스페이스", + "@allSpaces": {}, + "supposedMxid": "{mxid} 이어야 함", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "user": "유저", + "@user": {}, + "youAcceptedTheInvitation": "👍 초대를 수락했습니다", + "@youAcceptedTheInvitation": {}, + "youInvitedBy": "📩 {user}님에 의해 초대되었습니다", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "banUserDescription": "유저는 채팅에서 영구 추방되며 추방 해제 전까지 채팅을 다시 입력할 수 없습니다.", + "@banUserDescription": {}, + "widgetEtherpad": "텍스트 메모", + "@widgetEtherpad": {}, + "removeDevicesDescription": "이 기기에서 로그아웃되며 더 이상 메시지를 받을 수 없습니다.", + "@removeDevicesDescription": {}, + "separateChatTypes": "다이렉트 채팅과 그룹 채팅 분리", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "tryAgain": "다시 시도하기", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 {user}님을 영구 추방했습니다", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "unbanUserDescription": "유저가 다시 채팅을 입력할 수 있습니다.", + "@unbanUserDescription": {}, + "youRejectedTheInvitation": "초대를 거부했습니다", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "마이크, 카메라 그리고 다름 FluffyChat 권한", + "@otherCallingPermissions": {}, + "messagesStyle": "메세지:", + "@messagesStyle": {}, + "widgetUrlError": "유효한 URL이 아닙니다.", + "@widgetUrlError": {}, + "newSpaceDescription": "스페이스를 사용하면 채팅을 통합하고 비공개 또는 공개 커뮤니티를 구축할 수 있습니다.", + "@newSpaceDescription": {}, + "chatDescription": "채팅 설명", + "@chatDescription": {}, + "callingAccountDetails": "FluffyChat이 android 전화앱을 사용 할 수 있도록 허가.", + "@callingAccountDetails": {}, + "enterSpace": "스페이스에 입장", + "@enterSpace": {}, + "encryptThisChat": "이 채팅을 암호화", + "@encryptThisChat": {}, + "previousAccount": "이전 계정", + "@previousAccount": {}, + "reopenChat": "채팅 다시 열기", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "당신의 복구키를 입력하세요:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "표시 이름을 입력하세요.", + "@widgetNameError": {}, + "addWidget": "위젯 추가", + "@addWidget": {}, + "countFiles": "{count}개의 파일", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noKeyForThisMessage": "이것은 이 메시지가 당신이 이 기기를 서명하기 전에 발송되었기 때문에 일어났을 수 있습니다.\n\n이것은 또한 발송자가 당신의 기기를 차단하였거나 혹은 인터넷 연결이 잘못되었을 수 있습니다.\n\n다른 세션에서 이 메시지를 읽을 수 있나요? 그렇다면 그 메시지를 옮길 수 있습니다! 설정 > 기기로 가서 기기를 서로 증명하세요. 다음번에 방을 열었을 때 두 세션이 모두 작동중이라면, 키가 자동으로 옮겨질것입니다.\n\n로그아웃하거나 기기를 바꿀 때 키를 잃고싶지 않으신가요? 설정에서 채팅 백업을 사용중인지 확인하세요.", + "@noKeyForThisMessage": {}, + "hydrateTor": "TOR 사용자: 내보낸 세션 불러오기", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "푸시 알림 사용 불가", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Apple KeyChain에 저장하기", + "@storeInAppleKeyChain": {}, + "hydrate": "백업 파일로부터 가져오기", + "@hydrate": {}, + "invalidServerName": "잘못된 서버 이름", + "@invalidServerName": {}, + "chatPermissions": "채팅 권한", + "@chatPermissions": {}, + "storeInAndroidKeystore": "Android KeyStore에 저장하기", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "비밀번호로 로그인", + "@signInWithPassword": {}, + "makeAdminDescription": "유저를 한 번 관리자로 만들면, 당신과 같은 권한을 가지기때문에 권한 회수가 불가능합니다.", + "@makeAdminDescription": {}, + "saveKeyManuallyDescription": "공유나 클립보드를 이용해 수동으로 키를 저장합니다.", + "@saveKeyManuallyDescription": {}, + "whyIsThisMessageEncrypted": "왜 이 메시지를 읽을 수 없나요?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "채팅 설명 설정", + "@setChatDescription": {}, + "importFromZipFile": ".zip 파일에서 불러오기", + "@importFromZipFile": {}, + "noOtherDevicesFound": "다른 기기 발견되지 않음", + "@noOtherDevicesFound": {}, + "redactedBy": "{username}님이 삭제함", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "signInWith": "{provider}로 로그인", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "fileIsTooBigForServer": "전송에 실패했습니다. 서버는 {max}치가 넘는 파일을 지원하지 않습니다.", + "@fileIsTooBigForServer": {}, + "callingPermissions": "통화 권한", + "@callingPermissions": {}, + "readUpToHere": "여기까지 읽음", + "@readUpToHere": {}, + "unlockOldMessages": "오래된 메시지 잠금 해제하기", + "@unlockOldMessages": {}, + "numChats": "{number}개의 채팅", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "optionalRedactReason": "(선택) 이 메시지를 편집하는 이유...", + "@optionalRedactReason": {}, + "archiveRoomDescription": "채팅이 보관함으로 이동합니다. 다른 유저들은 당신이 떠난다는것을 볼 수 있습니다.", + "@archiveRoomDescription": {}, + "exportEmotePack": ".zip 파일로 이모트 내보내기", + "@exportEmotePack": {}, + "switchToAccount": "계정 {number}로 전환", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "pleaseEnterRecoveryKeyDescription": "오래된 메시지를 잠금 해제하려면, 이전 세션에서 생성된 복호화 키를 입력하세요. 복호화 키는 비밀번호가 아닙니다.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "{contact} 를 \"{groupName}\"에 초대할까요?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "{username}님이 삭제함. 사유: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}님에 대한 초대를 철회함", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "appearOnTopDetails": "앱이 상단에 표시되도록 허용 (이미 FluffyChat을 통화 계정으로 설정한 경우에는 필요하지 않음)", + "@appearOnTopDetails": {}, + "enterRoom": "방에 입장", + "@enterRoom": {}, + "youInvitedUser": "📩 {user}님을 초대했습니다", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "fileHasBeenSavedAt": "{path}에 파일 저장됨", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "redactMessageDescription": "메시지는 이 대화의 모든 참여자에게 삭제될 것 입니다. 되돌릴 수 없습니다.", + "@redactMessageDescription": {}, + "recoveryKey": "복구키", + "@recoveryKey": {}, + "invalidInput": "잘못된 입력!", + "@invalidInput": {}, + "dehydrateTorLong": "TOR 사용자들은 창을 닫기 전에 세션을 내보내는것이 권장됩니다.", + "@dehydrateTorLong": {}, + "doNotShowAgain": "다시 보지 않기", + "@doNotShowAgain": {}, + "report": "신고", + "@report": {}, + "hideUnimportantStateEvents": "중요하지 않은 상태 이벤트 숨기기", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "화면 공유", + "@screenSharingTitle": {}, + "widgetCustom": "사용자 정의", + "@widgetCustom": {}, + "youBannedUser": "{user}님을 영구 추방함", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "addChatDescription": "채팅 설명 추가하기...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user}님이 참가를 요청했습니다", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "openLinkInBrowser": "브라우저에서 링크 열기", + "@openLinkInBrowser": {}, + "disableEncryptionWarning": "보안상의 이유로 암호화가 활성화된 채팅에서 암호화를 비활성화 할 수 없습니다.", + "@disableEncryptionWarning": {}, + "directChat": "다이렉트 채팅", + "@directChat": {}, + "wrongPinEntered": "잘못된 pin입니다! {seconds}초 후에 다시 시도하세요...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "입력 알림 보내기", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 그룹 채팅에 초대", + "@inviteGroupChat": {}, + "appearOnTop": "상단에 표시", + "@appearOnTop": {}, + "invitePrivateChat": "📨 비공개 채팅에 초대", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "이 알림은 백그라운드 서비스가 실행중일때 표시됩니다.", + "@foregroundServiceRunning": {}, + "importEmojis": "이모지 불러오기", + "@importEmojis": {}, + "wasDirectChatDisplayName": "빈 채팅 (전 {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "채팅 설명이 아직 추가되지 않음.", + "@noChatDescriptionYet": {}, + "learnMore": "더 알아보기", + "@learnMore": {}, + "notAnImage": "이미지 파일이 아닙니다.", + "@notAnImage": {}, + "users": "유저", + "@users": {}, + "chatDescriptionHasBeenChanged": "채팅 설명 변경됨", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "새 그룹 채팅", + "@newGroup": {}, + "dehydrateTor": "TOR 사용자: 세션 내보내기", + "@dehydrateTor": {}, + "roomUpgradeDescription": "채팅이 새로운 방 버전으로 다시 생성됩니다. 모든 참가자는 새로운 채팅으로 전환해야합니다. https://spec.matrix.org/latest/rooms/ 에서 방 버전에 대해 자세히 알아볼 수 있습니다.", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "0보다 큰 숫자를 입력하세요", + "@pleaseEnterANumber": {}, + "youKicked": "👞 {user}님을 추방했습니다", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "profileNotFound": "유저를 서버에서 찾을 수 있습니다. 연결 문제가 있거나 유저가 존재하지 않을 수 있습니다.", + "@profileNotFound": {}, + "jump": "점프", + "@jump": {}, + "sorryThatsNotPossible": "죄송합니다...그것은 불가능합니다", + "@sorryThatsNotPossible": {}, + "shareInviteLink": "초대 링크 공유", + "@shareInviteLink": {}, + "commandHint_markasdm": "Matrix ID를 위한 다이렉트 메시지 방으로 표시", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "복구키를 분실하셨나요?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} 님이 당신에게 미소짓습니다", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "deviceKeys": "기기 키:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "최근 사용한 이모트가 여기 나타납니다...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "테마 설정:", + "@setTheme": {}, + "youJoinedTheChat": "채팅에 참여했습니다", + "@youJoinedTheChat": {}, + "widgetName": "이름", + "@widgetName": {}, + "errorAddingWidget": "위젯 추가중 오류 발생.", + "@errorAddingWidget": {}, + "commandHint_hug": "허그 보내기", + "@commandHint_hug": {}, + "replace": "대체", + "@replace": {}, + "youUnbannedUser": "{user}님의 영구 추방을 해제했습니다", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "newSpace": "새 스페이스", + "@newSpace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "나중에 다시 시도하거나 다른 서버를 선택하십시오.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "새 그룹 채팅", + "@createGroup": {}, + "hydrateTorLong": "지난 TOR 이용에서 세션을 내보내셨나요? 빠르게 불러오고 채팅을 계속하세요.", + "@hydrateTorLong": {}, + "custom": "커스텀", + "@custom": {}, + "noBackupWarning": "경고! 채팅 백업을 켜지 않을경우, 당신은 암호화된 메시지에대한 접근권한을 잃을것입니다. 로그아웃 하기 전에 채팅을 백업하는것이 강력히 권장됩니다.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "이 기기의 보안 스토리지에 복구키를 저장합니다.", + "@storeInSecureStorageDescription": {}, + "kickUserDescription": "유저는 채팅에서 추방되지만 영구 추방되지 않습니다. 공개 채팅의 경우, 언제든 유저가 다시 들어올 수 있습니다.", + "@kickUserDescription": {}, + "importNow": "지금 불러오기", + "@importNow": {}, + "invite": "초대", + "@invite": {}, + "indexedDbErrorTitle": "사생활 보호 모드의 문제", + "@indexedDbErrorTitle": {}, + "storeSecurlyOnThisDevice": "이 기기에 안전하게 저장", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "FluffyChat에 당신의 화면을 공유하는중", + "@screenSharingDetail": {}, + "blockUsername": "유저 이름 무시", + "@blockUsername": {}, + "block": "차단", + "@block": {}, + "blockedUsers": "차단된 유저", + "@blockedUsers": {}, + "groupName": "그룹 채팅 이름", + "@groupName": {}, + "commandHint_sendraw": "raw json 전송", + "@commandHint_sendraw": {}, + "pleaseChooseAStrongPassword": "강력한 비밀번호를 사용하세요", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "채팅 또는 하위 스페이스 추가", + "@addChatOrSubSpace": {}, + "subspace": "하위 스페이스", + "@subspace": {}, + "youInvitedToBy": "📩 링크를 통해 초대되셨습니다:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "databaseMigrationBody": "잠시만 기다리세요. 시간이 걸릴 수 있습니다.", + "@databaseMigrationBody": {}, + "select": "선택", + "@select": {}, + "joinSpace": "스페이스 가입", + "@joinSpace": {}, + "decline": "거절", + "@decline": {}, + "formattedMessagesDescription": "마크다운을 이용한 볼드등의 서식이 있는 메시지를 봅니다.", + "@formattedMessagesDescription": {}, + "completedKeyVerification": "{sender}가 키 검증을 완료함", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender}가 키 검증을 취소함", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "createGroupAndInviteUsers": "그룹 채팅을 생성하고 유저를 초대", + "@createGroupAndInviteUsers": {}, + "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "비밀번호가 틀립니다", + "@passwordIsWrong": {}, + "publicLink": "공개 링크", + "@publicLink": {}, + "thisDevice": "이 기기:", + "@thisDevice": {}, + "sendReadReceipts": "읽음 확인 보내기", + "@sendReadReceipts": {}, + "sendReadReceiptsDescription": "채팅의 다른 참가자들이 당신이 메시지를 읽었는지 볼 수 있습니다.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUser": "🔐 다른 유저 확인", + "@verifyOtherUser": {}, + "hidePresences": "상태 목록을 숨길까요?", + "@hidePresences": {}, + "searchChatsRooms": "#chats, @users 검색...", + "@searchChatsRooms": {}, + "groupCanBeFoundViaSearch": "검색으로 그룹 채팅을 찾을 수 있음", + "@groupCanBeFoundViaSearch": {}, + "restoreSessionBody": "앱이 백업에서 세션을 복원하려 시도중입니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "acceptedKeyVerification": "{sender}가 키 검증을 수락함", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presencesToggle": "다른 유저의 상태 메시지 표시", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "wrongRecoveryKey": "죄송합니다... 올바른 복구키가 아닌것 같습니다.", + "@wrongRecoveryKey": {}, + "newPassword": "새 비밀번호", + "@newPassword": {}, + "searchForUsers": "@users 검색...", + "@searchForUsers": {}, + "leaveEmptyToClearStatus": "비워서 상태를 지우세요.", + "@leaveEmptyToClearStatus": {}, + "commandHint_ignore": "주어진 matrix ID를 무시", + "@commandHint_ignore": {}, + "commandHint_unignore": "주어진 matrix ID 무시 해제", + "@commandHint_unignore": {}, + "blockListDescription": "당신은 당신을 방해하는 유저들을 차단할 수 있습니다. 당신은 당신의 개인 차단 목록에 있는 어떠한 유저의 메시지와 방 초대도 받지 않을것 입니다.", + "@blockListDescription": {}, + "presenceStyle": "상태:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "sessionLostBody": "세션을 잃었습니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "yourGlobalUserIdIs": "글로벌 유저 ID: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "안타깝게도 \"{query}\"로 유저를 찾을 수 없습니다. 오타가 없는지 확인하십시오.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "nothingFound": "아무것도 찾지 못했습니다...", + "@nothingFound": {}, + "startConversation": "대화 시작", + "@startConversation": {}, + "databaseMigrationTitle": "데이터베이스가 최적화됨", + "@databaseMigrationTitle": {}, + "pleaseEnterYourCurrentPassword": "현재 비밀번호 입력", + "@pleaseEnterYourCurrentPassword": {}, + "publicSpaces": "공개 스페이스들", + "@publicSpaces": {}, + "initAppError": "앱 초기화중 오류 발생", + "@initAppError": {}, + "databaseBuildErrorBody": "SQlite 데이터베이스를 구축할 수 없습니다. 현재 레거시 데이터베이스 사용을 시도중입니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendTypingNotificationsDescription": "채팅의 다른 참가자들이 당신이 새 메시지를 입력중인것을 볼 수 있습니다.", + "@sendTypingNotificationsDescription": {}, + "formattedMessages": "형식이 지정된 메시지", + "@formattedMessages": {}, + "forwardMessageTo": "{roomName}에 메시지를 전달할까요?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "verifyOtherDevice": "🔐 다른 기기를 확인", + "@verifyOtherDevice": {}, + "verifyOtherUserDescription": "다른 유저를 확인하면, 당신은 당신이 누구에게 말하고있는지 알 수 있습니다. 💪\n\n확인을 시작할 때, 다른 유저는 앱에서 팝업을 볼 수 있습니다. 당신은 그런 다음 서로 비교해야 이모지 또는 숫자의 목록을 볼 수 있습니다.\n\n이 작업을 수행하는 가장 좋은 방법은 직접 만나거나 영상통화를 하는것입니다. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "다른 장치를 확인하면, 장치와 키를 교환하고, 전반적인 보안을 증가시킵니다. 💪 확인을 시작하면 팝업은 두 장치에 나타납니다. 그런 다음 서로 비교해야 이모지 또는 숫자의 목록를 볼 수 있습니다. 확인을 시작하기 전에 모든 장치를 준비하세요. 🤳", + "@verifyOtherDeviceDescription": {}, + "isReadyForKeyVerification": "{sender}가 키 검증 준비를 완료함", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender}가 키 검증을 요청함", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender}가 키 검증을 시작함", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "투명", + "@transparent": {}, + "incomingMessages": "메시지 수신함", + "@incomingMessages": {}, + "stickers": "스티커", + "@stickers": {}, + "discover": "탐색", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread}개의 읽지 않은 채팅", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "appLockDescription": "앱을 사용하지 않을 때 pin으로 잠금", + "@appLockDescription": {}, + "calls": "전화", + "@calls": {}, + "globalChatId": "글로벌 채팅 ID", + "@globalChatId": {}, + "customEmojisAndStickers": "커스텀 이모지와 스티커", + "@customEmojisAndStickers": {}, + "accessAndVisibilityDescription": "채팅에 참여 할 수 있는 사람과 채팅을 볼 수 있는 범위", + "@accessAndVisibilityDescription": {}, + "accessAndVisibility": "채팅 가입과 대화 기록", + "@accessAndVisibility": {}, + "customEmojisAndStickersBody": "모든 채팅에서 사용할 수있는 커스텀 이모지와 스티커를 추가하거나 공유합니다.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "삭제된 메시지 숨기기", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "누군가가 메시지를 삭제하면 메시지를 더 이상 볼 수 없습니다.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "잘못되거나 알 수 없는 메시지 형식 숨김", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "개요", + "@overview": {}, + "notifyMeFor": "나에게 알림", + "@notifyMeFor": {}, + "passwordRecoverySettings": "비밀번호 복구 설정", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChats": "공개 채팅에서의 참가자 변화 숨김", + "@hideMemberChangesInPublicChats": {}, + "userWouldLikeToChangeTheChat": "{user}님이 참가를 희망합니다.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "공개 링크가 아직 생성되지 않았음", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "참가 요청", + "@knock": {}, + "usersMustKnock": "유저들이 참가를 허가받아야함", + "@usersMustKnock": {}, + "knocking": "참가 요청중", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "채팅은 {server} 에서 검색하여 찾을 수 있습니다.", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "noOneCanJoin": "아무도 들어올 수 없음", + "@noOneCanJoin": {}, + "thereAreCountUsersBlocked": "{count}명의 차단된 유저가 있습니다.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "minimumPowerLevel": "{level}은 최소 권한 레벨입니다.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "noDatabaseEncryption": "데이터베이스 암호화는 이 플랫폼에서 지원되지 않음", + "@noDatabaseEncryption": {}, + "publicChatAddresses": "공개 채팅 주소", + "@publicChatAddresses": {}, + "userRole": "유저 역할", + "@userRole": {}, + "createNewAddress": "새 주소 만들기", + "@createNewAddress": {}, + "hideMemberChangesInPublicChatsBody": "공개채팅에 누군가가 가입하거나 떠날때 타임라인에 표시하지 않습니다.", + "@hideMemberChangesInPublicChatsBody": {}, + "searchMore": "더 검색...", + "@searchMore": {}, + "files": "파일", + "@files": {}, + "searchIn": "{chat}에서 검색...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "gallery": "갤러리", + "@gallery": {}, + "restricted": "스페이스 멤버로 제한", + "@restricted": {}, + "knockRestricted": "스페이스 멤버만 참가 요청 가능", + "@knockRestricted": {}, + "swipeRightToLeftToReply": "오른쪽에서 왼쪽으로 스와이프해서 답장", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "아니요", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "unread": "읽지 않은", + "@unread": {}, + "space": "스페이스", + "@space": {}, + "spaces": "스페이스", + "@spaces": {}, + "goToSpace": "스페이스로: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "읽지 않음으로 표시", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} 채팅과 {participants} 참여자", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "joinedChats": "참여한 채팅", + "@joinedChats": {}, + "noMoreChatsFound": "채팅을 찾을 수 없습니다...", + "@noMoreChatsFound": {}, + "moderatorLevel": "{level} - 관리자", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - 운영자", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "invitedBy": "📩 {user}님이 나를 초대함", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "userLevel": "{level} - 유저", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "noChatsFoundHere": "대화가 발견되지 않았습니다. 아래 버튼을 사용하여 새 대화를 시작해 보세요. ⤵️", + "@noChatsFoundHere": {}, + "changeTheVisibilityOfChatHistory": "대화 기록 표시 여부 바꾸기", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "메인 공개 대화 주소 변경", + "@changeTheCanonicalRoomAlias": {}, + "sendCanceled": "전송 최소됨", + "@sendCanceled": {}, + "homeserverDescription": "모든 데이터는 이메일 제공자와 마찬가지로 Homeserver(이) 에 저장됩니다. 모든 사람과 여전히 소통할 수 있는 동안 사용하고 싶은 Homeserver(이) 를 선택할 수 있습니다. https://matrix.org에서 자세히 알아보세요.", + "@homeserverDescription": {}, + "sendingAttachmentCountOfCount": "{index} ({length}) 전송 중...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "서버 한도에 도달했습니다! {seconds}초 기다리는 중...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "noContactInformationProvided": "서버가 유효한 연락처 정보를 제공하지 않습니다", + "@noContactInformationProvided": {}, + "welcomeText": "안녕하세요 👋 제 이름은 FluffyChat이에요. 당신은 Htpps://matrix.org에 호환되는 어떤 Homeserver에도 가입할 수 있어요. 그리고 아무나 대화하세요! 저는 큰 대화 네트워크랍니다! 😄", + "@welcomeText": {}, + "changeGeneralChatSettings": "일반 대화 설정 번경하기", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "다른 사용자를 이 대화에 초대하기", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "대화 권한 변경하기", + "@changeTheChatPermissions": {}, + "calculatingFileSize": "파일 크기 계산 중...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "첨부된 파일 전송 준비 중...", + "@prepareSendingAttachment": {}, + "oneOfYourDevicesIsNotVerified": "당신의 기기 중 하나가 인증되지 않았습니다", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "참고: 모든 기기를 대화 백업에 연결하면 자동으로 인증됩니다.", + "@noticeChatBackupDeviceVerification": {}, + "opacity": "불투명:", + "@opacity": {}, + "setWallpaper": "배경화면 정하기", + "@setWallpaper": {}, + "manageAccount": "계정 관리하기", + "@manageAccount": {}, + "aboutHomeserver": "{homeserver}의 대해서", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "contactServerAdmin": "서버 관리자 연락하기", + "@contactServerAdmin": {}, + "contactServerSecurity": "서버 보안관 연락하기", + "@contactServerSecurity": {}, + "supportPage": "페이지 돕기", + "@supportPage": {}, + "name": "이름", + "@name": {}, + "serverInformation": "서버 정보:", + "@serverInformation": {}, + "version": "버전", + "@version": {}, + "website": "웹사이트", + "@website": {}, + "changeTheDescriptionOfTheGroup": "대화의 설명 바꾸기", + "@changeTheDescriptionOfTheGroup": {}, + "sendRoomNotifications": "@room 알림 보내기", + "@sendRoomNotifications": {}, + "chatPermissionsDescription": "이 대화에서 특정 작업에 필요한 파워 레벨을 정의합니다. 파워 레벨 0, 50, 100은 일반적으로 사용자, 관리자, 관리자를 나타내지만, 모든 등급이 가능합니다.", + "@chatPermissionsDescription": {}, + "loginWithMatrixId": "Matrix-ID로 로그인", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Homeserver 찾아보기", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Homeserver(이) 가 무엇인가요?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "호환되는 Homeserver(이) 가 아닌 것 같습니다. URL이 올바르게 입력됐나요?", + "@doesNotSeemToBeAValidHomeserver": {}, + "continueText": "계속하기", + "@continueText": {}, + "updateInstalled": "🎉 새 {version} 가 설치되었습니다!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "변경 기록", + "@changelog": {}, + "sendingAttachment": "첨부된 파일 전송 중...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "영상 썸네일 만드는 중...", + "@generatingVideoThumbnail": {}, + "compressVideo": "영상 압축 중...", + "@compressVideo": {}, + "blur": "블러:", + "@blur": {} } diff --git a/assets/l10n/intl_lt.arb b/assets/l10n/intl_lt.arb index 683b95c2e7..0a45a29e28 100644 --- a/assets/l10n/intl_lt.arb +++ b/assets/l10n/intl_lt.arb @@ -14,13 +14,6 @@ "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Pakeitimai išsaugoti", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Tavo vartotojo ID:", - "@yourUserId": {}, "edit": "Redaguoti", "@edit": { "type": "text", @@ -31,21 +24,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Failo dydis", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "friends": "Draugai", - "@friends": { - "type": "text", - "placeholders": {} - }, - "friday": "Penktadienis", - "@friday": { - "type": "text", - "placeholders": {} - }, "about": "Apie", "@about": { "type": "text", @@ -61,17 +39,12 @@ "type": "text", "placeholders": {} }, - "donate": "Paaukoti", - "@donate": { - "type": "text", - "placeholders": {} - }, "fileName": "Failo vardas", "@fileName": { "type": "text", "placeholders": {} }, - "changePassword": "Pasikeisti slaptažodį", + "changePassword": "Keisti slaptažodį", "@changePassword": { "type": "text", "placeholders": {} @@ -86,42 +59,12 @@ "type": "text", "placeholders": {} }, - "audioPlayerPlay": "Groti", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "monday": "Pirmadienis", - "@monday": { - "type": "text", - "placeholders": {} - }, "skip": "Praleisti", "@skip": { "type": "text", "placeholders": {} }, - "sunday": "Sekmadienis", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Antradienis", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Pridėti naują draugą", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Pauzė", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "share": "Dalintis", + "share": "Bendrinti", "@share": { "type": "text", "placeholders": {} @@ -138,11 +81,6 @@ "type": "text", "placeholders": {} }, - "thursday": "Ketvirtadienis", - "@thursday": { - "type": "text", - "placeholders": {} - }, "sender": "Siuntėjas", "@sender": {}, "yes": "Taip", @@ -150,7 +88,7 @@ "type": "text", "placeholders": {} }, - "you": "Tu", + "you": "Jūs", "@you": { "type": "text", "placeholders": {} @@ -172,7 +110,7 @@ "type": "text", "placeholders": {} }, - "addAccount": "pridėti vartotoją", + "addAccount": "Pridėti paskyrą", "@addAccount": {}, "or": "Arba", "@or": { @@ -209,31 +147,21 @@ "type": "text", "placeholders": {} }, - "blocked": "Blokuotas", + "blocked": "Užblokuotas", "@blocked": { "type": "text", "placeholders": {} }, - "chooseAStrongPassword": "Pasirink saugų slaptažodį", + "chooseAStrongPassword": "Pasirinkite saugų slaptažodį", "@chooseAStrongPassword": { "type": "text", "placeholders": {} }, - "createNewGroup": "Sukurti naują grupę", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "deleteMessage": "Ištrinti žinutę", "@deleteMessage": { "type": "text", "placeholders": {} }, - "deny": "Atmesti", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Įrenginys", "@device": { "type": "text", @@ -266,11 +194,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Prisijungimas nepavyko", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Išvalyti archyvą", "@clearArchive": {}, "create": "Sukurti", @@ -278,11 +201,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Sukurti vartotoją dabar", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "connect": "Prisijungti", "@connect": { "type": "text", @@ -293,11 +211,6 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Žinutė bus pašalinta visiem dalyviams", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderatorius", "@moderator": { "type": "text", @@ -313,12 +226,6 @@ "type": "text", "placeholders": {} }, - "shareYourInviteLink": "Pasidalinkite pakvietimo nuoroda", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Rankiniu būdu įveskite pakvietimo nuorodą", - "@typeInInviteLinkManually": {}, - "createNewChatExplaination": "Nuskanuokite QR kodą arba pasdalinkite pakvietimo nuoroda.", - "@createNewChatExplaination": {}, "none": "Nė vienas", "@none": { "type": "text", @@ -329,12 +236,7 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Nerasta viešų kambarių", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nerasta kambarių", + "noRoomsFound": "Nerasta kambarių…", "@noRoomsFound": { "type": "text", "placeholders": {} @@ -369,12 +271,12 @@ "type": "text", "placeholders": {} }, - "oopsPushError": "Oi, deja nustatant tiesioginius pranešimus įvyko klaida", + "oopsPushError": "Oi! Deja, nustatant tiesioginius pranešimus įvyko klaida.", "@oopsPushError": { "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "Oi, kažkas negerai…", + "oopsSomethingWentWrong": "Oi, kažkas nutiko ne taip…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -391,11 +293,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Dalyvaujančio vartotojo įrenginiai", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "Slapta frazė arba atkūrimo raktas", "@passphraseOrKey": { "type": "text", @@ -406,7 +303,7 @@ "type": "text", "placeholders": {} }, - "passwordRecovery": "Slaptažodžio atstatymas", + "passwordRecovery": "Slaptažodžio atkūrimas", "@passwordRecovery": { "type": "text", "placeholders": {} @@ -426,42 +323,27 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAPasscode": "Pasirinkite slaptą frazę", + "pleaseChooseAPasscode": "Pasirinkite slaptą kodą", "@pleaseChooseAPasscode": { "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Pasirinkite vartotojo vardą", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Paspauskite nuorodą e-pašte ir tęskite toliau.", + "pleaseClickOnLink": "Paspauskite nuorodą el. pašte ir tęskite toliau.", "@pleaseClickOnLink": { "type": "text", "placeholders": {} }, - "pleaseEnter4Digits": "Įveskite 4 simbolius arba palikite tuščia, kad išjungtumėte programėlės užraktą", + "pleaseEnter4Digits": "Įveskite 4 skaitmenis arba palikite tuščią, jei norite išjungti programėlės užraktą.", "@pleaseEnter4Digits": { "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Įveskite Matrrix ID", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Įveskite savo apsaugos raktą", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPin": "Įveskite savo PIN kodą", "@pleaseEnterYourPin": { "type": "text", "placeholders": {} }, - "pleaseFollowInstructionsOnWeb": "Sekite instrukcijas naršyklėje ir spauskite Sekantis", + "pleaseFollowInstructionsOnWeb": "Vadovaukitės svetainėje pateiktais nurodymais ir bakstelėkite Toliau.", "@pleaseFollowInstructionsOnWeb": { "type": "text", "placeholders": {} @@ -471,16 +353,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Viešos grupės", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Viešas raktas", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Vieši kambariai", "@publicRooms": { "type": "text", @@ -496,7 +368,7 @@ "type": "text", "placeholders": {} }, - "redactMessage": "Redaguoti žinutę", + "redactMessage": "Pašalinti žinutę", "@redactMessage": { "type": "text", "placeholders": {} @@ -531,11 +403,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Pašalinti žinutę", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Pašalinti savo avatarą", "@removeYourAvatar": { "type": "text", @@ -551,16 +418,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Prašyti skaityti senesnes žinutes", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Atšaukti visus leidimus", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Kambarys buvo atnaujintas", "@roomHasBeenUpgraded": { "type": "text", @@ -571,52 +428,23 @@ "type": "text", "placeholders": {} }, - "saturday": "Šeštdienis", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Išsaugokite failą į šitą aplanką", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Ieškoti", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Ieškoti pokalbių", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "accept": "Sutinku", "@accept": { "type": "text", "placeholders": {} }, - "passwordsDoNotMatch": "Slaptažodžiai nesutampa!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Prašome įrašyti galiojantį e-paštą.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Pakartrokite slaptažodį", + "repeatPassword": "Pakartokite slaptažodį", "@repeatPassword": {}, - "accountInformation": "Paskyros informacija", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Pridėkite e-paštą", + "addEmail": "Pridėti el. paštą", "@addEmail": { "type": "text", "placeholders": {} }, - "addGroupDescription": "Pridėkite grupės aprašymą", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Administratorius", "@admin": { "type": "text", @@ -632,57 +460,37 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Ar jau turite vartotojo paskyrą?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "anyoneCanJoin": "Bet kas gali prisijungti", "@anyoneCanJoin": { "type": "text", "placeholders": {} }, - "areYouSure": "Ar esate tikras?", + "areYouSure": "Ar esate tikri?", "@areYouSure": { "type": "text", "placeholders": {} }, - "areYouSureYouWantToLogout": "Ar esate tikras kad norite išsiregistruoti?", + "areYouSureYouWantToLogout": "Ar tikrai norite atsijungti?", "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "changelog": "Pakeitimų žurnalas", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Pakeisti namų serverį", "@changeTheHomeserver": { "type": "text", "placeholders": {} }, - "changeTheme": "Pakeisti savo stilių", + "changeTheme": "Keisti savo stilių", "@changeTheme": { "type": "text", "placeholders": {} }, - "changeTheNameOfTheGroup": "Pakeisti grupės vardą", + "changeTheNameOfTheGroup": "Keisti grupės pavadinimą", "@changeTheNameOfTheGroup": { "type": "text", "placeholders": {} }, - "changeTheServer": "Pakeisti serverį", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Pakeisti ekrano užsklandą", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Pakeisti savo avatarą", + "changeYourAvatar": "Keisti savo avatarą", "@changeYourAvatar": { "type": "text", "placeholders": {} @@ -702,7 +510,7 @@ "type": "text", "placeholders": {} }, - "commandHint_ban": "Užblokuoti vartotoją šitame kambatyje", + "commandHint_ban": "Užblokuoti vartotoją šiame kambaryje", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -717,7 +525,7 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_html": "Siųsti tekstą HTML formtu", + "commandHint_html": "Siųsti tekstą HTML formatu", "@commandHint_html": { "type": "text", "description": "Usage hint for the command /html" @@ -737,7 +545,7 @@ "type": "text", "description": "Usage hint for the command /kick" }, - "commandHint_myroomnick": "Nustatykite savo vardą šitam kambariui", + "commandHint_myroomnick": "Nustatyti savo rodomą vardą šiame kambaryje", "@commandHint_myroomnick": { "type": "text", "description": "Usage hint for the command /myroomnick" @@ -752,7 +560,7 @@ "type": "text", "description": "Usage hint for the command /send" }, - "commandHint_unban": "Atblokuoti vartotoją iš šito kambario", + "commandHint_unban": "Atblokuoti vartotoją šiame kambaryje", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" @@ -761,16 +569,11 @@ "@commandInvalid": { "type": "text" }, - "configureChat": "Nustatyti pokalbį", + "configureChat": "Konfigūruoti pokalbį", "@configureChat": { "type": "text", "placeholders": {} }, - "contentViewer": "Turinio peržiūra", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Nukopijuota į iškarpinę", "@copiedToClipboard": { "type": "text", @@ -786,16 +589,6 @@ "type": "text", "placeholders": {} }, - "couldNotSetAvatar": "Nepavyko nustatyti avataro", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nepavyko nustatti vardo", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Šiuo metu aktyvus", "@currentlyActive": { "type": "text", @@ -806,7 +599,7 @@ "type": "text", "placeholders": {} }, - "delete": "Panaikinti", + "delete": "Ištrinti", "@delete": { "type": "text", "placeholders": {} @@ -816,11 +609,6 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Šifravimas saugus kai visi įrenginiai buvo patikrinti.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Tiesioginiai pokalbiai", "@directChats": { "type": "text", @@ -831,36 +619,16 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Šifravimo algoritmas", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Šifravimas aktyvuotas", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "End-to-end šifravimo nustatymai", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Įveskite grupės vardą", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Įveskite e-paštą", + "enterAnEmailAddress": "Įveskite el. pašto adresą", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Įveskite vartotojo vardą", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "extremeOffensive": "Itin įžeidžiantis", "@extremeOffensive": { "type": "text", @@ -891,16 +659,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Grupės aprašymas", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Grupės aprašymas pakeistas", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Grupė yra vieša", "@groupIsPublic": { "type": "text", @@ -926,7 +684,7 @@ "type": "text", "placeholders": {} }, - "hideRedactedEvents": "Slėpti redaguotus įvykius", + "hideRedactedEvents": "Slėpti pašalintus įvykius", "@hideRedactedEvents": { "type": "text", "placeholders": {} @@ -956,24 +714,7 @@ "type": "text", "placeholders": {} }, - "loginWithOneClick": "Prisijungti vienu paspaudimu", - "@loginWithOneClick": {}, - "makeAModerator": "Padaryti moderatoriumi", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Padaryti admin'u", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Įsitikinkite, kad indentifikatorius galiojantis", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Nario pasikeitimai", + "memberChanges": "Narių pokyčiai", "@memberChanges": { "type": "text", "placeholders": {} @@ -998,50 +739,28 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Redaguoti pokalbio leidimus", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "login": "Prisijungti", "@login": { "type": "text", "placeholders": {} }, - "authentication": "Autentifikavimas", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avataras pakeistas", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "sendOnEnter": "Išsiųsti paspaudus Enter", "@sendOnEnter": {}, - "banFromChat": "Uždrausti pokalbyje", + "banFromChat": "Užblokuoti iš pokalbio", "@banFromChat": { "type": "text", "placeholders": {} }, - "banned": "Uždraustas", + "banned": "Užblokuotas", "@banned": { "type": "text", "placeholders": {} }, - "cachedKeys": "Raktai pakeisti", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "changeDeviceName": "Pakeisti įrenginio vardą", "@changeDeviceName": { "type": "text", "placeholders": {} }, - "setupChatBackup": "Nustatyti pokalbio atsarginę kopiją", - "@setupChatBackup": {}, "yourChatBackupHasBeenSetUp": "Jūsų pokalbio atsarginė kopija buvo nustatyta.", "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "Pokalbio atsargine kopija", @@ -1054,37 +773,17 @@ "type": "text", "description": "Usage hint for the command /me" }, - "discardPicture": "Atmesti paveiksliuką", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Rasti", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Rasti grupes", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Vardas buvo pakeistas", + "displaynameHasBeenChanged": "Rodomas vardas buvo pakeistas", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "dontAskAgain": "Atmesti ir daugiau neklausti", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Redaguoti vardą", + "editDisplayname": "Redaguoti rodomą vardą", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editRoomAliases": "Redaguoti kambario slapyvardžius", + "editRoomAliases": "Redaguoti kambario pseudonimus", "@editRoomAliases": { "type": "text", "placeholders": {} @@ -1094,11 +793,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Namų serveris nesuderinamas", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Kiek įžeižiantis šis turinys?", "@howOffensiveIsThisContent": { "type": "text", @@ -1109,17 +803,12 @@ "type": "text", "placeholders": {} }, - "ignoreUsername": "Ignoruoti vartotoją", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Aš paspaudžiau nuorodą", "@iHaveClickedOnLink": { "type": "text", "placeholders": {} }, - "incorrectPassphraseOrKey": "Neteisinga slapta frazė arba atkūrimo raktas", + "incorrectPassphraseOrKey": "Neteisinga slaptafrazė arba atkūrimo raktas", "@incorrectPassphraseOrKey": { "type": "text", "placeholders": {} @@ -1129,11 +818,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Neteisingas e-paštas", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Pakviesti kontaktą", "@inviteContact": { "type": "text", @@ -1149,7 +833,7 @@ "type": "text", "placeholders": {} }, - "isTyping": "rašoma…", + "isTyping": "rašo…", "@isTyping": { "type": "text", "placeholders": {} @@ -1164,17 +848,7 @@ "type": "text", "placeholders": {} }, - "lastSeenIp": "Paskutinis žinomas IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Seniai matytas", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Paliko poaklbį", + "leftTheChat": "Paliko pokalbį", "@leftTheChat": { "type": "text", "placeholders": {} @@ -1189,7 +863,7 @@ "type": "text", "placeholders": {} }, - "loadingPleaseWait": "Kraunasi... Paršome palaukti", + "loadingPleaseWait": "Kraunama… Prašome palaukti.", "@loadingPleaseWait": { "type": "text", "placeholders": {} @@ -1199,12 +873,12 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nauja žinutė FluffyChat'e", + "newMessageInFluffyChat": "💬 Nauja žinutė FluffyChat'e", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} }, - "newVerificationRequest": "Nauja patvirtinimo užklausa", + "newVerificationRequest": "Nauja patvirtinimo užklausa!", "@newVerificationRequest": { "type": "text", "placeholders": {} @@ -1224,16 +898,6 @@ "type": "text", "placeholders": {} }, - "noDescription": "Nėra aprašymo", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Nustatyti grupės aprašymą", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Nustatyti pakvietimo nuorodą", "@setInvitationLink": { "type": "text", @@ -1244,11 +908,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Garsas, vibracijos LED spalvos", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Programinis kodas", "@sourceCode": { "type": "text", @@ -1269,7 +928,7 @@ "type": "text", "placeholders": {} }, - "statusExampleMessage": "Kaip sekasi šiandiena?", + "statusExampleMessage": "Kaip sekasi šiandien?", "@statusExampleMessage": { "type": "text", "placeholders": {} @@ -1279,52 +938,32 @@ "type": "text", "placeholders": {} }, - "synchronizingPleaseWait": "Sinchronizuojama... Palaukite.", + "synchronizingPleaseWait": "Sinchronizuojama… Prašome palaukti.", "@synchronizingPleaseWait": { "type": "text", "placeholders": {} }, - "tapToShowImage": "Bakstelėkite, kad būtų rodomas paveiksliukas", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Bakstelėkite, kad būtų rodomas meniu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "transferFromAnotherDevice": "Perkėlimas iš kito įrenginio", "@transferFromAnotherDevice": { "type": "text", "placeholders": {} }, - "unknownSessionVerify": "Nežinoma sesija, prašome patvirtinti", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "verify": "Patvirtinti", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Patvirtinti rankiniu būdu", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Pradėti patvirtinimą", "@verifyStart": { "type": "text", "placeholders": {} }, - "verifySuccess": "Jūs sėkmingai patvirtintas!", + "verifySuccess": "Jūs sėkmingai patvirtinote!", "@verifySuccess": { "type": "text", "placeholders": {} }, - "verifyTitle": "Tikrinama kita paskyra", + "verifyTitle": "Patvirtinama kita paskyra", "@verifyTitle": { "type": "text", "placeholders": {} @@ -1349,21 +988,11 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Esate pakviesti į šį pokalbį", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Jūs nebedalyvaujate šiame pokalbyje", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Jūs negalite pakviesti savęs", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Jums buvo uždrausta dalyvauti šiame pokalbyje", "@youHaveBeenBannedFromThisChat": { "type": "text", @@ -1373,30 +1002,11 @@ "@messageInfo": {}, "removeFromSpace": "Pašalinti iš erdvės", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Tai pašalins šį pokalbį iš dabartinės erdvės. Tada jis vis tiek bus matomas skiltyje „Visi pokalbiai“.", - "@removeFromSpaceDescription": {}, - "showSpaces": "Rodyti erdvių sąrašą", - "@showSpaces": {}, - "publicSpace": "Vieša erdvė", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Apsaugos raktas", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "security": "Apsauga", "@security": { "type": "text", "placeholders": {} }, - "securityKeyLost": "Pamiršote apsugos raktą?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "sendAsText": "Siųsti kaip tekstą", "@sendAsText": { "type": "text" @@ -1431,21 +1041,11 @@ "type": "text", "placeholders": {} }, - "sessionVerified": "Sesija patvirtinta", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "separateChatTypes": "Atskirti tiesioginius pokalbius, grupes ir erdves", + "separateChatTypes": "Atskirti tiesioginius pokalbius ir grupes", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "setAProfilePicture": "Nustatyti vartotojo profilio paveiksliuką", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Nustatyti kaip pagrindinį slapyvardį", "@setAsCanonicalAlias": { "type": "text", @@ -1461,31 +1061,16 @@ "type": "text", "placeholders": {} }, - "shareLocation": "Dalintis vieta", + "shareLocation": "Bendrinti vietą", "@shareLocation": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Rodyti susijusius tiesioginius pokalbius erdvėse", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registruotis", - "@signUp": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Sistema", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Bakstelėkite įrenginį, kad patvirtintumėte", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "unavailable": "Nepasiekiamas", "@unavailable": { "type": "text", @@ -1511,26 +1096,11 @@ "type": "text", "placeholders": {} }, - "useAmoledTheme": "Naudoti su AMOLED suderinamas spalvas?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "username": "Vartotojo vardas", "@username": { "type": "text", "placeholders": {} }, - "userNotVerified": "Vartotojas nepatvirtintas", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Vartotojas patvirtintas", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "unverified": "Nepatvirtinta", "@unverified": {}, "verified": "Patvirtinta", @@ -1538,52 +1108,20 @@ "type": "text", "placeholders": {} }, - "verifiedSession": "Sesija sėkmingai patvirtinta!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Patvirtinti vartotoją", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Vaizdo skambutis", "@videoCall": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Jūsų pokalbiai sinchronizuojami…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Jūsų vartotojo vardas", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Jūsų viešasis raktas", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "zoomIn": "Priartinti", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Nutolinti", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "addToSpaceDescription": "Pasirinkite erdvę, kad prie jos pridėtumėte šį pokalbį.", "@addToSpaceDescription": {}, "start": "Pradžia", "@start": {}, - "setupChatBackupNow": "Nustatykite atsarginę pokalbio kopiją", - "@setupChatBackupNow": {}, "account": "Paskyra", "@account": { "type": "text", @@ -1596,51 +1134,29 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Archyvuotas kambarys", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Ar svečiams leidžiama prisijungti", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "botMessages": "Bot žinutės", + "botMessages": "Botų žinutės", "@botMessages": { "type": "text", "placeholders": {} }, - "bubbleSize": "Burbulo dydis", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "Šifravimas buvo sugadintas", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "iWroteDownTheKey": "Užrašiau raktą", - "@iWroteDownTheKey": {}, "chatHasBeenAddedToThisSpace": "Pokalbis buvo pridėtas prie šios erdvės", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Pokalbis pašalintas iš šios erdvės", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearText": "Išvalyti tekstą", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Palyginkite ir įsitikinkite, kad šie emoji atitinka kito įrenginio emoji:", + "compareEmojiMatch": "Palyginkite jaustukus", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Palyginkite ir įsitikinkite, kad šie skaičiai sutampa su kito įrenginio skaičiais:", + "compareNumbersMatch": "Palyginkite skaičius", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -1660,7 +1176,7 @@ "type": "text", "placeholders": {} }, - "deactivateAccountWarning": "Tai išjungs jūsų vartotojo paskyrą. Atšaukti negalima! Ar jūs tuo tikri?", + "deactivateAccountWarning": "Tai deaktyvuos jūsų vartotojo paskyrą. Tai negali būti atšaukta! Ar jūs tuo tikri?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} @@ -1675,8 +1191,6 @@ "type": "text", "placeholders": {} }, - "enterASpacepName": "Įveskite erdvės vardą", - "@enterASpacepName": {}, "send": "Siųsti", "@send": { "type": "text", @@ -1697,7 +1211,7 @@ "type": "text", "placeholders": {} }, - "waitingPartnerEmoji": "Laukiama, kol dalyvis priims emoji…", + "waitingPartnerEmoji": "Laukiama, kol dalyvis priims jaustukus…", "@waitingPartnerEmoji": { "type": "text", "placeholders": {} @@ -1717,11 +1231,6 @@ "type": "text", "placeholders": {} }, - "wednesday": "Trečiadienis", - "@wednesday": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Išsiuntėme jums el. laišką", "@weSentYouAnEmail": { "type": "text", @@ -1742,7 +1251,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Išvalyti atsarginę pokalbio kopiją, kad sukurtumėte naują saugos raktą?", + "wipeChatBackup": "Ištrinti atsarginę pokalbių kopiją, kad sukurti naują atkūrimo raktą?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -1754,13 +1263,8 @@ }, "messageType": "Žinutės tipas", "@messageType": {}, - "openGallery": "Atvira galerija", + "openGallery": "Atverti galeriją", "@openGallery": {}, - "chooseAUsername": "Pasirinkite vartotojo vardą", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "unknownDevice": "Nežinomas įrenginys", "@unknownDevice": { "type": "text", @@ -1787,7 +1291,7 @@ "type": "text", "placeholders": {} }, - "locationPermissionDeniedNotice": "Vietos nustatymas atmestas. Suteikite galimybę rodyti jūsų vietą.", + "locationPermissionDeniedNotice": "Vietos leidimas atmestas. Suteikite leidimą kad galėtumėte bendrinti savo vietą.", "@locationPermissionDeniedNotice": { "type": "text", "placeholders": {} @@ -1802,58 +1306,24 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Šiuo metu Fluffychat nepalaiko Cross-signing pasirašymo. Aktyvuokite jį Element'e.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nerasta emotes. 😕", + "noEmotesFound": "Nerasta jaustukų. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Vietoje to įjunkite internetinio rakto atsarginę kopiją Element'e", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "noGoogleServicesWarning": "Atrodo, kad jūsų telefone nėra Google Services. Tai geras sprendimas jūsų privatumui! Norėdami gauti tiesioginius pranešimus FluffyChat, rekomenduojame naudoti https://microg.org/ arba https://unifiedpush.org/.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "newPasswordDescription": "Kad galėtumėte atkurti slaptažodį, vėliau prie paskyros turėtumėte pridėti el. pašto adresą.", - "@newPasswordDescription": {}, "noPasswordRecoveryDescription": "Dar nepridėjote slaptažodžio atkūrimo būdo.", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Kol kas nerasta jokių būsenų.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nepalaikoma internete", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "Pasirinktas {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "onlineKeyBackupDisabled": "Rakto atsarginis kopijavimas išjungtas", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "oneClientLoggedOut": "Vienas iš jūsų klientų atsijungė", "@oneClientLoggedOut": {}, - "onlineKeyBackupEnabled": "Rakto atsarginis kopijavimas įjungtas", + "onlineKeyBackupEnabled": "Internetinė atsarginė raktų kopija įjungta", "@onlineKeyBackupEnabled": { "type": "text", "placeholders": {} @@ -1872,11 +1342,6 @@ "@editBundlesForAccount": {}, "serverRequiresEmail": "Šis serveris turi patvirtinti jūsų el. pašto adresą registracijai.", "@serverRequiresEmail": {}, - "optionalGroupName": "(Pasirenkama) Grupės pavadinimas", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "addToBundle": "Pridėti prie paketų", "@addToBundle": {}, "removeFromBundle": "Pašalinkite iš šio paketo", @@ -1890,7 +1355,7 @@ "fileName": {} } }, - "redactedAnEvent": "{username} redagavo įvykį", + "redactedAnEvent": "{username} pašalino įvykį", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -1911,12 +1376,12 @@ "username": {} } }, - "unbanFromChat": "Pašalinti draudimą pokalbyje", + "unbanFromChat": "Atblokuoti pokalbyje", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "renderRichContent": "Pateikite pranešimų turinį", + "renderRichContent": "Atvaizduoti turtingą žinutės turinį", "@renderRichContent": { "type": "text", "placeholders": {} @@ -1926,57 +1391,45 @@ "type": "text", "placeholders": {} }, - "savedFileAs": "Failas išsaugotas kaip {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Išsaugoti failą", "@saveFile": { "type": "text", "placeholders": {} }, - "seenByUser": "Jau matė {username}", + "seenByUser": "Matė {username}", "@seenByUser": { "type": "text", "placeholders": { "username": {} } }, - "sendBugReports": "Leisti siųsti pranešimus apie klaidas naudojant sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendSticker": "Siųsti lipduką", "@sendSticker": { "type": "text", "placeholders": {} }, - "sentAFile": "{username} atsiuntė failą", + "sentAFile": "📁 {username} atsiuntė failą", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} atsiuntė garso įrašą", + "sentAnAudio": "🎤 {username} atsiuntė garso įrašą", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} atsiuntė lipduką", + "sentASticker": "😊 {username} atsiuntė lipduką", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sharedTheLocation": "{username} pasidalino savo vietą", + "sharedTheLocation": "{username} bendrino savo vietą", "@sharedTheLocation": { "type": "text", "placeholders": { @@ -1990,11 +1443,6 @@ "senderName": {} } }, - "startYourFirstChat": "Pradėkite savo pirmąjį pokalbį dabar! 🙂 - Paspauskite „Naujas pokalbis“ - Nuskaitykite draugo QR kodą - Smagaus pokalbio", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Jie nesutampa", "@theyDontMatch": { "type": "text", @@ -2005,7 +1453,7 @@ "type": "text", "placeholders": {} }, - "unbannedUser": "{username} panaikino draudimą {targetName}", + "unbannedUser": "{username} atblokavo {targetName}", "@unbannedUser": { "type": "text", "placeholders": { @@ -2020,11 +1468,6 @@ "type": {} } }, - "unlockChatBackup": "Atrakinkite pokalbio atsarginę kopiją", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} ir dar {count} kiti rašo…", "@userAndOthersAreTyping": { "type": "text", @@ -2048,11 +1491,6 @@ "username": {} } }, - "userUnknownVerification": "Vartotojo būsena nežinoma", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} išsiuntė {type} įvykį", "@userSentUnknownEvent": { "type": "text", @@ -2061,36 +1499,15 @@ "type": {} } }, - "youWillBeConnectedTo": "Būsite prisijungę prie {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "saveTheSecurityKeyNow": "Išsaugokite saugos raktą dabar", - "@saveTheSecurityKeyNow": {}, - "addToStory": "Pridėti prie istorijos", - "@addToStory": {}, - "pleaseEnterSecurityKeyDescription": "Norėdami atrakinti atsarginę pokalbio kopiją, įveskite saugos raktą, kuris buvo sugeneruotas ankstesnės sesijos metu. Jūsų saugos raktas NĖRA jūsų slaptažodis.", - "@pleaseEnterSecurityKeyDescription": {}, "publish": "Paskelbti", "@publish": {}, - "whoCanSeeMyStories": "Kas gali matyti mano istorijas?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Atsisakyti istorijų prenumeratos", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Šis vartotojas dar nieko nepaskelbė savo istorijoje", - "@thisUserHasNotPostedAnythingYet": {}, - "storyPrivacyWarning": "Atminkite, kad žmonės gali matyti vienas kitą ir susisiekti tarpusavyje jūsų istorijoje. Jūsų istorijos bus matomos 24 valandas, tačiau nėra garantijos, kad jos bus ištrintos iš visų įrenginių ir serverių.", - "@storyPrivacyWarning": {}, - "openChat": "Atviras pokalbis", + "openChat": "Atverti pokalbį", "@openChat": {}, "reportUser": "Pranešti apie vartotoją", "@reportUser": {}, "dismiss": "Atsisakyti", "@dismiss": {}, - "reactedWith": "{sender} suregavo su {reaction}", + "reactedWith": "{sender} sureagavo su {reaction}", "@reactedWith": { "type": "text", "placeholders": { @@ -2104,23 +1521,16 @@ "@emailOrUsername": {}, "widgetVideo": "Video", "@widgetVideo": {}, - "widgetNameError": "Pateikite rodomą vardą", + "widgetNameError": "Pateikite rodomą vardą.", "@widgetNameError": {}, - "pleaseChooseAtLeastChars": "Pasirinkite bent {min} simbolius.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "acceptedTheInvitation": "{username} priėmė kvietimą", + "acceptedTheInvitation": "👍 {username} priėmė kvietimą", "@acceptedTheInvitation": { "type": "text", "placeholders": { "username": {} } }, - "activatedEndToEndEncryption": "{username} suaktyvino end to end šifravimą", + "activatedEndToEndEncryption": "🔐 {username} aktyvavo visapusį šifravimą", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -2141,7 +1551,7 @@ "username": {} } }, - "badServerLoginTypesException": "Namų serveris palaiko prisijungimo tipus: {serverVersions} Tačiau ši programa palaiko tik: {supportedVersions}", + "badServerLoginTypesException": "Namų serveris palaiko šiuos prisijungimo tipus:\n{serverVersions}\nTačiau ši programa palaiko tik:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", "placeholders": { @@ -2149,7 +1559,7 @@ "supportedVersions": {} } }, - "badServerVersionsException": "Namų serveris palaiko spec. versijas: {serverVersions} Tačiau ši programa palaiko tik {supportedVersions}", + "badServerVersionsException": "Namų serveris palaiko spec. versijas:\n{serverVersions}\nTačiau ši programa palaiko tik {supportedVersions}", "@badServerVersionsException": { "type": "text", "placeholders": { @@ -2165,14 +1575,14 @@ "targetName": {} } }, - "changedTheHistoryVisibility": "{username} pakeitė istorijos prieinamumą", + "changedTheHistoryVisibility": "{username} pakeitė istorijos matomumą", "@changedTheHistoryVisibility": { "type": "text", "placeholders": { "username": {} } }, - "changedTheHistoryVisibilityTo": "{username} pakeitė istorijos prieinamumą į: {rules}", + "changedTheHistoryVisibilityTo": "{username} pakeitė istorijos matomumą į: {rules}", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -2180,27 +1590,27 @@ "rules": {} } }, - "chatBackupDescription": "Jūsų pokalbio atsarginė kopija apsaugota saugos raktu. Prašome įsitikinti, kad jo neprarasite.", + "chatBackupDescription": "Jūsų senos žinutės yra apsaugotos atkūrimo raktu. Pasirūpinkite, kad jo neprarastumėte.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "commandHint_create": "Sukurkite tuščią grupės pokalbį. Norėdami išjungti šifravimą, naudokite no encryption", + "commandHint_create": "Sukurti tuščią grupinį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" }, - "commandHint_dm": "Pradėkite tiesioginį pokalbį. Norėdami išjungti šifravimą, naudokite no encryption", + "commandHint_dm": "Pradėti tiesioginį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" }, - "commandHint_myroomavatar": "Nustatyti savo nuotrauką šiam kambariui (mxc-uri)", + "commandHint_myroomavatar": "Nustatyti savo nuotrauką šiame kambaryje (su mxc-uri)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" }, - "commandHint_op": "Nustatykite naudotojo galios lygį (numatytasis: 50)", + "commandHint_op": "Nustatyti naudotojo galios lygį (numatytasis: 50)", "@commandHint_op": { "type": "text", "description": "Usage hint for the command /op" @@ -2218,12 +1628,12 @@ }, "description": "State that {command} is not a valid /command." }, - "containsDisplayName": "Yra vardas", + "containsDisplayName": "Turi rodomą vardą", "@containsDisplayName": { "type": "text", "placeholders": {} }, - "containsUserName": "Yra vartotojo vardas", + "containsUserName": "Turi vartotojo vardą", "@containsUserName": { "type": "text", "placeholders": {} @@ -2242,59 +1652,49 @@ "count": {} } }, - "createdTheChat": "{username} sukūrė pokalbį", + "createdTheChat": "💬 {username} sukūrė pokalbį", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "crossSigningDisabled": "Cross-signing išjungtas", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Redaguoti Jitsi pavyzdį", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "emptyChat": "Tuščias pokalbis", "@emptyChat": { "type": "text", "placeholders": {} }, - "emoteExists": "Emote jau egzistuoja!", + "emoteExists": "Jaustukas jau egzistuoja!", "@emoteExists": { "type": "text", "placeholders": {} }, - "emoteInvalid": "Neteisingas emote trumpasis kodas!", + "emoteInvalid": "Neteisingas jaustuko trumpasis kodas!", "@emoteInvalid": { "type": "text", "placeholders": {} }, - "emotePacks": "Emote paketai kambariui", + "emotePacks": "Jaustukų paketai kambariui", "@emotePacks": { "type": "text", "placeholders": {} }, - "emoteSettings": "Emote nustatymai", + "emoteSettings": "Jaustukų nustatymai", "@emoteSettings": { "type": "text", "placeholders": {} }, - "emoteShortcode": "Emote trumpasis kodas", + "emoteShortcode": "Jaustuko trumpasis kodas", "@emoteShortcode": { "type": "text", "placeholders": {} }, - "emoteWarnNeedToPick": "Turite pasirinkti emote trumpąjį kodą ir paveiksliuką!", + "emoteWarnNeedToPick": "Turite pasirinkti jaustuko trumpąjį kodą ir paveiksliuką!", "@emoteWarnNeedToPick": { "type": "text", "placeholders": {} }, - "enableEmotesGlobally": "Įgalinti emote paketą visur", + "enableEmotesGlobally": "Įgalinti jaustukų paketą visur", "@enableEmotesGlobally": { "type": "text", "placeholders": {} @@ -2333,11 +1733,6 @@ "type": "text", "placeholders": {} }, - "isDeviceKeyCorrect": "Ar teisingas šis įrenginio raktas?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "inviteContactToGroup": "Pakviesti kontaktą į {groupName}", "@inviteContactToGroup": { "type": "text", @@ -2345,7 +1740,7 @@ "groupName": {} } }, - "invitedUser": "{username} pakvietė {targetName}", + "invitedUser": "📩 {username} pakvietė {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -2353,7 +1748,7 @@ "targetName": {} } }, - "inviteText": "{username} pakvietė jus į FluffyChat. 1. Instaliuokite FluffyChat: https://fluffychat.im 2. Prisiregistruokite arba prisijunkite 3. Paspauskite pakvietimo nuorodą: {link}", + "inviteText": "{username} pakvietė jus prisijungti prie FluffyChat. \n1. Įdiekite FluffyChat: https://fluffychat.im \n2. Prisiregistruokite arba prisijunkite \n3. Atidarykite pakvietimo nuorodą: {link}", "@inviteText": { "type": "text", "placeholders": { @@ -2361,24 +1756,14 @@ "link": {} } }, - "joinedTheChat": "{username} prisijungė prie pokalbio", + "joinedTheChat": "👋 {username} prisijungė prie pokalbio", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "keysCached": "Raktai išsaugoti", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Raktai nerasti", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} išmetė {targetName}", + "kicked": "👞 {username} išmetė {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -2386,7 +1771,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} išmetė ir uždraudė {targetName}", + "kickedAndBanned": "🙅 {username} išmetė ir užblokavo {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -2408,29 +1793,14 @@ "count": {} } }, - "logInTo": "Prisijunkite prie {homeserver}", + "logInTo": "Prisijungti prie {homeserver}", "@logInTo": { "type": "text", "placeholders": { "homeserver": {} } }, - "newUsernameDescription": "Jūsų vartotojo ID bus formatu @username:servername", - "@newUsernameDescription": {}, - "seenByUserAndUser": "Jau matė {username} ir {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "thisRoomHasBeenArchived": "Šis kambarys buvo suarchyvuotas.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Perjungti mėgstamiausią", + "toggleFavorite": "Perjungti parankinius", "@toggleFavorite": { "type": "text", "placeholders": {} @@ -2440,16 +1810,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "End-to-end šifravimas šiuo metu yra Beta versijos! Naudokite savo rizika!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Sveiki atvykę į šauniausią momentinių pranešimų programą Matrix tinkle.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "cantOpenUri": "Nepavyksta atidaryti URI {uri}", "@cantOpenUri": { "type": "text", @@ -2532,7 +1892,7 @@ "username": {} } }, - "changedTheRoomAliases": "{username} changed the room aliases", + "changedTheRoomAliases": "{username} pakeitė kambario pseudonimus", "@changedTheRoomAliases": { "type": "text", "placeholders": { @@ -2546,47 +1906,20 @@ "username": {} } }, - "enableChatBackup": "Įgalinkite atsarginę pokalbių kopiją, kad niekada neprarastumėte prieigos prie pokalbių.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Tavo istorija", - "@yourStory": {}, - "replyHasBeenSent": "Atsakymas išsiųstas", - "@replyHasBeenSent": {}, - "videoWithSize": "Video ({size})", + "videoWithSize": "Vaizdo įrašas ({size})", "@videoWithSize": { "type": "text", "placeholders": { "size": {} } }, - "storyFrom": "Istorija nuo {date}: {body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Atminkite, kad žmonės gali matyti vienas kitą ir susisiekti tarpusavyje jūsų istorijoje.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Kas vyksta?", - "@whatIsGoingOn": {}, - "addDescription": "Pridėti aprašymą", - "@addDescription": {}, - "iUnderstand": "Aš suprantu", - "@iUnderstand": {}, - "pinMessage": "Prisijungti prie kambario", + "pinMessage": "Prisegti prie kambario", "@pinMessage": {}, - "pinnedEventsError": "Įkeliant prisegtus pranešimus įvyko klaida", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Ar tikrai visam laikui atjungsite įvykį?", + "confirmEventUnpin": "Ar tikrai norite visam laikui atsegti įvykį?", "@confirmEventUnpin": {}, - "emojis": "Emojis", + "emojis": "Jaustukai", "@emojis": {}, - "placeCall": "Skambinkite", + "placeCall": "Skambinti", "@placeCall": {}, "voiceCall": "Balso skambutis", "@voiceCall": {}, @@ -2596,7 +1929,7 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Eksperimentiniai vaizdo skambučiai", "@experimentalVideoCalls": {}, - "switchToAccount": "Persijungti į paskyrą {number}", + "switchToAccount": "Perjungti paskyrą į {number}", "@switchToAccount": { "type": "number", "placeholders": { @@ -2619,7 +1952,7 @@ "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Jūs prisijungėte prie pokalbio", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Jūs priėmėte kvietimą", + "youAcceptedTheInvitation": "👍 Jūs priėmėte kvietimą", "@youAcceptedTheInvitation": {}, "youBannedUser": "Jūs užblokavote {user}", "@youBannedUser": { @@ -2633,41 +1966,36 @@ "user": {} } }, - "youInvitedBy": "Jus pakvietė {user}", + "youInvitedBy": "📩 Jus pakvietė {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youKicked": "Jūs pašalinote {user}", + "youKicked": "👞 Jūs išmetėte {user}", "@youKicked": { "placeholders": { "user": {} } }, - "youInvitedUser": "Pakvietėte {user}", + "youInvitedUser": "📩 Pakvietėte {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Jūs pašalinote ir užblokavote {user}", + "youKickedAndBanned": "🙅 Jūs išmetėte ir užblokavote {user}", "@youKickedAndBanned": { "placeholders": { "user": {} } }, - "youUnbannedUser": "Jūs atšaukėte {user} draudimą", + "youUnbannedUser": "Jūs atblokavote {user}", "@youUnbannedUser": { "placeholders": { "user": {} } }, - "crossSigningEnabled": "Cross-signing įjungtas", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { "type": "text", @@ -2693,12 +2021,12 @@ "day": {} } }, - "locationDisabledNotice": "Vietos nustatymo paslaugos išjungtos. Aktyvuokite jas, kad galėtų rodyti jūsų vietą.", + "locationDisabledNotice": "Vietos nustatymo paslaugos yra išjungtos. Kad galėtumėte bendrinti savo buvimo vietą, įjunkite jas.", "@locationDisabledNotice": { "type": "text", "placeholders": {} }, - "noMatrixServer": "{server1} nėra Matrix serveris, ar naudoti {server2}?", + "noMatrixServer": "{server1} nėra Matrix serveris, ar vietoj jo naudoti {server2}?", "@noMatrixServer": { "type": "text", "placeholders": { @@ -2720,14 +2048,14 @@ "type": "text", "placeholders": {} }, - "sentAPicture": "{username} atsiuntė nuotrauką", + "sentAPicture": "🖼️ {username} atsiuntė nuotrauką", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} atsiuntė video", + "sentAVideo": "🎥 {username} atsiuntė vaizdo įrašą", "@sentAVideo": { "type": "text", "placeholders": { @@ -2741,17 +2069,12 @@ "senderName": {} } }, - "sentryInfo": "Informacija apie jūsų privatumą: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Nustatykite pasirinktinius emotes", + "setCustomEmotes": "Nustatyti pasirinktinius jaustukus", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "userLeftTheChat": "{username} paliko pokalbį", + "userLeftTheChat": "🚪 {username} paliko pokalbį", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2760,26 +2083,11 @@ }, "markAsRead": "Žymėti kaip skaitytą", "@markAsRead": {}, - "moreEvents": "{count,plural, =1{1 more event} other{{count} more events}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "pushRules": "Taisyklės", + "pushRules": "Tiesioginių pranešimų taisyklės", "@pushRules": { "type": "text", "placeholders": {} }, - "seenByUserAndCountOthers": "{count, plural, other{Jau matė {username} ir {count} others}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} neperskaityti pokalbiai}}", "@unreadChats": { "type": "text", @@ -2787,57 +2095,124 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} neperskaitytos žinutės}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "matrixWidgets": "Matrix programėlės", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Redaguoti programėles ir integracijas kol kas negalima.", - "@integrationsNotImplemented": {}, - "editWidgets": "Redaguoti programėles", - "@editWidgets": {}, "addWidget": "Pridėti programėlę", "@addWidget": {}, - "widgetCustom": "Custom", + "widgetCustom": "Pasirinktinis", "@widgetCustom": {}, - "errorAddingWidget": "Pridedant programėlę įvyko klaida.", + "errorAddingWidget": "Pridedant valdiklį įvyko klaida.", "@errorAddingWidget": {}, - "askSSSSSign": "Kad galėtumėte priregistruoti kitą asmenį, įveskite slaptą frazę arba atkūrimo raktą.", + "askSSSSSign": "Kad galėtumėte prijungti kitą asmenį, įveskite savo saugyklos slaptafrazę arba atkūrimo raktą.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Įveskite slaptą frazę arba atkūrimo raktą, kad patvirtintumėte sesiją.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatiškai leiskite animuotus lipdukus ir emotes", + "autoplayImages": "Automatiškai leisti animuotus lipdukus ir jaustukus", "@autoplayImages": { "type": "text", "placeholder": {} }, - "setupChatBackupDescription": "Siekdami apsaugoti jūsų pranešimus, sukūrėme jums saugos raktą. Laikykite tai saugioje vietoje, pvz. slaptažodžių tvarkyklėje.", - "@setupChatBackupDescription": {}, - "ignoreListDescription": "Galite ignoruoti vartotojus, kurie jums trukdo. Negalėsite gauti jokių pranešimų ar kvietimų į kambarį iš vartotojų, įtrauktų į asmeninį ignoruojamųjų sąrašą.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} + "commandHint_markasdm": "Pažymėti kaip tiesioginio pokalbio kambarį", + "@commandHint_markasdm": {}, + "dehydrateTorLong": "TOR naudotojams rekomenduojama eksportuoti sesiją prieš uždarant langą.", + "@dehydrateTorLong": {}, + "dehydrateWarning": "Šio veiksmo negalima atšaukti. Įsitikinkite, kad saugiai saugote atsarginę kopiją.", + "@dehydrateWarning": {}, + "hydrateTorLong": "Ar paskutinį kartą eksportavote savo sesiją naudodami TOR? Greitai ją importuokite ir tęskite pokalbį.", + "@hydrateTorLong": {}, + "commandHint_markasgroup": "Pažymėti kaip grupę", + "@commandHint_markasgroup": {}, + "pleaseEnterRecoveryKeyDescription": "Norėdami atrakinti senas žinutes, įveskite atkūrimo raktą, kuris buvo sukurtas ankstesnės sesijos metu. Atkūrimo raktas NĖRA jūsų slaptažodis.", + "@pleaseEnterRecoveryKeyDescription": {}, + "callingPermissions": "Skambinimo leidimai", + "@callingPermissions": {}, + "storeInAppleKeyChain": "Saugoti Apple raktų grandinėje", + "@storeInAppleKeyChain": {}, + "callingAccount": "Skambinimo paskyra", + "@callingAccount": {}, + "newSpace": "Nauja erdvė", + "@newSpace": {}, + "callingAccountDetails": "Leidžia FluffyChat naudoti vietinę Android rinkiklio programą.", + "@callingAccountDetails": {}, + "appearOnTop": "Rodyti viršuje", + "@appearOnTop": {}, + "enterSpace": "Įeiti į erdvę", + "@enterSpace": {}, + "enterRoom": "Įeiti į kambarį", + "@enterRoom": {}, + "allSpaces": "Visos erdvės", + "@allSpaces": {}, + "user": "Vartotojas", + "@user": {}, + "custom": "Pasirinktinis", + "@custom": {}, + "confirmMatrixId": "Norėdami ištrinti savo paskyrą, patvirtinkite savo Matrix ID.", + "@confirmMatrixId": {}, + "supposedMxid": "Tai turėtų būti {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "dehydrate": "Eksportuoti sesiją ir išvalyti įrenginį", + "@dehydrate": {}, + "dehydrateTor": "TOR Naudotojai: Eksportuoti sesiją", + "@dehydrateTor": {}, + "hydrateTor": "TOR Naudotojai: Importuoti sesijos eksportą", + "@hydrateTor": {}, + "hydrate": "Atkurti iš atsarginės kopijos failo", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Įveskite savo atkūrimo raktą:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Atkūrimo raktas", + "@recoveryKey": {}, + "recoveryKeyLost": "Pamestas atkūrimo raktas?", + "@recoveryKeyLost": {}, + "indexedDbErrorLong": "Deja, pagal numatytuosius nustatymus žinučių saugojimas privačiame režime nėra įjungtas.\nPrašome apsilankyti\n - about:config\n - nustatykite dom.indexedDB.privateBrowsing.enabled į true\nPriešingu atveju FluffyChat paleisti neįmanoma.", + "@indexedDbErrorLong": {}, + "countFiles": "{count} failai", + "@countFiles": { + "placeholders": { + "count": {} + } }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", + "storeInSecureStorageDescription": "Atkūrimo raktą laikyti saugioje šio prietaiso saugykloje.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Įrašykite šį raktą rankiniu būdu, įjungę sistemos bendrinimo dialogo langą arba iškarpinę.", + "@saveKeyManuallyDescription": {}, + "users": "Vartotojai", + "@users": {}, + "storeSecurlyOnThisDevice": "Saugiai laikyti šiame prietaise", + "@storeSecurlyOnThisDevice": {}, + "unlockOldMessages": "Atrakinti senas žinutes", + "@unlockOldMessages": {}, + "storeInAndroidKeystore": "Saugoti Android raktų saugykloje", + "@storeInAndroidKeystore": {}, + "indexedDbErrorTitle": "Privataus režimo problemos", + "@indexedDbErrorTitle": {}, + "noKeyForThisMessage": "Taip gali atsitikti, jei žinutė buvo išsiųsta prieš prisijungiant prie paskyros šiame prietaise.\n\nTaip pat gali būti, kad siuntėjas užblokavo jūsų prietaisą arba kažkas sutriko su interneto ryšiu.\n\nAr galite perskaityti žinutę kitoje sesijoje? Tada galite perkelti žinutę iš jos! Eikite į Nustatymai > Prietaisai ir įsitikinkite, kad jūsų prietaisai patvirtino vienas kitą. Kai kitą kartą atidarysite kambarį ir abi sesijos bus pirmame plane, raktai bus perduoti automatiškai.\n\nNenorite prarasti raktų atsijungdami arba keisdami įrenginius? Įsitikinkite, kad nustatymuose įjungėte pokalbių atsarginę kopiją.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Šis pranešimas rodomas, kai veikia pirmojo plano paslauga.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "ekrano bendrinimas", + "@screenSharingTitle": {}, + "appearOnTopDetails": "Leidžia programėlę rodyti viršuje (nebūtina, jei jau esate nustatę Fluffychat kaip skambinimo paskyrą)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Mikrofonas, kamera ir kiti FluffyChat leidimai", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Kodėl ši žinutė neperskaitoma?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Nauja grupė", + "@newGroup": {}, + "screenSharingDetail": "Bendrinate savo ekraną per FuffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} pokalbiai", + "@numChats": { + "type": "number", "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} + "number": {} } }, - "editIntegrations": "Redaguoti programėles ir integracijas", - "@editIntegrations": {} + "hideUnimportantStateEvents": "Slėpti nesvarbius būsenos įvykius", + "@hideUnimportantStateEvents": {} } diff --git a/assets/l10n/intl_lv.arb b/assets/l10n/intl_lv.arb new file mode 100644 index 0000000000..2d2c13111c --- /dev/null +++ b/assets/l10n/intl_lv.arb @@ -0,0 +1,2876 @@ +{ + "showPassword": "Rādīt paroli", + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "hugContent": "{senderName} apskauj Tevi", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "darkTheme": "Tumšs", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "passphraseOrKey": "paroles vārdkopa vai atkopšanas atslēga", + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Lūgums ievadīt savu paroli", + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "theyMatch": "Tās sakrīt", + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "connect": "Savienot", + "@connect": { + "type": "text", + "placeholders": {} + }, + "jumpToLastReadMessage": "Pārlēkt uz pēdējo izlasīto ziņu", + "@jumpToLastReadMessage": {}, + "allRooms": "Visas kopu tērzēšanas", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "obtainingLocation": "Iegūst atrašanās vietu…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "commandHint_cuddle": "Nosūtīt samīļojienu", + "@commandHint_cuddle": {}, + "chats": "Tērzēšanas", + "@chats": { + "type": "text", + "placeholders": {} + }, + "widgetVideo": "Video", + "@widgetVideo": {}, + "dismiss": "Atmest", + "@dismiss": {}, + "unknownDevice": "Nezināma ierīce", + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "emoteShortcode": "Emocijas īskods", + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifrēšanu var iespējot tikai tad, kad istaba vairs nav publiski pieejama.", + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "admin": "Pārvaldītājs", + "@admin": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 Ak nē! Kaut kas nogāja greizi. Ja ir vēlēšanas, par šo nepilnību var ziņot izstrādātājiem.", + "@reportErrorDescription": {}, + "directChats": "Tiešās tērzēšanas", + "@directChats": { + "type": "text", + "placeholders": {} + }, + "setPermissionsLevel": "Iestatīt atļauju līmeni", + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroup": "Uzaicināt kontaktpersonu {groupName}", + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "addAccount": "Pievienot kontu", + "@addAccount": {}, + "close": "Aizvērt", + "@close": { + "type": "text", + "placeholders": {} + }, + "configureChat": "Konfigurēt tērzēšanu", + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Šai vietai tika pievienota tērzēšana", + "@chatHasBeenAddedToThisSpace": {}, + "reply": "Atbildēt", + "@reply": { + "type": "text", + "placeholders": {} + }, + "currentlyActive": "Pašreiz darbīgi", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "removeYourAvatar": "Noņemt savu attēlu", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Neatbalstīta Android versija", + "@unsupportedAndroidVersion": {}, + "device": "Ierīce", + "@device": { + "type": "text", + "placeholders": {} + }, + "blockDevice": "Liegt ierīci", + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "commandHint_html": "Nosūtīt ar HTML formatētu tekstu", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "youAreNoLongerParticipatingInThisChat": "Tu vairs nepiedalies šajā tērzēšanā", + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "encryption": "Šifrēšana", + "@encryption": { + "type": "text", + "placeholders": {} + }, + "messageType": "Ziņas veids", + "@messageType": {}, + "indexedDbErrorLong": "Diemžēl ziņu krātuve pēc noklusējuma nav iespējota privātajā režīmā.\nLūgums apmeklēt\n - about:config\n - iestatīt dom.indexedDB.privateBrowsing.enabled kā true\nPretējā gadījumā nav iespējams palaist FluffyChat.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Viens no klientiem ir atteicies", + "@oneClientLoggedOut": {}, + "toggleMuted": "Pārslēgt apklusināšanu", + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "unsupportedAndroidVersionLong": "Šai iespējai ir nepieciešama jaunāka Android versija. Lūgums pārbaudīt atjauninājumus vai Lineage OS atbalstu.", + "@unsupportedAndroidVersionLong": {}, + "kicked": "👞 {username} izmeta {targetName}", + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Mainīt kopas nosaukumu", + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} nomainīja tērzēšanas attēlu", + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "verifySuccess": "Apliecināšana veiksmīga.", + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "sendFile": "Nosūtīt datni", + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "newVerificationRequest": "Jauns apliecināšanas pieprasījums.", + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "Uzsāc savu pirmo tērzēšanu", + "@startFirstChat": {}, + "callingAccount": "Zvanīšanas konts", + "@callingAccount": {}, + "requestPermission": "Pieprasīt atļauju", + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} nosūtīja attēlu", + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "invited": "Uzaicināts", + "@invited": { + "type": "text", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} nomainīja savu attēlojamo vārdu uz '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "setColorTheme": "Iestatīt krāsu izskatu:", + "@setColorTheme": {}, + "nextAccount": "Nākamais konts", + "@nextAccount": {}, + "commandHint_create": "Izveidot tukšu kopas tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "singlesignon": "Vienotā pieteikšanās", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "warning": "Uzmanību!", + "@warning": { + "type": "text", + "placeholders": {} + }, + "password": "Parole", + "@password": { + "type": "text", + "placeholders": {} + }, + "allSpaces": "Visas vietas", + "@allSpaces": {}, + "supposedMxid": "Tam būtu jābūt {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "editDisplayname": "Labot attēlojamo vārdu", + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "user": "Lietotājs", + "@user": {}, + "roomVersion": "Istabas versija", + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "sentAFile": "📁 {username} nosūtīja datni", + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "videoCall": "Videozvans", + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "youAcceptedTheInvitation": "👍 Tu pieņēmi uzaicinājumu", + "@youAcceptedTheInvitation": {}, + "banFromChat": "Izslēgt no tērzēšanas", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "noMatrixServer": "{server1} nav Matrix serveris, tā vietā izmantot {server2}?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "userAndOthersAreTyping": "{username} un {count} citi raksta…", + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "youInvitedBy": "📩 {user} Tevi uzaicināja", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "userIsTyping": "{username} raksta…", + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "openAppToReadMessages": "Atvērt lietotni, lai lasītu ziņas", + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "sentAVideo": "🎥 {username} nosūtīja video", + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "banUserDescription": "Lietotājam tiks liegta piekļuve tērzēšanai, un vairs nevarēs vēlreiz pievienoties tērzēšanai, līdz liegums tiks atcelts.", + "@banUserDescription": {}, + "inviteContact": "Uzaicināt kontaktpersonu", + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "askSSSSSign": "Lai varētu parakstīt otru cilvēku, lūgums ievadīt savu drošo krātuves paroles vārdkopu vai atkopšanas atslēgu.", + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "widgetEtherpad": "Teksta piezīme", + "@widgetEtherpad": {}, + "waitingPartnerAcceptRequest": "Gaida, līdz biedrs apstiprinās pieprasījumu…", + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "remove": "Noņemt", + "@remove": { + "type": "text", + "placeholders": {} + }, + "writeAMessage": "Rakstīt ziņu…", + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "changeTheme": "Mainīt izskatu", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "id": "Id", + "@id": { + "type": "text", + "placeholders": {} + }, + "removeDevicesDescription": "Tu tiksi izrakstīts no šīs ierīces un vairs nevarēsi saņemt ziņas.", + "@removeDevicesDescription": {}, + "changedTheChatDescriptionTo": "{username} nomainīja tērzēšanas aprakstu uz '{description}'", + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "countParticipants": "{count} dalībnieki", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "separateChatTypes": "Atdalīt tiešās tērzēšanas un kopas", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "tryAgain": "Jāmēģina vēlreiz", + "@tryAgain": {}, + "areGuestsAllowedToJoin": "Vai vieslietotājiem ir ļauts pievienoties", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "blocked": "Liegta", + "@blocked": { + "type": "text", + "placeholders": {} + }, + "youKickedAndBanned": "🙅 Izraidīji {user} un liedzi piekļuvi", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "dateWithoutYear": "{day}.{month}.", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "removeDevice": "Noņemt ierīci", + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "unbanUserDescription": "Lietotājs varēs atkal pievienoties tērzēšanai, ja mēģinās.", + "@unbanUserDescription": {}, + "userAndUserAreTyping": "{username} un {username2} raksta…", + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "pleaseClickOnLink": "Lūgums klikšķināt uz saites e-pastā un tad turpināt.", + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "saveFile": "Saglabāt datni", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "sendOnEnter": "Nosūtīt ar Enter", + "@sendOnEnter": {}, + "pickImage": "Izvēlēties attēlu", + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "answeredTheCall": "{senderName} atbildēja uz zvanu", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "youRejectedTheInvitation": "Tu noraidīji uzaicinājumu", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Mikrofons, kamera un citas FluffyChat atļaujas", + "@otherCallingPermissions": {}, + "messagesStyle": "Ziņas:", + "@messagesStyle": {}, + "couldNotDecryptMessage": "Nevarēja atšifrēt ziņu: {error}", + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "invitedUsersOnly": "Tikai uzaicināti lietotāji", + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "link": "Saite", + "@link": {}, + "widgetUrlError": "Tas nav derīgs URL.", + "@widgetUrlError": {}, + "emailOrUsername": "E-pasta adrese vai lietotājvārds", + "@emailOrUsername": {}, + "newSpaceDescription": "Vietas ļauj apvienot tērzēšanas un būvēt privātas vai publiskas kopienas.", + "@newSpaceDescription": {}, + "chatDescription": "Tērzēšanas apraksts", + "@chatDescription": {}, + "callingAccountDetails": "Ļauj FluffyChat izmantot iebūvēto Android zvanīšanas lietotni.", + "@callingAccountDetails": {}, + "next": "Nākamais", + "@next": { + "type": "text", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Lūgums sekot norādēm tīmekļvietnē un piesist \"Nākamais\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "changedTheGuestAccessRules": "{username} nomainīja viesu piekļuves nosacījumus", + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "dateWithYear": "{day}.{month}.{year}.", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "editRoomAliases": "Labot istabu aizstājvārdus", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "enterSpace": "Ieiet vietā", + "@enterSpace": {}, + "encryptThisChat": "Šifrēt šo tērzēšanu", + "@encryptThisChat": {}, + "fileName": "Datnes nosaukums", + "@fileName": { + "type": "text", + "placeholders": {} + }, + "unavailable": "Nav pieejams", + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "previousAccount": "Iepriekšējais konts", + "@previousAccount": {}, + "publicRooms": "Publiskas istabas", + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "fromTheInvitation": "No uzaicinājuma", + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "sendMessages": "Nosūtīt ziņas", + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nepareiza paroles vārdkopa vai atkopšanas atslēga", + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Nepieciešams izvēlēties emocijas īskodu un attēlu.", + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "reopenChat": "Atkārtoti atvērt tērzēšanu", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Lūgums ievadīt savu atkopšanas atslēgu:", + "@pleaseEnterRecoveryKey": {}, + "create": "Izveidot", + "@create": { + "type": "text", + "placeholders": {} + }, + "toggleFavorite": "Pārslēgt iecienīto", + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "no": "Nē", + "@no": { + "type": "text", + "placeholders": {} + }, + "alias": "aizstājvārds", + "@alias": { + "type": "text", + "placeholders": {} + }, + "widgetNameError": "Lūgums norādīt attēlojamo nosaukumu.", + "@widgetNameError": {}, + "inoffensive": "Nav aizskarošs", + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "unpin": "Atspraust", + "@unpin": { + "type": "text", + "placeholders": {} + }, + "addToBundle": "Pievienot komplektam", + "@addToBundle": {}, + "reportMessage": "Ziņot par ziņu", + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "spaceIsPublic": "Vieta ir publiska", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "addWidget": "Pievienot logrīku", + "@addWidget": {}, + "all": "Viss", + "@all": { + "type": "text", + "placeholders": {} + }, + "removeAllOtherDevices": "Noņemt visas pārējās ierīces", + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "unblockDevice": "Atslēgt ierīci", + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "countFiles": "{count} datnes", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noKeyForThisMessage": "Tā var notikt, ja ziņa tika nosūtīta, pirms pieteicies savā kontā šajā ierīcē.\n\nIr arī iespējams, ka sūtītājs noliedza Tavu ierīci vai kaut kas nogāja greizi ar interneta savienojumu.\n\nVai ziņas ir lasāmas citā sesijā? Tad Tu vari pārsūtīt ziņo no tās. Jādodas uz Iestatījumi > Ierīces un jāpārliecinās, ka ierīces viena otru ir apliecinājušas. Kad nākamreiz atvērsi istabu un abas sesijas būs priekšplānā, atslēgas tiks automātiski pārsūtītas.\n\nVai nevēlies zaudēt atslēgas, kad atsakies vai maini ierīces? Jāpārliecinās, ka iestatījumos ir iespējota tērzēšanas rezerves kopija.", + "@noKeyForThisMessage": {}, + "enableEncryptionWarning": "Vairs nebūs iespējams atspējot šifrēšanu. Vai tiešām to darīt?", + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "inviteText": "{username} uzaicināja pievienoties FluffyChat.\n1. Jāapmeklē fluffychat.im un jāuzstāda lietotne \n2. Jāizveido konts vai jāpiesakās \n3. Jāatver uzaicinājuma saite: \n {link}", + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "shareLocation": "Kopīgot atrašanās vietu", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "reason": "Iemesls", + "@reason": { + "type": "text", + "placeholders": {} + }, + "commandHint_markasgroup": "Atzīmēt kā kopu", + "@commandHint_markasgroup": {}, + "errorObtainingLocation": "Kļūda atrašanās vietas iegūšanā: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "hydrateTor": "TOR lietotāji: ievietot sesijas izguvi", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "Pašpiegādes paziņojumi nav pieejami", + "@pushNotificationsNotAvailable": {}, + "passwordRecovery": "Paroles atjaunošana", + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "storeInAppleKeyChain": "Glabāt Apple KeyChain", + "@storeInAppleKeyChain": {}, + "replaceRoomWithNewerVersion": "Aizvietot istabu ar jaunāku versiju", + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "hydrate": "Atjaunot no rezerves kopijas datnes", + "@hydrate": {}, + "invalidServerName": "Nederīgs servera nosaukums", + "@invalidServerName": {}, + "chatPermissions": "Tērzēšanas atļaujas", + "@chatPermissions": {}, + "voiceMessage": "Balss ziņa", + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "Mājasserveris nodrošina pieteikšanās veidus:\n{serverVersions}\nSavukārt, šī lietotne atbalsta tikai:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "wipeChatBackup": "Notīrīt tērzēšanas rezerves kopiju, lai izveidotu jaunu atkopšanas atslēgu?", + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "cantOpenUri": "Nevar atvērt adresi {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "sender": "Sūtītājs", + "@sender": {}, + "storeInAndroidKeystore": "Glabāt Android KeyStore", + "@storeInAndroidKeystore": {}, + "hideRedactedEvents": "Paslēpt labošanas notikumus", + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "online": "Tiešsaistē", + "@online": { + "type": "text", + "placeholders": {} + }, + "signInWithPassword": "Pieteikties ar paroli", + "@signInWithPassword": {}, + "lastActiveAgo": "Pēdējoreiz redzēts: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "changedTheGuestAccessRulesTo": "{username} nomainīja viesu piekļuves nosacījumus uz {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "weSentYouAnEmail": "Mēs nosūtīja e-pasta ziņu", + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "offensive": "Aizskarošs", + "@offensive": { + "type": "text", + "placeholders": {} + }, + "needPantalaimonWarning": "Lūgums ņemt vērā, ka pagaidām ir nepieciešams Pantalaimon, lai izmantotu pilnīgu šifrēšanu.", + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "makeAdminDescription": "Tiklīdz šis lietotājs tiks padarīts par pārvaldītāju, to vairs nevarēs atdarīt, jo tad tam būs tādas pašas atļaujas kā Tev.", + "@makeAdminDescription": {}, + "edit": "Labot", + "@edit": { + "type": "text", + "placeholders": {} + }, + "loadMore": "Ielādēt vēl…", + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "noEmotesFound": "Netika atrastas emocijas. 😕", + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinhronizē... Lūgums uzgaidīt.", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "transferFromAnotherDevice": "Pārnest no citas ierīces", + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parole tikai nomainīta", + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "pushRules": "Pašpiegādes nosacījumi", + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "goToTheNewRoom": "Doties uz jauno istabu", + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "commandHint_clearcache": "Iztīrīt kešatmiņu", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "loadingPleaseWait": "Ielādē... Lūgums uzgaidīt.", + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "copy": "Ievietot starpliktuvē", + "@copy": { + "type": "text", + "placeholders": {} + }, + "saveKeyManuallyDescription": "Šo atslēgu var pašrocīgi saglabāt ar sistēmas kopīgošanas dialogloga vai starpliktuves izsaukšanu.", + "@saveKeyManuallyDescription": {}, + "none": "Neviens", + "@none": { + "type": "text", + "placeholders": {} + }, + "editBundlesForAccount": "Labot šī konta komplektus", + "@editBundlesForAccount": {}, + "enableEncryption": "Iespējot šifrēšanu", + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "whyIsThisMessageEncrypted": "Kādēļ šī ziņa ir nelasāma?", + "@whyIsThisMessageEncrypted": {}, + "unreadChats": "{unreadCount, plural, zero{{unreadCount} nelasītu tērzēšanu} =1{{unreadCount} nelasīta tērzēšana} other{{unreadCount} nelasītas tērzēšanas}}", + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "rejectedTheInvitation": "{username} noraidīja uzaicinājumu", + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "setChatDescription": "Iestatīt tērzēšanas aprakstu", + "@setChatDescription": {}, + "userLeftTheChat": "🚪 {username} pameta tērzēšanu", + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "spaceName": "Vietas nosaukums", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "importFromZipFile": "Ievietot no .zip datnes", + "@importFromZipFile": {}, + "toggleUnread": "Atzīmēt kā lasītu/nelasītu", + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "or": "Vai", + "@or": { + "type": "text", + "placeholders": {} + }, + "dehydrateWarning": "Šī darbība nav atdarāma. Jānodrošina, ka rezerves kopijas datne tiek droši uzglabāta.", + "@dehydrateWarning": {}, + "sendOriginal": "Nosūtīt sākotnējo", + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "noOtherDevicesFound": "Netika atrastas citas ierīces", + "@noOtherDevicesFound": {}, + "whoIsAllowedToJoinThisGroup": "Kuram ir ļauts pievienoties šai kopai", + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "emptyChat": "Tukša tērzēšana", + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "seenByUser": "{username} redzēja", + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "storeSecurlyOnThisDevice": "Droši uzglabāt šajā ierīcē", + "@storeSecurlyOnThisDevice": {}, + "yourChatBackupHasBeenSetUp": "Tērzēšanas rezerves kopēšana tika iestatīta.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Tērzēšanas rezerves kopēšana", + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "redactedBy": "Laboja {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "submit": "Iesniegt", + "@submit": { + "type": "text", + "placeholders": {} + }, + "videoCallsBetaWarning": "Lūgums ņemt vērā, ka video zvani pašreiz ir beta stāvoklī. Tie visās platformās var nedarboties kā paredzēs vai pat nedarboties vispār.", + "@videoCallsBetaWarning": {}, + "unmuteChat": "Atcelt tērzēšanas apklusināšanu", + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "createdTheChat": "💬 {username} izveidoja tērzēšanu", + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedAnEvent": "{username} laboja notikumu", + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "autoplayImages": "Automātiski atskaņot animētas uzlīmes un emocijas", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "compareEmojiMatch": "Lūgums salīdzināt emocijzīmes", + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "participant": "Dalībnieks", + "@participant": { + "type": "text", + "placeholders": {} + }, + "logInTo": "PIeteikties {homeserver}", + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "yes": "Jā", + "@yes": { + "type": "text", + "placeholders": {} + }, + "containsDisplayName": "Satur attēlojamo vārdu", + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "signInWith": "Pieteikties ar {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "username": "Lietotājvārds", + "@username": { + "type": "text", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} nomainīja istabas aizstājvārdus", + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "fileIsTooBigForServer": "Nevar nosūtīt. Serveris nodrošina pielikums līdz {max}.", + "@fileIsTooBigForServer": {}, + "homeserver": "Mājasserveris", + "@homeserver": {}, + "help": "Palīdzība", + "@help": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "Tērzēšanas izvērsums", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "people": "Cilvēki", + "@people": { + "type": "text", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} nomainīja vēstures redzamību uz {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "leftTheChat": "Pameta tērzēšanu", + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "verified": "Apliecināta", + "@verified": { + "type": "text", + "placeholders": {} + }, + "repeatPassword": "Atkārtot paroli", + "@repeatPassword": {}, + "setStatus": "Iestatīt stāvokli", + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "groupWith": "Kopa ar {displayname}", + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "callingPermissions": "Zvanīšanas atļaujas", + "@callingPermissions": {}, + "delete": "Izdzēst", + "@delete": { + "type": "text", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Jauna ziņa FluffyChat", + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "readUpToHere": "Izlasīts līdz šejienei", + "@readUpToHere": {}, + "start": "Uzsākt", + "@start": {}, + "downloadFile": "Lejupielādēt datni", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "deviceId": "Ierīces Id", + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "register": "Reģistrēties", + "@register": { + "type": "text", + "placeholders": {} + }, + "unlockOldMessages": "Atslēgt vecās ziņas", + "@unlockOldMessages": {}, + "identity": "Identitāte", + "@identity": { + "type": "text", + "placeholders": {} + }, + "numChats": "{number} tērzēšanas", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "changedTheJoinRulesTo": "{username} nomainīja pievienošanās nosacījumus uz {joinRules}", + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "recording": "Ieraksta", + "@recording": { + "type": "text", + "placeholders": {} + }, + "changedTheChatPermissions": "{username} nomainīja tērzēšanas atļaujas", + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "moderator": "Moderators", + "@moderator": { + "type": "text", + "placeholders": {} + }, + "optionalRedactReason": "(Pēc izvēles) Ziņas labošanas iemesls...", + "@optionalRedactReason": {}, + "acceptedTheInvitation": "👍 {username} pieņēma uzaicinājumu", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "waitingPartnerEmoji": "Gaida, līdz biedrs apstiprinās emocijzīmi…", + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrēšana tika bojāta", + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "tryToSendAgain": "Mēģināt nosūtīt vēlreiz", + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "guestsCanJoin": "Viesi var pievienoties", + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "ok": "Labi", + "@ok": { + "type": "text", + "placeholders": {} + }, + "copyToClipboard": "Ievietot starpliktuvē", + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "dehydrate": "Izgūt sesiju un iztīrīt ierīci", + "@dehydrate": {}, + "locationPermissionDeniedNotice": "Atrašanās vietas atļauja noliegta. Lūgums nodrošināt to, lai būtu iespējams kopīgot savu atrašanās vietu.", + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "send": "Nosūtīt", + "@send": { + "type": "text", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} atsauca uzaicinājumu {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "visibleForAllParticipants": "Redzama visiem dalībniekiem", + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "noRoomsFound": "Istabas netika atrastas…", + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "banned": "Izslēgts", + "@banned": { + "type": "text", + "placeholders": {} + }, + "sendAsText": "Nosūtīt kā tekstu", + "@sendAsText": { + "type": "text" + }, + "inviteForMe": "Uzaicinājums man", + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "archiveRoomDescription": "Tērzēšana tiks pārvietota uz arhīvu. Citi lietotāji redzēs, ka pameti tērzēšanu.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Izgūt emociju paku kā .zip", + "@exportEmotePack": {}, + "changedTheChatNameTo": "{username} nomainīja tērzēšanas nosaukumu uz '{chatname}'", + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "sendSticker": "Nosūtīt uzlīmi", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "account": "Konts", + "@account": { + "type": "text", + "placeholders": {} + }, + "switchToAccount": "Pārslēgties uz kontu {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "commandInvalid": "Nederīga komanda", + "@commandInvalid": { + "type": "text" + }, + "setAsCanonicalAlias": "Iestatīt kā galveno aizstājvārdu", + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kādēļ vēlies ziņot par šo?", + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "locationDisabledNotice": "Atrašanās vietas pakalpojumi ir atspējoti. Lūgums tos iespējot, lai būtu iespējams kopīgot savu atrašanās vietu.", + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "placeCall": "Veikt zvanu", + "@placeCall": {}, + "removedBy": "Noņēma {username}", + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheRoomInvitationLink": "{username} nomainīja uzaicinājuma saiti", + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "newChat": "Jauna tērzēšana", + "@newChat": { + "type": "text", + "placeholders": {} + }, + "notifications": "Paziņojumi", + "@notifications": { + "type": "text", + "placeholders": {} + }, + "commandHint_plain": "Nosūtīt neformatētu tekstu", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "emoteSettings": "Emociju iestatījumi", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "experimentalVideoCalls": "Izmēģinājuma video zvani", + "@experimentalVideoCalls": {}, + "openCamera": "Atvērt kameru", + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterRecoveryKeyDescription": "Lai atslēgtu savas vecās ziņas, lūgums ievadīt savu atkopšanas atslēgu, kas tika izveidota iepriekšējā sesijā. Atkopšanas atslēga NAV parole.", + "@pleaseEnterRecoveryKeyDescription": {}, + "guestsAreForbidden": "Viesi nav ļauti", + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "mention": "Pieminēt", + "@mention": { + "type": "text", + "placeholders": {} + }, + "openInMaps": "Atvērt kartēs", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Ar šīm adresēm var atjaunot savu paroli.", + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Vai vēlies uzaicināt {contact} uz tērzēšanu \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "emoteExists": "Emocija jau pastāv.", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "redactedByBecause": "Laboja {username}, jo: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "isTyping": "raksta…", + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "youHaveWithdrawnTheInvitationFor": "Tu atsauci {user} uzaicinājumu", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "chat": "Tērzēšana", + "@chat": { + "type": "text", + "placeholders": {} + }, + "group": "Kopa", + "@group": { + "type": "text", + "placeholders": {} + }, + "leave": "Pamest", + "@leave": { + "type": "text", + "placeholders": {} + }, + "skip": "Izlaist", + "@skip": { + "type": "text", + "placeholders": {} + }, + "appearOnTopDetails": "Ļauj lietotnei parādīties virspusē (nav nepieciešams, ja FluffyChat jau ir iestatīts kā zvanīšanas konts)", + "@appearOnTopDetails": {}, + "roomHasBeenUpgraded": "Istaba tika atjaunināta", + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "enterRoom": "Ieiet istabā", + "@enterRoom": {}, + "enableEmotesGlobally": "Iespējot kā vispārēju emociju paku", + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "areYouSure": "Vai tiešām?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Lūgums izvēlēties piekļuves kodu", + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Vēl nav pievienots paroles atjaunošanas veids.", + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "changedTheProfileAvatar": "{username} nomainīja savu attēlu", + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "allChats": "Visas tērzēšanas", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "reportUser": "Ziņot par lietotāju", + "@reportUser": {}, + "sharedTheLocation": "{username} kopīgoja savu atrašanās vietu", + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "commandHint_send": "Nosūtīt tekstu", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "onlineKeyBackupEnabled": "Tiešsaistes atslēgas rezerves kopēšana ir iespējota", + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "unbannedUser": "{username} atcēla {targetName} piekļuves liegumu", + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "confirmEventUnpin": "Vai tiešām neatgriezeniski atspraust šo notikumu?", + "@confirmEventUnpin": {}, + "badServerVersionsException": "Mājasserveris nodrošina specifikācijas versijas:\n{serverVersions}\nSavukārt, lietotne atbalsta tikai {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "youInvitedUser": "📩 Tu uzaicināji {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "kickedAndBanned": "🙅 {username} izmeta {targetName} un liedza piekļuvi", + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "noConnectionToTheServer": "Nav savienojuma ar serveri", + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Datne tika saglabāta {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "license": "Licence", + "@license": { + "type": "text", + "placeholders": {} + }, + "addToSpace": "Pievienot vietai", + "@addToSpace": {}, + "unbanFromChat": "Atcelt liegumu tērzēšanā", + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "commandMissing": "{command} nav komanda.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "redactMessageDescription": "Ziņa tiks labota visiem šīs sarunas dalībniekiem. To nevar atdarīt.", + "@redactMessageDescription": {}, + "rejoin": "Pievienoties atkārtoti", + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "recoveryKey": "Atkopšanas atslēga", + "@recoveryKey": {}, + "redactMessage": "Labot ziņu", + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "forward": "Pārsūtīt", + "@forward": { + "type": "text", + "placeholders": {} + }, + "commandHint_discardsession": "Atmest sesiju", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "invalidInput": "Nederīga ievade.", + "@invalidInput": {}, + "about": "Par", + "@about": { + "type": "text", + "placeholders": {} + }, + "chooseAStrongPassword": "Jāizvēlas spēcīga parole", + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "dehydrateTorLong": "TOR lietotājiem ir ieteicams izgūt sesiju pirms loga aizvēršanas.", + "@dehydrateTorLong": {}, + "yourPublicKey": "Tava publiskā atslēga", + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "tooManyRequestsWarning": "Pārāk daudz pieprasījumu. Lūgums vēlāk mēģināt vēlreiz.", + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "invitedUser": "📩 {username} uzaicināja {targetName}", + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "kickFromChat": "Izmest no tērzēšanas", + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "commandHint_myroomnick": "Iestatīt savu attēlojamo vārdu šajā istabā", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "offline": "Bezsaistē", + "@offline": { + "type": "text", + "placeholders": {} + }, + "noPermission": "Nav atļaujas", + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "doNotShowAgain": "Vairs nerādīt", + "@doNotShowAgain": {}, + "activatedEndToEndEncryption": "🔐 {username} iespējoja pilnīgu šifrēšanu", + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "report": "ziņot", + "@report": {}, + "status": "Stāvoklis", + "@status": { + "type": "text", + "placeholders": {} + }, + "compareNumbersMatch": "Lūgums salīdzināt skaitļus", + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "groupIsPublic": "Kopa ir publiska", + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "verifyStart": "Uzsākt apliecināšanu", + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "memberChanges": "Dalībnieku izmaiņas", + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "joinRoom": "Pievienoties istabai", + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "unverified": "Neapliecināta", + "@unverified": {}, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Cik aizskarošs ir šis saturs?", + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "serverRequiresEmail": "Šim serverim ir nepieciešams pārbaudīt Tavu e-pasta adresi reģistrācijai.", + "@serverRequiresEmail": {}, + "hideUnimportantStateEvents": "Paslēpt nebūtiskus stāvokļa notikumus", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "ekrāna kopīgošana", + "@screenSharingTitle": {}, + "widgetCustom": "Pielāgots", + "@widgetCustom": {}, + "sentCallInformations": "{senderName} nosūtīja informāciju par zvanu", + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "addToSpaceDescription": "Atlasīt vietu, kurai pievienot šo tērzēšanu.", + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} sūta izbolītas acis", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "youBannedUser": "Tu {user} liedzi piekļuvi", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "theyDontMatch": "Tās nesakrīt", + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Tev tika liegta piekļuve šai tērzēšanai", + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Attēlojamais vārds tika nomainīts", + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "addChatDescription": "Pievienot tērzēšanas aprakstu...", + "@addChatDescription": {}, + "sentAnAudio": "🎤 {username} nosūtīja skaņu", + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "editRoomAvatar": "Labot istabas attēlu", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "encrypted": "Šifrēta", + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "commandHint_leave": "Pamest šo istabu", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Iestatīt savu attēlu šajā istabā (ar mxc-uri)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "cancel": "Atcelt", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pieklauvēja", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "publish": "Publicēt", + "@publish": {}, + "openLinkInBrowser": "Atvērt saiti pārlūkā", + "@openLinkInBrowser": {}, + "clearArchive": "Iztīrīt arhīvu", + "@clearArchive": {}, + "appLock": "Lietotnes aizslēgšana", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "commandHint_react": "Nosūtīt atbildi kā reakciju", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "changedTheHistoryVisibility": "{username} mainīja vēstures redzamību", + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "commandHint_me": "Apraksti sevi", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "pleaseEnterYourUsername": "Lūgums ievadīt savu lietotājvārdu", + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "messageInfo": "Informācija par ziņu", + "@messageInfo": {}, + "disableEncryptionWarning": "Drošības iemeslu dēļ tērzēšanā nevar atspējot šifrēšanu, ja tā ir pirms tam ir bijusi iespējota.", + "@disableEncryptionWarning": {}, + "directChat": "Tiešā tērzēšana", + "@directChat": {}, + "encryptionNotEnabled": "Šifrēšana nav iespējota", + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "wrongPinEntered": "Ievadīts nepareizs PIN. Lūgums mēģināt vēlreiz pēc {seconds} sekundēm...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Nosūtīt rakstīšanas paziņojumus", + "@sendTypingNotifications": {}, + "lightTheme": "Gaišs", + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "inviteGroupChat": "📨 Uzaicināt kopas tērzēšanu", + "@inviteGroupChat": {}, + "appearOnTop": "Parādīt virspusē", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Uzaicināt privātu tērzēšanu", + "@invitePrivateChat": {}, + "verifyTitle": "Apliecina citu kontu", + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "foregroundServiceRunning": "Šis paziņojums parādās, kad darbojas priekšplāna pakalpojums.", + "@foregroundServiceRunning": {}, + "enterAnEmailAddress": "Jāievada e-pasta adrese", + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "voiceCall": "Balss zvans", + "@voiceCall": {}, + "commandHint_kick": "Noņemt norādīto lietotāju no šīs istabas", + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "copiedToClipboard": "Ievietots starpliktuvē", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "createNewSpace": "Jauna vieta", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "commandHint_unban": "Atcelt norādītā lietotāja izslēgšanu no šīs istabas", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "unknownEncryptionAlgorithm": "Nezināms šifrēšanas algoritms", + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "commandHint_ban": "Izslēgt norādīto lietotāju no šīs istabas", + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "importEmojis": "Ievietot emocijzīmes", + "@importEmojis": {}, + "confirm": "Apstiprināt", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "wasDirectChatDisplayName": "Tukša tērzēšana (bija {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "Vēl nav izveidots tērzēšanas apraksts.", + "@noChatDescriptionYet": {}, + "defaultPermissionLevel": "Noklusējuma atļauju līmenis jauniem lietotājiem", + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "removeFromBundle": "Noņemt no šī komplekta", + "@removeFromBundle": {}, + "numUsersTyping": "{count} lietotāji raksta…", + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "fontSize": "Fonta izmērs", + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kurš var veikt kādas darbības", + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "confirmMatrixId": "Lūgums apliecināt savu Matrix Id, lai varētu izdzēst savu kontu.", + "@confirmMatrixId": {}, + "learnMore": "Uzzināt vairāk", + "@learnMore": {}, + "iHaveClickedOnLink": "Es uzklikšķināju uz saites", + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "you": "Tu", + "@you": { + "type": "text", + "placeholders": {} + }, + "notAnImage": "Nav attēla datne.", + "@notAnImage": {}, + "users": "Lietotāji", + "@users": {}, + "openGallery": "Atvērt galeriju", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Tērzēšanas apraksts ir mainījies", + "@chatDescriptionHasBeenChanged": {}, + "search": "Meklēt", + "@search": { + "type": "text", + "placeholders": {} + }, + "newGroup": "Jauna kopa", + "@newGroup": {}, + "bundleName": "Komplekta nosaukums", + "@bundleName": {}, + "dehydrateTor": "TOR lietotāji: izgūt sesiju", + "@dehydrateTor": {}, + "removeFromSpace": "Noņemt no vietas", + "@removeFromSpace": {}, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "commandHint_op": "Iestatīt norādītā lietotāja spēka līmeni (noklusējums: 50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_join": "Pievienoties norādītajai istabai", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "sourceCode": "Pirmkods", + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "roomUpgradeDescription": "Tērzēšana tad tiks atkārtoti izveidota ar jauno istabas versiju. Visiem dalībniekiem tiks paziņots, ka viņiem ir jāpārslēdzas uz jauno tērzēšanu. Vairāk par istabu versijām var atrast https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "commandHint_invite": "Uzaicināt norādīto lietotāju šajā istabā", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "userSentUnknownEvent": "{username} nosūtīja notikumu {type}", + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "scanQrCode": "Nolasīt kvadrātkodu", + "@scanQrCode": {}, + "logout": "Atteikties", + "@logout": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterANumber": "Lūgums ievadīt skaitli lielāku par 0", + "@pleaseEnterANumber": {}, + "contactHasBeenInvitedToTheGroup": "Kontaktpersona tika uzaicināta kopā", + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "youKicked": "👞 Tu izraidīji {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "areYouSureYouWantToLogout": "Vai tiešām atteikties?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "changedTheJoinRules": "{username} nomainīja pievienošanās nosacījumus", + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "profileNotFound": "Lietotāju serverī nevarēja atrast. Varbūt ir nebūšanas ar savienojumu vai lietotājs nepastāv.", + "@profileNotFound": {}, + "jump": "Pārlēkt", + "@jump": {}, + "groups": "Kopas", + "@groups": { + "type": "text", + "placeholders": {} + }, + "reactedWith": "{sender} atsaucās ar {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "bannedUser": "{username} izslēdza {targetName}", + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "sorryThatsNotPossible": "Atvaino! Tas nav iespējams", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "oopsSomethingWentWrong": "Ups! Kaut kas nogāja greizi…", + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "loadCountMoreParticipants": "Ielādēt vēl {count} dalībniekus", + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "shareInviteLink": "Kopīgot uzaicinājuma saiti", + "@shareInviteLink": {}, + "commandHint_markasdm": "Atzīmēt kā tiešo ziņu istabu norādītajam Matrix Id", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Pazaudēta atkopšanas atslēga?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} samīļo Tevi", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "askVerificationRequest": "Pieņemt apliecināšanas pieprasījumu no {username}?", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "containsUserName": "Satur lietotājvārdu", + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "messages": "Ziņas", + "@messages": { + "type": "text", + "placeholders": {} + }, + "login": "Pieteikties", + "@login": { + "type": "text", + "placeholders": {} + }, + "deviceKeys": "Ierīces atslēgas:", + "@deviceKeys": {}, + "waitingPartnerNumbers": "Gaida, līdz biedrs apstiprinās skaitļus…", + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "noGoogleServicesWarning": "Izskatās, ka Firebase mākoņziņojumapmaiņa nav pieejama šajā ierīcē. Lai joprojām saņemtu pašpiegādes paziņojumus, mēs iesakām uzstādīt ntfy. Ar ntfy vai citu Vienotās pašpiegādes nodrošinātāju ir iespējams saņemt pašpiegādes paziņojumus drošā veidā. ntfy var lejupielādēt no PlayStore vai F-Droid.", + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "everythingReady": "Viss ir gatavs!", + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "addEmail": "Pievienot e-pasta adresi", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Nesen izmantotās emocijas parādīsies šeit...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setCustomEmotes": "Iestatīt pielāgotas emocijas", + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "startedACall": "{senderName} uzsāka zvanu", + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "emoteInvalid": "Nederīgs emocijas īskods.", + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "systemTheme": "Sistēmas", + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Paziņojumi iespējoti šim kontam", + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "Izdzēst ziņu", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Tērzēšanas vēstures redzamība", + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "settings": "Iestatījumi", + "@settings": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Iestatīt izskatu:", + "@setTheme": {}, + "changeTheHomeserver": "Mainīt mājasserveri", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "youJoinedTheChat": "Tu pievienojies tērzēšanai", + "@youJoinedTheChat": {}, + "wallpaper": "Ekrāntapete:", + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "openVideoCamera": "Atvērt kameru video uzņemšanai", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "play": "Atskaņot {fileName}", + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "chatBackupDescription": "Iepriekšējās ziņas ir aizsargātas ar atkopšanas atslēgu. Lūgums nodrošināt, ka tā netiek pazaudēta.", + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "changeDeviceName": "Mainīt ierīces nosaukumu", + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "passwordForgotten": "Aizmirsta parole", + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "statusExampleMessage": "Kā Tev šodien klājas?", + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "security": "Drošība", + "@security": { + "type": "text", + "placeholders": {} + }, + "markAsRead": "Atzīmēt kā lasītu", + "@markAsRead": {}, + "sendAudio": "Nosūtīt skaņu", + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "widgetName": "Nosaukums", + "@widgetName": {}, + "sentASticker": "😊 {username} nosūtīja uzlīmi", + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "errorAddingWidget": "Kļūda logrīka pievienošanā.", + "@errorAddingWidget": {}, + "commandHint_dm": "Uzsākt tiešu tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Nosūtīt apskāvienu", + "@commandHint_hug": {}, + "replace": "Aizstāt", + "@replace": {}, + "reject": "Noraidīt", + "@reject": { + "type": "text", + "placeholders": {} + }, + "extremeOffensive": "Īpaši aizskarošs", + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "editBlockedServers": "Labot liegtos serveros", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "oopsPushError": "Ups! Diemžēl atgadījās kļūda pašpiegādes paziņojumu iestatīšanas laikā.", + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "youUnbannedUser": "Tu atcēli {user} piekļuves liegumu", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "deactivateAccountWarning": "Tas atspējos Tavu lietotāja kontu. To nevar atdarīt. Vai tiešām?", + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "archive": "Arhīvs", + "@archive": { + "type": "text", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} pievienojās tērzēšanai", + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "visibleForEveryone": "Redzama visiem", + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "pleaseEnter4Digits": "Lūgums ievadīt 4 ciparus vai atstāt tukšu, lai atspējotu lietotnes slēgu.", + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "newSpace": "Jauna vieta", + "@newSpace": {}, + "changePassword": "Nomainīt paroli", + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "devices": "Ierīces", + "@devices": { + "type": "text", + "placeholders": {} + }, + "accept": "Pieņemt", + "@accept": { + "type": "text", + "placeholders": {} + }, + "unknownEvent": "Nezināms notikums '{type}'", + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "emojis": "Emocijzīmes", + "@emojis": {}, + "pleaseEnterYourPin": "Lūgums ievadīt savu PIN", + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "pleaseChoose": "Lūgums izvēlēties", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "share": "Kopīgot", + "@share": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "Nosūtīt izbolītu acu pāri", + "@commandHint_googly": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Lūgums vēlāk mēģināt vēlreiz vai izvēlēties citu serveri.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Izveidot kopu", + "@createGroup": {}, + "privacy": "Privātums", + "@privacy": { + "type": "text", + "placeholders": {} + }, + "changeYourAvatar": "Mainīt savu attēlu", + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "sendImage": "Nosūtīt attēlu", + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "hydrateTorLong": "Vai sesija pēdējoreiz tika izgūta TOR? Ātri ievieto to un turpini tērzēšanu!", + "@hydrateTorLong": {}, + "time": "Laiks", + "@time": {}, + "enterYourHomeserver": "Jāievada mājasserveris", + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "botMessages": "Robotprogrammatūras ziņas", + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "contentHasBeenReported": "Par saturu tika ziņos servera pārvaldītājiem", + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "custom": "Pielāgots", + "@custom": {}, + "noBackupWarning": "Uzmanību! Bez tērzēšanas rezerves kopijas iespējošanas tiks zaudēta piekļuve savām šifrētajām ziņām. Ir ļoti ieteicams iespējot tērzēšanas rezerves kopiju pirms atteikšanās.", + "@noBackupWarning": {}, + "fromJoining": "No pievienošanās", + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "verify": "Apliecināt", + "@verify": { + "type": "text", + "placeholders": {} + }, + "sendVideo": "Nosūtīt video", + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "storeInSecureStorageDescription": "Glabāt atkopšanas atslēgu šīs ierīces drošajā krātuvē.", + "@storeInSecureStorageDescription": {}, + "openChat": "Atvērt tērzēšanu", + "@openChat": {}, + "kickUserDescription": "Lietotājs ir izmests no tērzēšanas, bet piekļuve nav liegta. Publiskās tērzēšanās lietotājs var atkārtoti pievienoties jebkurā laikā.", + "@kickUserDescription": {}, + "sendAMessage": "Nosūtīt ziņu", + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "pin": "PIN", + "@pin": { + "type": "text", + "placeholders": {} + }, + "importNow": "Ievietot tagad", + "@importNow": {}, + "deleteAccount": "Izdzēst kontu", + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "setInvitationLink": "Iestatīt uzaicinājumu saiti", + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "pinMessage": "Piespraust istabai", + "@pinMessage": {}, + "screenSharingDetail": "Tu kopīgo savu ekrānu FluffyChat", + "@screenSharingDetail": {}, + "muteChat": "Apklusināt tērzēšanu", + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "invite": "Uzaicināt", + "@invite": {}, + "enableMultiAccounts": "(BETA) Iespējot vairākus kontus šajā ierīcē", + "@enableMultiAccounts": {}, + "anyoneCanJoin": "Ikviens var pievienoties", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "emotePacks": "Emociju pakas istabai", + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "indexedDbErrorTitle": "Privātā režīma nebūšanas", + "@indexedDbErrorTitle": {}, + "endedTheCall": "{senderName} beidza zvanu", + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "appLockDescription": "Aizslēgt lietotni ar PIN kodu, kad tā netiek izmantota", + "@appLockDescription": {}, + "globalChatId": "Vispārējais tērzēšanas Id", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Kam ir ļauts pievienoties šai tērzēšanai un kā tērzēšana var tikt atklāta.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Pielāgotas emocijzīmes un uzlīmes", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Pievienot vai kopīgot pielāgotas emocijzīmes vai uzlīmes, kas var tikt izmantotas jebkurā tērzēšanā.", + "@customEmojisAndStickersBody": {}, + "hideInvalidOrUnknownMessageFormats": "Paslēpt nederīgus vai nezināmus ziņu formātus", + "@hideInvalidOrUnknownMessageFormats": {}, + "blockUsername": "Neņemt vērā lietotājvārdu", + "@blockUsername": {}, + "accessAndVisibility": "Piekļuve un redzamība", + "@accessAndVisibility": {}, + "calls": "Zvani", + "@calls": {}, + "hideRedactedMessages": "Paslēpt labošanas ziņas", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Ja kāds labo ziņu, tā vairs nebūs redzama tērzēšanā.", + "@hideRedactedMessagesBody": {}, + "blockListDescription": "Ir iespējams atslēgt traucējošus lietotājus. Nebūs iespējams saņem jebkādas ziņas vai uzaicinājumus uz istabām no lietotājiem, kas ir personīgajā izslēgšanas sarakstā.", + "@blockListDescription": {}, + "hideMemberChangesInPublicChatsBody": "Nerādīt tērzēšanas plūsmā, ja kāds pievienojas publiskai tērzēšanai vai pamet to, lai uzlabotu lasāmību.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Pārskats", + "@overview": {}, + "notifyMeFor": "Paziņot man par", + "@notifyMeFor": {}, + "wrongRecoveryKey": "Atvaino... Nešķiet, ka šī būtu pareiza atkopšanas atslēga.", + "@wrongRecoveryKey": {}, + "block": "Izslēgt", + "@block": {}, + "hideMemberChangesInPublicChats": "Paslēpt dalībnieku izmaiņas publiskajās tērzēšanās", + "@hideMemberChangesInPublicChats": {}, + "passwordRecoverySettings": "Paroles atjaunošanas iestatījumi", + "@passwordRecoverySettings": {}, + "blockedUsers": "Atslēgtie lietotāji", + "@blockedUsers": {}, + "transparent": "Caurspīdīgs", + "@transparent": {}, + "searchForUsers": "Meklēt @lietotājus...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Lūgums ievadīt savu pašreizējo paroli", + "@pleaseEnterYourCurrentPassword": {}, + "publicSpaces": "Publiskas vietas", + "@publicSpaces": {}, + "decline": "Atteikt", + "@decline": {}, + "joinSpace": "Pievienoties vietai", + "@joinSpace": {}, + "createGroupAndInviteUsers": "Izveidot kopu un uzaicināt lietotājus", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Kopu var atrast meklēšanā", + "@groupCanBeFoundViaSearch": {}, + "commandHint_sendraw": "Nosūtīt neapstrādātu JSON", + "@commandHint_sendraw": {}, + "newPassword": "Jauna parole", + "@newPassword": {}, + "forwardMessageTo": "Pārsūtīt ziņu uz {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceipts": "Nosūtīt lasīšanas atskaites", + "@sendReadReceipts": {}, + "verifyOtherUser": "🔐 Apliecināt otru lietotāju", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Apliecināt otru ierīci", + "@verifyOtherDevice": {}, + "yourGlobalUserIdIs": "Vispārējais lietotāja Id ir: ", + "@yourGlobalUserIdIs": {}, + "select": "Atlasīt", + "@select": {}, + "initAppError": "Atgadījās kļūda lietotnes sāknēšanas laikā", + "@initAppError": {}, + "formattedMessages": "Formatētas ziņas", + "@formattedMessages": {}, + "canceledKeyVerification": "{sender} atcēla atslēgas apliecināšanu", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} pabeidza atslēgas apliecināšanu", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} pieprasīja atslēgas apliecināšanu", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} uzsāka atslēgas apliecināšanu", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "incomingMessages": "Ienākošās ziņas", + "@incomingMessages": {}, + "isReadyForKeyVerification": "{sender} ir gatavs atslēgas apliecināšanai", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "commandHint_unignore": "Atcelt norādītā Matrix Id neņemšanu vērā", + "@commandHint_unignore": {}, + "commandHint_ignore": "Neņemt vērā norādīto Matrix Id", + "@commandHint_ignore": {}, + "searchChatsRooms": "Meklēt #tērzēšanas, @lietotājus...", + "@searchChatsRooms": {}, + "groupName": "Kopas nosaukums", + "@groupName": {}, + "presenceStyle": "Klātesamība:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "youInvitedToBy": "📩 Tu tiki uzaicināts ar saiti:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "userWouldLikeToChangeTheChat": "{user} vēlas pievienoties tērzēšanai.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Vēl nav izveidota neviena publiska saite", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Pieklauvēt", + "@knock": {}, + "stickers": "Uzlīmes", + "@stickers": {}, + "usersMustKnock": "Lietotājiem jāpieklauvē", + "@usersMustKnock": {}, + "noOneCanJoin": "Neviens nevar pievienoties", + "@noOneCanJoin": {}, + "hidePresences": "Paslēpt stāvokļu sarakstu?", + "@hidePresences": {}, + "knocking": "Klauvē", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Tērzēšana var tikt atklāta ar meklēšanu {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "nothingFound": "Nekas netika atrasts...", + "@nothingFound": {}, + "startConversation": "Uzsākt sarunu", + "@startConversation": {}, + "databaseMigrationTitle": "Datubāze ir optimizēta", + "@databaseMigrationTitle": {}, + "leaveEmptyToClearStatus": "Atstāt tukšu, lai notīrītu savu stāvokli.", + "@leaveEmptyToClearStatus": {}, + "pleaseChooseAStrongPassword": "Lūgums izvēlēties spēcīgu paroli", + "@pleaseChooseAStrongPassword": {}, + "passwordIsWrong": "Ievadītā parole ir nepareiza", + "@passwordIsWrong": {}, + "publicLink": "Publiska saite", + "@publicLink": {}, + "thisDevice": "Šī ierīce:", + "@thisDevice": {}, + "acceptedKeyVerification": "{sender} apstiprināja atslēgas apliecināšanu", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "userRole": "Lietotāja loma", + "@userRole": {}, + "noDatabaseEncryption": "Šajā platformā datubāzes šifrēšana netiek nodrošināta", + "@noDatabaseEncryption": {}, + "presencesToggle": "Rādīt citu lietotāju stāvokļa ziņas", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "databaseMigrationBody": "Lūgums uzgaidīt. Tas var aizņemt kādu brīdi.", + "@databaseMigrationBody": {}, + "passwordsDoNotMatch": "Paroles nesakrīt", + "@passwordsDoNotMatch": {}, + "publicChatAddresses": "Publiskas tērzēšanas adreses", + "@publicChatAddresses": {}, + "createNewAddress": "Izveidot jaunu adresi", + "@createNewAddress": {}, + "minimumPowerLevel": "{level} ir zemākais spēka līmenis.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "discover": "Atklāt", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread} nelasītas tērzēšanas", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "subspace": "Apakšvieta", + "@subspace": {}, + "addChatOrSubSpace": "Pievienot tērzēšanu vai apakšvietu", + "@addChatOrSubSpace": {}, + "formattedMessagesDescription": "Attēlot bagātinātu ziņu saturu, piemēram, ar Markdown iezīmētu treknrakstu.", + "@formattedMessagesDescription": {}, + "databaseBuildErrorBody": "Nebija iespējams izveidot SQlite datubāzi. Lietotne pagaidām mēģina izmantot iepriekšējo datubāzi. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sessionLostBody": "Sesija ir zaudēta. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "verifyOtherUserDescription": "Ar cita lietotāja apliecināšanu vari pārliecināties, ka zini, kam Tu tiešām raksti. 💪\n\nKad uzsāc apliecināšanu, Tu un otrs lietotājs lietotnē redzēs uznirstošo logu. Tajā jūs redzēsiet dažādas emocijzīmes vai skaitļus, kas ir jāsalīdzina savā starpā.\n\nLabākais veids, kā to izdarīt, ir satikties vai uzsākt videozvanu. 👭", + "@verifyOtherUserDescription": {}, + "sendTypingNotificationsDescription": "Citi tērzēšanas dalībnieki var redzēt, kad raksti jaunu ziņu.", + "@sendTypingNotificationsDescription": {}, + "noUsersFoundWithQuery": "Diemžēl ar \"{query}\" netika atrasts neviens lietotājs. Lūgums pārbaudīt, vai ir pieļauta drukas kļūda.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "restoreSessionBody": "Lietotne tagad mēģina atjaunot sesiju no rezerves kopijas. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendReadReceiptsDescription": "Citi tērzēšanas dalībnieki var redzēt, kad izlasīji ziņu.", + "@sendReadReceiptsDescription": {}, + "thereAreCountUsersBlocked": "Šobrīd ir izslēgti {count} lietotāji.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "verifyOtherDeviceDescription": "Kad apliecini citu ierīci, šīs ierīces var apmainīt atslēgas, palielinot vispārējo drošību. 💪 Kad uzsāc apliecināšanu, abās ierīcēs lietotnē parādīsies uznirstošais logs. Tajā būs redzamas dažādas emocijzīmes vai skaitļi, kas jāsalīdzina abās ierīcēs. Vislabāk, ja abas ierīces ir pieejams, pirms tiek uzsākta apliecināšana. 🤳", + "@verifyOtherDeviceDescription": {}, + "swipeRightToLeftToReply": "Pavilkt pa labi, lai atbildētu", + "@swipeRightToLeftToReply": {}, + "searchIn": "Meklēt tērzēšanā \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Meklēt vairāk...", + "@searchMore": {}, + "gallery": "Galerija", + "@gallery": {}, + "files": "Datnes", + "@files": {}, + "restricted": "Ierobežots", + "@restricted": {}, + "knockRestricted": "Pieklauvēt ierobežotajiem", + "@knockRestricted": {}, + "sendCanceled": "Sūtīšana atcelta", + "@sendCanceled": {}, + "noChatsFoundHere": "Šeit vēl nav tērzēšanu. Jauna saruna ar kādu ir uzsākama ar zemāk esošo pogu. ⤵️", + "@noChatsFoundHere": {}, + "invitedBy": "📩 {user} uzaicināja", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "moderatorLevel": "{level} - Moderators", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Pārvaldītājs", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeTheVisibilityOfChatHistory": "Mainīt tērzēšanas vēstures redzamību", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Mainīt tērzēšanas galveno publisko adresi", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Sūtīt @istaba paziņojumus", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Mainīt tērzēšanas aprakstu", + "@changeTheDescriptionOfTheGroup": {}, + "alwaysUse24HourFormat": "nē", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "userLevel": "{level} - Lietotājs", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "goToSpace": "Doties uz vietu: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "changeGeneralChatSettings": "Mainīt vispārējos tērzēšanas iestatījumus", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Uzaicināt šajā tērzēšanā citus lietotājus", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Mainīt tērzēšanas atļaujas", + "@changeTheChatPermissions": {}, + "chatPermissionsDescription": "Noteikt, kurš spēka līmenis ir nepieciešams noteiktām darbībām šajā tērzēšanā. Spēka līmeņi 0, 50 un 100 parasti atbilst lietotājiem, moderatoriem un pārvaldītājiem, bet ir iespējams jebkāds iedalījums.", + "@chatPermissionsDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Neizskatās pēc saderīga mājasservera. Nepareizs URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "loginWithMatrixId": "Pieteikties ar Matrix-Id", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Atklāt mājasserverus", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Kas ir mājasserveris?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Visi lietotāja dati tiek glabāti mājasserverī, gluži kā ar e-pasta nodrošinātāju. Ir iespējams izvēlēties, kuru mājasserveri izmantot, saglabājot iespēju sazināties ar ikvienu. Vairāk var uzzināt https://matrix.org.", + "@homeserverDescription": {}, + "updateInstalled": "🎉 Atjauninājums {version} uzstādīts.", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Izmaiņu žurnāls", + "@changelog": {}, + "countChatsAndCountParticipants": "{chats} tērzēšanas un {participants} dalībnieki", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Vairs nav tērzēšanu...", + "@noMoreChatsFound": {}, + "joinedChats": "Tērzēšanas, kurās piedalos", + "@joinedChats": {}, + "unread": "Nelasītas", + "@unread": {}, + "space": "Vieta", + "@space": {}, + "spaces": "Vietas", + "@spaces": {}, + "markAsUnread": "Atzīmēt kā nelasītu", + "@markAsUnread": {}, + "sendingAttachment": "Nosūta pielikumu...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Izveido video sīktēlu...", + "@generatingVideoThumbnail": {}, + "sendingAttachmentCountOfCount": "Nosūta {index}. pielikumu no {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "Sasniegts servera ierobežojums. Gaida {seconds} sekundes...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "calculatingFileSize": "Aprēķina datnes lielumu...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Sagatavo pielikuma nosūtīšanu...", + "@prepareSendingAttachment": {}, + "compressVideo": "Saspiež video...", + "@compressVideo": {}, + "oneOfYourDevicesIsNotVerified": "Viena no ierīcēm nav apliecināta", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Piezīme: kad visas ierīces tiek savienotas ar tērzēšanas rezerves kopiju, tās tiek automātiski apliecinātas.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Turpināt", + "@continueText": {}, + "welcomeText": "Sveicieni! 👋 Šis ir FluffyChat. Tu vari pieteikties jebkurā mājasserverī, kas ir saderīgs ar https://matrix.org. Tad vari tērzēt ar ikvienu. Tas ir milzīgs decentralizētās saziņas tīkls!", + "@welcomeText": {}, + "blur": "Aizmiglojums:", + "@blur": {}, + "setWallpaper": "Iestatīt ekrāntapeti", + "@setWallpaper": {}, + "opacity": "Necaurredzamība:", + "@opacity": {}, + "manageAccount": "Pārvaldīt kontu", + "@manageAccount": {}, + "noContactInformationProvided": "Serveris nesniedz nekādu derīgu saziņas informāciju", + "@noContactInformationProvided": {}, + "serverInformation": "Informācija par serveri:", + "@serverInformation": {}, + "aboutHomeserver": "Par {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "contactServerAdmin": "Sazināties ar servera pārvaldītāju", + "@contactServerAdmin": {}, + "contactServerSecurity": "Sazināties ar servera drošības uzturētājiem", + "@contactServerSecurity": {}, + "supportPage": "Atbalsta lapa", + "@supportPage": {}, + "name": "Nosaukums", + "@name": {}, + "version": "Versija", + "@version": {}, + "website": "Tīmekļvietne", + "@website": {}, + "compressBeforeSending": "Saspiest pirms nosūtīšanas", + "@compressBeforeSending": {}, + "boldText": "Teksts treknrakstā", + "@boldText": {}, + "strikeThrough": "Pārsvītrots", + "@strikeThrough": {}, + "invalidUrl": "Nederīgs URL", + "@invalidUrl": {}, + "addLink": "Pievienot saiti", + "@addLink": {}, + "italicText": "Teksts slīprakstā", + "@italicText": {}, + "pleaseFillOut": "Lūgums aizpildīt", + "@pleaseFillOut": {}, + "sendUncompressed": "Sūtīt nesaspiestu", + "@sendUncompressed": {}, + "sendImages": "Nosūtīt {count} attēlu(s)", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Saspiest", + "@compress": {}, + "unableToJoinChat": "Nevarēja pievienoties tērzēšanai. Varbūt otra puse jau ir aizvērusi sarunu.", + "@unableToJoinChat": {} +} diff --git a/assets/l10n/intl_nb.arb b/assets/l10n/intl_nb.arb index 0033a08a3f..3835e0b762 100644 --- a/assets/l10n/intl_nb.arb +++ b/assets/l10n/intl_nb.arb @@ -22,11 +22,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Kontoinfo", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} skrudde på ende-til-ende -kryptering", "@activatedEndToEndEncryption": { "type": "text", @@ -34,11 +29,6 @@ "username": {} } }, - "addGroupDescription": "Legg til gruppebeskrivelse", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Administrator", "@admin": { "type": "text", @@ -54,11 +44,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Har du allerede en konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} besvarte anropet", "@answeredTheCall": { "type": "text", @@ -81,11 +66,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arkivert rom", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Skal gjester tillates å ta del", "@areGuestsAllowedToJoin": { "type": "text", @@ -101,21 +81,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel for å hurtiglagre nøklene.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "For å kunne signere den andre personen, skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel for å bekrefte økten din.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Godta denne bekreftelsesforespørselen fra {username}?", "@askVerificationRequest": { "type": "text", @@ -123,26 +93,6 @@ "username": {} } }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Spill av", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Identitetsbekreftelse", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar endret", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "banFromChat": "Bannlys fra sludring", "@banFromChat": { "type": "text", @@ -171,11 +121,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Nøkler hurtiglagret", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Avbryt", "@cancel": { "type": "text", @@ -290,21 +235,11 @@ "username": {} } }, - "changelog": "Endringslogg", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Endre passord", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Endringer lagret", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Endre hjemmetjener", "@changeTheHomeserver": { "type": "text", @@ -320,16 +255,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Endre tjeneren", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Endre bakgrunnsbilde", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "Krypteringen er skadet", "@channelCorruptedDecryptError": { "type": "text", @@ -360,16 +285,6 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Velg et brukernavn", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearText": "Tøm tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Lukk", "@close": { "type": "text", @@ -400,11 +315,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Kunne ikke koble til", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt invitert til gruppen", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -425,11 +335,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Innholdsviser", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Kopiert til utklippstavle", "@copiedToClipboard": { "type": "text", @@ -452,16 +357,6 @@ "error": {} } }, - "couldNotSetAvatar": "Kunne ikke sette avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kunne ikke sette visningsnavn", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} deltagere", "@countParticipants": { "type": "text", @@ -474,11 +369,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Opprett konto nå", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} opprettet sludringen", "@createdTheChat": { "type": "text", @@ -486,21 +376,6 @@ "username": {} } }, - "createNewGroup": "Opprett ny gruppe", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Videreformidling av tillit på", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Videreformidling av tillit på", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Aktiv nå", "@currentlyActive": { "type": "text", @@ -561,11 +436,6 @@ "type": "text", "placeholders": {} }, - "deny": "Nekt", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Enhet", "@device": { "type": "text", @@ -586,31 +456,11 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Forkast bilde", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Oppdag", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Oppdag grupper", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Visningsnavn endret", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Doner", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Last ned fil", "@downloadFile": { "type": "text", @@ -626,21 +476,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Rediger sludringstilganger", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Rediger visningsnavn", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Skriv inn Jitsi-instans", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "Rediger romavatar", "@editRoomAvatar": { "type": "text", @@ -706,21 +546,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Krypteringsalgoritme", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Kryptering er ikke påskrudd", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Ende-til-ende -krypteringsinnstillinger", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} avsluttet samtalen", "@endedTheCall": { "type": "text", @@ -728,21 +558,11 @@ "senderName": {} } }, - "enterAGroupName": "Skriv inn et gruppenavn", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Skriv inn en e-postadresse", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Skriv inn et brukernavn", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Skriv inn din hjemmetjener", "@enterYourHomeserver": { "type": "text", @@ -763,11 +583,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Filstørrelse", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -783,11 +598,6 @@ "type": "text", "placeholders": {} }, - "friday": "Fredag", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Fra å ta del", "@fromJoining": { "type": "text", @@ -803,16 +613,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Gruppebeskrivelse", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Gruppebeskrivelse endret", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Gruppen er offentlig", "@groupIsPublic": { "type": "text", @@ -863,11 +663,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Hjemmetjener ukompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Hvor støtende er innholdet?", "@howOffensiveIsThisContent": { "type": "text", @@ -893,16 +688,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Du kan ignorere brukere som forstyrrer deg. Du vil ikke lenger kunne motta meldinger eller rominvitasjoner fra brukere på din personlige ignoreringsliste.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorer brukernavn", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Jeg har klikket på lenken", "@iHaveClickedOnLink": { "type": "text", @@ -961,11 +746,6 @@ "link": {} } }, - "isDeviceKeyCorrect": "Er følgende enhetsnøkkel riktig?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "skriver…", "@isTyping": { "type": "text", @@ -983,16 +763,6 @@ "type": "text", "placeholders": {} }, - "keysCached": "Nøkler hurtiglagret", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Nøkler mangler", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, "kicked": "{username} kastet ut {targetName}", "@kicked": { "type": "text", @@ -1021,16 +791,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Sist kjente IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Sett for lenge siden", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Forlat", "@leave": { "type": "text", @@ -1085,21 +845,6 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Gjør til moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Gjør til admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Forsikre deg om at identifikatoren er gyldig", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Medlemsendringer", "@memberChanges": { "type": "text", @@ -1115,21 +860,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Meldingen vil bli fjernet for alle deltagere", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Mandag", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Forstum sludring", "@muteChat": { "type": "text", @@ -1165,16 +900,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Skru på videreformidling av tillit fra Element istedenfor.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Ingen beskrivelse", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Fant ingen smilefjes. 😕", "@noEmotesFound": { "type": "text", @@ -1185,11 +910,6 @@ "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Skru på nettbasert sikkerhetskopiering av nøkler fra Element istedenfor.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ingen", "@none": { "type": "text", @@ -1210,11 +930,6 @@ "type": "text", "placeholders": {} }, - "noStatusesFound": "Ingen statuser så langt.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Merknader", "@notifications": { "type": "text", @@ -1225,18 +940,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Ikke støttet på vev-versjonen", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} valgt", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} brukere skriver …", "@numUsersTyping": { "type": "text", @@ -1264,11 +967,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Nettbasert sikkerhetskopiering av nøkler avskrudd", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Nettbasert sikkerhetskopiering av nøkler på", "@onlineKeyBackupEnabled": { "type": "text", @@ -1289,21 +987,11 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "Gruppenavn (valgfritt)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "participant": "Deltager", "@participant": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "Deltagende brukerenheter", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "Passord eller gjenopprettingsnøkkel", "@passphraseOrKey": { "type": "text", @@ -1346,26 +1034,11 @@ "fileName": {} } }, - "pleaseChooseAUsername": "Velg et brukernavn", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Klikk på lenken i e-posten og fortsett.", "@pleaseClickOnLink": { "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Skriv inn en Matrix-ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Skriv inn din sikkerhetsnøkkel:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Skriv inn passordet ditt", "@pleaseEnterYourPassword": { "type": "text", @@ -1386,11 +1059,6 @@ "type": "text", "placeholders": {} }, - "publicKey": "Offentlig nøkkel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Offentlige rom", "@publicRooms": { "type": "text", @@ -1462,11 +1130,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Fjern melding", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Tegn rikt meldingsinnhold", "@renderRichContent": { "type": "text", @@ -1492,51 +1155,21 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Forespørsel om å lese eldre meldinger", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Trekk tilbake alle tilganger", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Rommet har blitt oppgradert", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "Lørdag", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "Søk", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Søk etter en sludring", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Sikkerhet", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Sikkerhetsnøkkel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Mistet sikkerhetsnøkkelen?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Sett av {username}", "@seenByUser": { "type": "text", @@ -1544,22 +1177,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Sett av {username} og {count} andre}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Sett av {username} og {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Send", "@send": { "type": "text", @@ -1575,11 +1192,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Tillat forsendelse av feilrapporter med sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Send fil", "@sendFile": { "type": "text", @@ -1647,31 +1259,11 @@ "senderName": {} } }, - "sentryInfo": "Personvernsinfo: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Økt bekreftet", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Sett et profilbilde", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "Sett tilpassede smilefjes", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "setGroupDescription": "Sett gruppebeskrivelse", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Sett invitasjonslenke", "@setInvitationLink": { "type": "text", @@ -1704,21 +1296,11 @@ "username": {} } }, - "signUp": "Registrer deg", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Hopp over", "@skip": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Lyd, LED-farge for vibrasjon", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Kildekode", "@sourceCode": { "type": "text", @@ -1731,11 +1313,6 @@ "senderName": {} } }, - "startYourFirstChat": "Start din første sludring :-)", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Status", "@status": { "type": "text", @@ -1751,21 +1328,11 @@ "type": "text", "placeholders": {} }, - "sunday": "Søndag", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "System", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "Trykk for å vise meny", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Samsvarer ikke", "@theyDontMatch": { "type": "text", @@ -1776,16 +1343,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Dette rommet har blitt arkivert.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Torsdag", - "@thursday": { - "type": "text", - "placeholders": {} - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1807,11 +1364,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Tirsdag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Utilgjengelig", "@unavailable": { "type": "text", @@ -1847,11 +1399,6 @@ "type": {} } }, - "unknownSessionVerify": "Ukjent økt. Bekreft den", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Opphev forstumming av sludring", "@unmuteChat": { "type": "text", @@ -1869,18 +1416,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} uleste meldinger}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Bruk AMOLED-kompatible farger?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} og {count} andre skriver…", "@userAndOthersAreTyping": { "type": "text", @@ -1916,11 +1451,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Ubekreftet bruker", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} sendte en {type}-hendelse", "@userSentUnknownEvent": { "type": "text", @@ -1929,31 +1459,11 @@ "type": {} } }, - "userUnknownVerification": "Bruker har ukjent bekreftelsesstatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Bekreftet bruker", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Økt bekreftet!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Bekreft", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Bekreft manuelt", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Start bekreftelse", "@verifyStart": { "type": "text", @@ -1969,11 +1479,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Bekreft bruker", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videosamtale", "@videoCall": { "type": "text", @@ -2014,21 +1519,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Ende-til-ende -kryptering er i beta. Bruk på egen risiko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Onsdag", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Velkommen til det søteste lynmeldingsprogrammet i Matrix-nettverket.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Du har fått en e-post", "@weSentYouAnEmail": { "type": "text", @@ -2069,43 +1559,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Du er invitert til denne sludringen", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Du deltar ikke lenger i denne sludringen", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Du kan ikke invitere deg selv", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Du har blitt bannlyst fra denne sludringen", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Ditt eget brukernavn", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Din offentlige nøkkel", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Du vil bli tilknyttet {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "toggleUnread": "Marker som lest/ulest", "@toggleUnread": { "type": "text", @@ -2121,44 +1589,18 @@ "type": "text", "placeholders": {} }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "noConnectionToTheServer": "Ingen tilkobling til tjeneren", "@noConnectionToTheServer": { "type": "text", "placeholders": {} }, - "pleaseEnterValidEmail": "Skriv inn en gyldig e-postadresse.", - "@pleaseEnterValidEmail": {}, "addEmail": "Legg til e-post", "@addEmail": { "type": "text", "placeholders": {} }, - "pleaseChooseAtLeastChars": "Vennligst velg minst {min} tegn.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "repeatPassword": "Gjenta passord", "@repeatPassword": {}, - "passwordsDoNotMatch": "Passordet samsvarer ikke!", - "@passwordsDoNotMatch": {}, - "addNewFriend": "Legg til en ny venn", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Legg til space", "@addToSpace": {}, "allChats": "Alle samtaler", @@ -2206,6 +1648,6 @@ "type": "text", "placeholders": {} }, - "yourUserId": "Din bruker ID:", - "@yourUserId": {} + "notAnImage": "Ikke en bildefil.", + "@notAnImage": {} } diff --git a/assets/l10n/intl_nl.arb b/assets/l10n/intl_nl.arb index ea5637b98b..9bc789c007 100644 --- a/assets/l10n/intl_nl.arb +++ b/assets/l10n/intl_nl.arb @@ -10,7 +10,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} heeft de uitnodiging geaccepteerd", + "acceptedTheInvitation": "👍 {username} heeft de uitnodiging geaccepteerd", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -22,12 +22,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Accountgegevens", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} heeft eind-tot-eindversleuteling geactiveerd", + "activatedEndToEndEncryption": "🔐 {username} heeft eind-tot-eindversleuteling geactiveerd", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -39,16 +34,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Voeg een groepsomschrijving toe", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Nieuwe vriend toevoegen", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Aan space toevoegen", "@addToSpace": {}, "admin": "Beheerder", @@ -71,11 +56,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Heb je al een account?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} heeft de oproep beantwoord", "@answeredTheCall": { "type": "text", @@ -98,11 +78,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Gearchiveerde Kamer", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Mogen gasten deelnemen", "@areGuestsAllowedToJoin": { "type": "text", @@ -118,21 +93,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Voer je chatback-up veiligheidswachtwoord of veiligheidssleutel in om de sleutels in de cache te bewaren.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om de andere persoon te kunnen ondertekenen.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om je sessie te verifiëren.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Accepteer je dit verificatieverzoek van {username}?", "@askVerificationRequest": { "type": "text", @@ -140,31 +105,11 @@ "username": {} } }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Afspelen", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authenticatie", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Automatisch geanimeerde stickers en emoticons afspelen", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar is gewijzigd", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "De homeserver ondersteunt de login types:\n{serverVersions}\nMaar deze app ondersteunt alleen:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -214,11 +159,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Sleutels in cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Annuleren", "@cancel": { "type": "text", @@ -340,21 +280,11 @@ "username": {} } }, - "changelog": "Wijzigingslogboek", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Wachtwoord wijzigen", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Wijzigingen zijn opgeslagen", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Homeserver wijzigen", "@changeTheHomeserver": { "type": "text", @@ -370,22 +300,12 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Server wijzigen", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Achtergrond wijzigen", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Je avatar veranderen", + "changeYourAvatar": "Jouw avatar veranderen", "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "channelCorruptedDecryptError": "De encryptie is beschadigd", + "channelCorruptedDecryptError": "De versleuteling is beschadigd", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} @@ -400,7 +320,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "Je chatback-up is beveiligd met een veiligheidssleutel. Zorg ervoor dat je deze niet verliest.", + "chatBackupDescription": "Je oude berichten zijn beveiligd met een herstelsleutel. Zorg ervoor dat je deze niet verliest.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -412,11 +332,6 @@ }, "chatHasBeenAddedToThisSpace": "Chat is toegevoegd aan deze space", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Chat is verwijderd uit deze space", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "Chats", "@chats": { "type": "text", @@ -427,18 +342,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Kies een inlognaam", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Archief wissen", "@clearArchive": {}, - "clearText": "Tekst wissen", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Sluiten", "@close": { "type": "text", @@ -459,7 +364,7 @@ "type": "text", "description": "Usage hint for the command /invite" }, - "commandHint_join": "Deelnemen aan de gegeven kamer", + "commandHint_join": "Deelnemen aan de kamer", "@commandHint_join": { "type": "text", "description": "Usage hint for the command /join" @@ -479,12 +384,12 @@ "type": "text", "description": "Usage hint for the command /me" }, - "commandHint_myroomavatar": "Je avatar voor deze kamer instellen (met mxc-uri)", + "commandHint_myroomavatar": "Jouw avatar voor deze kamer instellen (met mxc-uri)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" }, - "commandHint_myroomnick": "Je naam voor deze kamer instellen", + "commandHint_myroomnick": "Jouw naam voor deze kamer instellen", "@commandHint_myroomnick": { "type": "text", "description": "Usage hint for the command /myroomnick" @@ -526,12 +431,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Vergelijk of de volgende emoji overeenkomen met die van het andere apparaat:", + "compareEmojiMatch": "Vergelijk de emoji's", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Vergelijk of de volgende nummers overeenkomen met die van het andere apparaat:", + "compareNumbersMatch": "Vergelijk de cijfers", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -551,11 +456,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Verbindingspoging is mislukt", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Contact is voor de groep uitgenodigd", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -576,11 +476,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Contentvoorvertoning", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Gekopieerd naar klembord", "@copiedToClipboard": { "type": "text", @@ -596,23 +491,13 @@ "type": "text", "placeholders": {} }, - "couldNotDecryptMessage": "Kan het bericht niet decoderen: {error}", + "couldNotDecryptMessage": "Kan het bericht niet ontsleutelen: {error}", "@couldNotDecryptMessage": { "type": "text", "placeholders": { "error": {} } }, - "couldNotSetAvatar": "Kan avatar niet instellen", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kan naam niet instellen", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} personen", "@countParticipants": { "type": "text", @@ -625,38 +510,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Maak nu een account aan", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} heeft de chat gemaakt", + "createdTheChat": "💬 {username} heeft de chat gemaakt", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Nieuwe groep", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Nieuwe space", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Kruislings ondertekenen uitgeschakeld", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Kruislings ondertekenen ingeschakeld", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Momenteel actief", "@currentlyActive": { "type": "text", @@ -697,7 +562,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Standaardmachtigingsniveau", + "defaultPermissionLevel": "Standaard machtigingsniveau voor nieuwe personen", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -717,11 +582,6 @@ "type": "text", "placeholders": {} }, - "deny": "Weigeren", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Apparaat", "@device": { "type": "text", @@ -737,46 +597,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "De versleuteling is pas veilig als alle apparaten zijn geverifieerd.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Directe chats", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Afbeelding verwijderen", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Ontdekken", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Groepen ontdekken", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "De naam is gewijzigd", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Doneer", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Annuleer en vraag niet opnieuw", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Bestand downloaden", "@downloadFile": { "type": "text", @@ -792,21 +622,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Chatrechten wijzigen", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Naam wijzigen", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Jitsi-server wijzigen", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Kameraliassen wijzigen", "@editRoomAliases": { "type": "text", @@ -852,11 +672,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Schakel de chatback-up in om nooit de toegang tot je chats te verliezen.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Emoticonpakket overal inschakelen", "@enableEmotesGlobally": { "type": "text", @@ -882,21 +697,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Versleutelingsalgoritme", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Versleuteling is niet ingeschakeld", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Eind-tot-eindversleutelingsinstellingen", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} heeft het gesprek beëindigd", "@endedTheCall": { "type": "text", @@ -904,23 +709,11 @@ "senderName": {} } }, - "enterAGroupName": "Vul een groepsnaam in", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Voer een email in", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Vul een spacenaam in", - "@enterASpacepName": {}, - "enterAUsername": "Vul een inlognaam in", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Vul je homeserver in", "@enterYourHomeserver": { "type": "text", @@ -948,11 +741,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Bestandsgrootte", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -968,16 +756,6 @@ "type": "text", "placeholders": {} }, - "friday": "Vrijdag", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Vrienden", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Vanaf deelname", "@fromJoining": { "type": "text", @@ -998,16 +776,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Groepsomschrijving", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Groepsomschrijving gewijzigd", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Groep is openbaar", "@groupIsPublic": { "type": "text", @@ -1058,11 +826,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Homeserver is niet compatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Hoe beledigend is deze inhoud?", "@howOffensiveIsThisContent": { "type": "text", @@ -1088,16 +851,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Je kunt personen die je storen negeren. Je kunt geen berichten of kameruitnodigingen ontvangen van de personen op je negeerlijst.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Negeer persoon", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Ik heb op de link geklikt", "@iHaveClickedOnLink": { "type": "text", @@ -1113,11 +866,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Ongeldige email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Contact uitnodigen", "@inviteContact": { "type": "text", @@ -1135,7 +883,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} heeft {targetName} uitgenodigd", + "invitedUser": "📩 {username} heeft {targetName} uitgenodigd", "@invitedUser": { "type": "text", "placeholders": { @@ -1153,7 +901,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} heeft je uitgenodigd voor FluffyChat.\n1. Installeer FluffyChat: https://fluffychat.im\n2. Registreer of log in\n3. Open deze uitnodigingslink: {link}", + "inviteText": "{username} heeft je uitgenodigd voor FluffyChat.\n1. Bezoek https://fluffychat.im en installeer de app\n2. Registreer of log in\n3. Open deze uitnodigingslink:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -1161,17 +909,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Is de volgende apparaatsleutel correct?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "is aan het typen…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} is toegetreden tot de chat", + "joinedTheChat": "👋 {username} is toegetreden tot de chat", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1183,17 +926,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Er zitten sleutels in de cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Er zitten geen sleutels in de cache", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} heeft {targetName} verwijderd", + "kicked": "👞 {username} heeft {targetName} verwijderd", "@kicked": { "type": "text", "placeholders": { @@ -1201,7 +934,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} heeft {targetName} verwijderd en verbannen", + "kickedAndBanned": "🙅 {username} heeft {targetName} verwijderd en verbannen", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1221,16 +954,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Laatst bekende IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Lang geleden gezien", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Chat verlaten", "@leave": { "type": "text", @@ -1290,33 +1013,11 @@ "homeserver": {} } }, - "loginWith": "Inloggen met {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Uitloggen", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Maak moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Beheerder maken", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Zorg ervoor dat de identificatie geldig is", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Persoon wijzigingen", "@memberChanges": { "type": "text", @@ -1332,28 +1033,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Bericht wordt verwijderd voor alle personen", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Maandag", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Nog 1 gebeurtenis} other{Nog {count} gebeurtenissen}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Meldingen uitschakelen", "@muteChat": { "type": "text", @@ -1369,7 +1053,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nieuw bericht in FluffyChat", + "newMessageInFluffyChat": "💬 Nieuw bericht in FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1394,16 +1078,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat biedt momenteel geen ondersteuning voor het inschakelen van kruislings ondertekenen. Schakel het in vanuit Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Geen omschrijving", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Geen emoticons gevonden. 😕", "@noEmotesFound": { "type": "text", @@ -1414,7 +1088,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Het lijkt erop dat je geen Google-services op je telefoon hebt. Dat is een goede beslissing voor je privacy! Om pushmeldingen in FluffyChat te ontvangen raden we je https://microg.org/ of https://unifiedpush.org aan.", + "noGoogleServicesWarning": "Firebase Cloud Messaging lijkt niet beschikbaar op je apparaat. Om nog steeds meldingen te krijgen, adviseren we om ntfy te installeren. Met ntfy of een andere Unified Push provider kun je meldingen ontvangen op een veilige manier. Je kunt ntfy downloaden van de PlayStore of van F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1427,11 +1101,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Zet in plaats daarvan de online sleutelback-up aan vanuit Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Geen", "@none": { "type": "text", @@ -1447,21 +1116,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Geen openbare kamers gevonden…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Geen kamers gevonden …", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Geen statussen gevonden tot nu toe.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notificaties", "@notifications": { "type": "text", @@ -1472,18 +1131,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Niet ondersteund in web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} geselecteerd", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} personen typen…", "@numUsersTyping": { "type": "text", @@ -1516,11 +1163,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Online sleutelback-up is uitgeschakeld", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Online sleutelback-up is ingeschakeld", "@onlineKeyBackupEnabled": { "type": "text", @@ -1551,16 +1193,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "Je e-mailadres (optioneel)", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "Groepsnaam (optioneel)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Of", "@or": { "type": "text", @@ -1571,11 +1203,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Deelnemende apparaten", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "wachtwoordzin of herstelsleutel", "@passphraseOrKey": { "type": "text", @@ -1623,7 +1250,7 @@ "fileName": {} } }, - "pleaseChoose": "Kies", + "pleaseChoose": "Maak een keuze", "@pleaseChoose": { "type": "text", "placeholders": {} @@ -1633,11 +1260,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Kies een inlognaam", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Klik op de link in de email en ga dan verder.", "@pleaseClickOnLink": { "type": "text", @@ -1648,17 +1270,7 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Voer een Matrix ID in.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Voer je veiligheidsssleutel in:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Voer je wachtwoord in", + "pleaseEnterYourPassword": "Voer jouw wachtwoord in", "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} @@ -1683,26 +1295,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Publieke Groepen", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Publieke sleutel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Publieke Kamers", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Publieke space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Meldingsinstellingen", "@pushRules": { "type": "text", @@ -1725,7 +1322,7 @@ "username": {} } }, - "redactMessage": "Verwijder", + "redactMessage": "Aangepast bericht", "@redactMessage": { "type": "text", "placeholders": {} @@ -1735,7 +1332,7 @@ "type": "text", "placeholders": {} }, - "reject": "Weigeren", + "reject": "Afwijzen", "@reject": { "type": "text", "placeholders": {} @@ -1779,12 +1376,7 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Verwijder bericht", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Je avatar verwijderen", + "removeYourAvatar": "Jouw avatar verwijderen", "@removeYourAvatar": { "type": "text", "placeholders": {} @@ -1814,16 +1406,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Vraag om oudere berichten te lezen", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Alle machtigingen intrekken", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Kamer is geüpgrade", "@roomHasBeenUpgraded": { "type": "text", @@ -1834,53 +1416,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Zaterdag", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Bestand opgeslagen als {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Bestand opslaan", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Bestand opslaan in deze map", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Zoeken", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Zoek een chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Beveiliging", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Veiligheidssleutel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Veiligheidssleutel verloren?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Gezien door {username}", "@seenByUser": { "type": "text", @@ -1888,22 +1438,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Gezien door {username} en {count} anderen}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Gezien door {username} en {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Verstuur", "@send": { "type": "text", @@ -1923,11 +1457,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Bugrapporten met sentry.io versturen", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Bestand versturen", "@sendFile": { "type": "text", @@ -1958,35 +1487,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} heeft een bestand verzonden", + "sentAFile": "📁 {username} heeft een bestand verzonden", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} heeft een audio verzonden", + "sentAnAudio": "🎤 {username} heeft een audio verzonden", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} heeft een afbeelding verzonden", + "sentAPicture": "🖼️ {username} heeft een afbeelding verzonden", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} heeft een sticker verzonden", + "sentASticker": "😊 {username} heeft een sticker verzonden", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} heeft een video verzonden", + "sentAVideo": "🎥 {username} heeft een video verzonden", "@sentAVideo": { "type": "text", "placeholders": { @@ -2000,36 +1529,16 @@ "senderName": {} } }, - "sentryInfo": "Informatie over je privacy: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessie is geverifieerd", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Profielfoto instellen", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Instellen als hoofdalias", + "setAsCanonicalAlias": "Als hoofdalias instellen", "@setAsCanonicalAlias": { "type": "text", "placeholders": {} }, - "setCustomEmotes": "Aangepaste emoticons inschakelen", + "setCustomEmotes": "Aangepaste emoticons instellen", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "setGroupDescription": "Stel een groepsomschrijving in", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Uitnodigingslink instellen", "@setInvitationLink": { "type": "text", @@ -2072,11 +1581,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Registreren", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Eenmalig Inloggen", "@singlesignon": { "type": "text", @@ -2087,11 +1591,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Geluid, vibratie LED-kleur", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Broncode", "@sourceCode": { "type": "text", @@ -2114,31 +1613,21 @@ "senderName": {} } }, - "startYourFirstChat": "Start nu je eerste chat! 🙂\n- Tik op Nieuwe chat\n- Scan de QR-code van een vriend\n- Veel plezier met chatten", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Status", "@status": { "type": "text", "placeholders": {} }, - "statusExampleMessage": "Hoe gaat het met je vandaag?", + "statusExampleMessage": "Hoe gaat het met jouw vandaag?", "@statusExampleMessage": { "type": "text", "placeholders": {} }, - "submit": "Verstuur", + "submit": "Indienen", "@submit": { "type": "text", "placeholders": {} }, - "sunday": "Zondag", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Synchroniseren... Even geduld.", "@synchronizingPleaseWait": { "type": "text", @@ -2149,21 +1638,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Tik op een apparaat om te verifiëren", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tik om afbeelding weer te geven", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tik om menu weer te geven", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Ze komen niet overeen", "@theyDontMatch": { "type": "text", @@ -2174,26 +1648,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Deze kamer is gearchiveerd.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Donderdag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}.{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2230,11 +1684,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Dinsdag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Niet beschikbaar", "@unavailable": { "type": "text", @@ -2270,16 +1719,6 @@ "type": {} } }, - "unknownSessionVerify": "Onbekende sessie, verifieer a.j.b.", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Chatback-up ontgrendelen", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Meldingen inschakelen", "@unmuteChat": { "type": "text", @@ -2297,18 +1736,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 ongelezen bericht} other{{unreadEvents} ongelezen berichten}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED-compatibele kleuren gebruiken?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} en {count} anderen zijn aan het typen …", "@userAndOthersAreTyping": { "type": "text", @@ -2332,7 +1759,7 @@ "username": {} } }, - "userLeftTheChat": "{username} is vertrokken uit de chat", + "userLeftTheChat": "🚪 {username} is vertrokken uit de chat", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2344,11 +1771,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Persoon is niet geverifieerd", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} heeft een {type} -gebeurtenis gestuurd", "@userSentUnknownEvent": { "type": "text", @@ -2357,36 +1779,16 @@ "type": {} } }, - "userUnknownVerification": "Persoon heeft een onbekende verificatiestatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Persoon is geverifieerd", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Geverifieerd", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Succesvol geverifieerde sessie!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verifieer", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Handmatig verifiëren", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Verificatie starten", "@verifyStart": { "type": "text", @@ -2402,11 +1804,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifieer Persoon", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videogesprek", "@videoCall": { "type": "text", @@ -2447,7 +1844,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Achtergrond", + "wallpaper": "Achtergrond:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2457,21 +1854,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Eind-tot-eindversleuteling bevindt zich momenteel in beta! Gebruik op eigen risico!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Woensdag", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Welkom bij de schattigste instant messenger in het Matrix-netwerk.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "We hebben je een email gestuurd", "@weSentYouAnEmail": { "type": "text", @@ -2492,7 +1874,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Wil je de chatback-up wissen en een nieuwe veiligheidssleutel te maken?", + "wipeChatBackup": "Wil je de chatback-up wissen om een nieuwe herstelsleutel te kunnen maken?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2517,76 +1899,29 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Je bent uitgenodigd voor deze chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Je neemt niet langer deel aan deze chat", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Je kunt jezelf niet uitnodigen", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Je bent verbannen uit deze chat", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Je chats worden gesynchroniseerd…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Je eigen gebruikersnaam", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Je publieke sleutel", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Je wordt verbonden met {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Inzoomen", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Uitzoomen", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "scanQrCode": "QR-code scannen", "@scanQrCode": {}, - "typeInInviteLinkManually": "Type de uitnodigingslink in...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Deel je uitnodigingslink", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Scan de QR-code of deel je uitnodigingslink als je niet naast elkaar zit.", - "@createNewChatExplaination": {}, "sendOnEnter": "Verstuur met enter", "@sendOnEnter": {}, "homeserver": "Server", "@homeserver": {}, "serverRequiresEmail": "Deze server wil je email laten bevestigen bij de registratie.", "@serverRequiresEmail": {}, - "newUsernameDescription": "Je persoon-id heeft dan het formaat @naam:server", - "@newUsernameDescription": {}, - "newPasswordDescription": "Om je wachtwoord te kunnen resetten moet je een email toevoegen aan je account.", - "@newPasswordDescription": {}, "oneClientLoggedOut": "Één van jouw apparaten is uitgelogd", "@oneClientLoggedOut": {}, "enableMultiAccounts": "(BETA) Multi-accounts inschakelen op dit apparaat", @@ -2603,31 +1938,12 @@ "@addAccount": {}, "link": "Link", "@link": {}, - "setupChatBackup": "Chat back-up instellen", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Ik heb de sleutel opgeschreven", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Uw chat back-up is ingesteld.", + "yourChatBackupHasBeenSetUp": "Jouw chatback-up is ingesteld.", "@yourChatBackupHasBeenSetUp": {}, - "yourUserId": "Uw persoon-ID:", - "@yourUserId": {}, - "setupChatBackupDescription": "Om je berichten te beschermen genereren we een veiligheidssleutel voor jouw.\nBewaar deze op een veilig plek, bijvoorbeeld in een wachtwoordmanager.", - "@setupChatBackupDescription": {}, "unverified": "Niet geverifieerd", "@unverified": {}, - "passwordsDoNotMatch": "Wachtwoorden komen niet overeen!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Voor een geldige email in.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Wachtwoord herhalen", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Kies een wachtwoord met minimaal {min} tekens.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageInfo": "Berichtinfo", "@messageInfo": {}, "time": "Tijd", @@ -2640,20 +1956,10 @@ "@openGallery": {}, "addToSpaceDescription": "Selecteer een space om deze chat aan toe te voegen.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Inloggen met één klik", - "@loginWithOneClick": {}, "removeFromSpace": "Uit de space verwijderen", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Dit verwijdert deze chat uit de huidige space. Het zal dan nog steeds zichtbaar zijn onder \"Alle chats\".", - "@removeFromSpaceDescription": {}, "start": "Start", "@start": {}, - "setupChatBackupNow": "Stel je chat back-up nu in", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Sla je veiligheidssleutel nu op", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Om je chat back-up te ontgrendelen, voer je veiligheidssleutel in die je gemaakt hebt in de vorige sessie. Je veiligheidssleutel is NIET je wachtwoord.", - "@pleaseEnterSecurityKeyDescription": {}, "commandHint_clearcache": "Cache wissen", "@commandHint_clearcache": { "type": "text", @@ -2679,12 +1985,6 @@ "type": "text", "placeholders": {} }, - "yourStory": "Jouw verhaal", - "@yourStory": {}, - "replyHasBeenSent": "Antwoord is verzonden", - "@replyHasBeenSent": {}, - "whoCanSeeMyStories": "Wie kan mijn verhalen zien?", - "@whoCanSeeMyStories": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2692,37 +1992,8 @@ "size": {} } }, - "addToStory": "Toevoegen aan verhaal", - "@addToStory": {}, "publish": "Publiceren", "@publish": {}, - "unsubscribeStories": "Verhalen afmelden", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Deze persoon heeft nog niets in zijn verhaal geplaatst", - "@thisUserHasNotPostedAnythingYet": {}, - "storyFrom": "Verhaal van {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Houd er rekening mee dat personen elkaar in je verhaal kunnen zien en contact met elkaar kunnen opnemen.", - "@whoCanSeeMyStoriesDesc": {}, - "bubbleSize": "Bubbelgrootte", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Hoe gaat het nu?", - "@whatIsGoingOn": {}, - "addDescription": "Omschrijving toevoegen", - "@addDescription": {}, - "storyPrivacyWarning": "Houd er rekening mee dat personen elkaar kunnen zien en contacteren in je verhaal. Je verhalen zijn 24 uur zichtbaar, maar er is geen garantie dat ze van alle apparaten en servers worden verwijderd.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Ik begrijp het", - "@iUnderstand": {}, "dismiss": "Sluiten", "@dismiss": {}, "markAsRead": "Markeer als gelezen", @@ -2731,12 +2002,6 @@ "@reportUser": {}, "openChat": "Chat openen", "@openChat": {}, - "matrixWidgets": "Matrix Widgets", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Widgets en integraties wijzigen is nog niet mogelijk.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Widgets en integraties wijzigen", - "@editIntegrations": {}, "reactedWith": "{sender} reageerde met {reaction}", "@reactedWith": { "type": "text", @@ -2759,8 +2024,6 @@ "@videoCallsBetaWarning": {}, "voiceCall": "Spraakoproep", "@voiceCall": {}, - "pinnedEventsError": "Fout bij laden van vastgemaakte berichten", - "@pinnedEventsError": {}, "confirmEventUnpin": "Weet je zeker dat je de gebeurtenis definitief wilt losmaken?", "@confirmEventUnpin": {}, "experimentalVideoCalls": "Videogesprekken (experimenteel)", @@ -2782,7 +2045,7 @@ "@widgetCustom": {}, "widgetName": "Naam", "@widgetName": {}, - "widgetUrlError": "Dit is geen geldige URL.", + "widgetUrlError": "Dit is geen geldige link.", "@widgetUrlError": {}, "widgetNameError": "Geef een naam op.", "@widgetNameError": {}, @@ -2796,19 +2059,12 @@ "@widgetVideo": {}, "widgetEtherpad": "Tekstnotitie", "@widgetEtherpad": {}, - "editWidgets": "Widgets wijzigen", - "@editWidgets": {}, - "separateChatTypes": "Gescheiden directe chats, groepen en spaces", + "separateChatTypes": "Gescheiden directe chats en groepen", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Toon gerelateerde directe chats in spaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youAcceptedTheInvitation": "Je hebt de uitnodiging geaccepteerd", + "youAcceptedTheInvitation": "👍 Je hebt de uitnodiging geaccepteerd", "@youAcceptedTheInvitation": {}, "youRejectedTheInvitation": "Je hebt de uitnodiging afgewezen", "@youRejectedTheInvitation": {}, @@ -2826,25 +2082,25 @@ "user": {} } }, - "youInvitedBy": "Je bent uitgenodigd door {user}", + "youInvitedBy": "📩 Je bent uitgenodigd door {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "Je hebt {user} uitgenodigd", + "youInvitedUser": "📩 Je hebt {user} uitgenodigd", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "Je hebt {user} weggestuurd", + "youKicked": "👞 Je hebt {user} weggestuurd", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Je hebt weggestuurd en verbannen {user}", + "youKickedAndBanned": "🙅 Je hebt weggestuurd en verbannen {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2856,8 +2112,484 @@ "user": {} } }, - "showSpaces": "Spaces-lijst tonen", - "@showSpaces": {}, - "noEmailWarning": "Voer een geldig e-mailadres in. Anders kan je je wachtwoord niet opnieuw instellen. Als je dat niet wilt, tik je nogmaals op de knop om door te gaan.", - "@noEmailWarning": {} + "recoveryKey": "Herstelsleutel", + "@recoveryKey": {}, + "recoveryKeyLost": "Herstelsleutel verloren?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKey": "Voer jouw herstelsleutel in:", + "@pleaseEnterRecoveryKey": {}, + "users": "Personen", + "@users": {}, + "unlockOldMessages": "Oude berichten ontgrendelen", + "@unlockOldMessages": {}, + "storeInAndroidKeystore": "In Android KeyStore opslaan", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "In Apple KeyChain opslaan", + "@storeInAppleKeyChain": {}, + "saveKeyManuallyDescription": "Sla deze sleutel handmatig op via delen of het klembord.", + "@saveKeyManuallyDescription": {}, + "pleaseEnterRecoveryKeyDescription": "Om je oude berichten te ontgrendelen voer je jouw herstelsleutel in die gemaakt is in je vorige sessie. Je sleutel is niet je wachtwoord.", + "@pleaseEnterRecoveryKeyDescription": {}, + "storeInSecureStorageDescription": "Sla de herstelsleutel op in de beveiligde opslag van dit apparaat.", + "@storeInSecureStorageDescription": {}, + "storeSecurlyOnThisDevice": "Veilig opslaan op dit apparaat", + "@storeSecurlyOnThisDevice": {}, + "dehydrate": "Sessie exporteren en apparaat wissen", + "@dehydrate": {}, + "dehydrateWarning": "Deze actie kan niet ongedaan worden gemaakt. Zorg ervoor dat je het back-upbestand veilig opslaat.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR-sessies: Exporteer sessie", + "@dehydrateTor": {}, + "dehydrateTorLong": "Voor TOR-sessies is het aanbevolen de sessie te exporteren alvorens het venster te sluiten.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR-sessie: Importeren sessie export", + "@hydrateTor": {}, + "hydrateTorLong": "Heb je de vorige keer jouw sessie geëxporteerd met TOR? Importeer het dan snel en ga verder met chatten.", + "@hydrateTorLong": {}, + "hydrate": "Herstellen vanuit back-upbestand", + "@hydrate": {}, + "indexedDbErrorTitle": "Problemen met privémodus", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "Het opslaan van berichten is helaas niet standaard ingeschakeld in de privémodus.\nBezoek alsjeblieft\n - about:config\n - stel dom.indexedDB.privateBrowsing.enabled in op true\nAnders is het niet mogelijk om FluffyChat op te starten.", + "@indexedDbErrorLong": {}, + "countFiles": "{count} bestanden", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "user": "Persoon", + "@user": {}, + "custom": "Aangepast", + "@custom": {}, + "confirmMatrixId": "Bevestig jouw Matrix-ID om je account te verwijderen.", + "@confirmMatrixId": {}, + "supposedMxid": "Dit moet {mxid} zijn", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasdm": "Markeer als privéberichtenkamer voor Matrix ID", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Markeer als groep", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Waarom is dit bericht onleesbaar?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Dit kan gebeuren als het bericht is verzonden voordat je bij je account op dit apparaat hebt aangemeld.\n\nHet is ook mogelijk dat de afzender je apparaat heeft geblokkeerd of dat er iets mis is gegaan met de internetverbinding.\n\nKan je het bericht wel lezen op een andere sessie? Dan kan je het bericht daarvandaan overzetten! Ga naar Instellingen > Apparaten en zorg ervoor dat je apparaten elkaar hebben geverifieerd. Wanneer je de kamer de volgende keer opent en beide sessies op de voorgrond staan, zullen de sleutels automatisch worden verzonden.\n\nWil je de sleutels niet verliezen als je uitlogt of van apparaat wisselt? Zorg er dan voor dat je de chatback-up hebt aangezet in de instellingen.", + "@noKeyForThisMessage": {}, + "enterSpace": "Space betreden", + "@enterSpace": {}, + "allSpaces": "Alle spaces", + "@allSpaces": {}, + "foregroundServiceRunning": "Deze melding verschijnt wanneer de voorgronddienst draait.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "scherm delen", + "@screenSharingTitle": {}, + "screenSharingDetail": "Je deelt je scherm in FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Telefoon-rechten", + "@callingPermissions": {}, + "callingAccount": "Telefoon-account", + "@callingAccount": {}, + "callingAccountDetails": "Hiermee kan FluffyChat de Android telefoon-app gebruiken.", + "@callingAccountDetails": {}, + "appearOnTop": "Bovenaan verschijnen", + "@appearOnTop": {}, + "appearOnTopDetails": "Laat de app bovenaan verschijnen (niet nodig als je FluffyChat al hebt ingesteld als een belaccount)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microfoon, camera en andere FluffyChat-rechten", + "@otherCallingPermissions": {}, + "newGroup": "Nieuwe groep", + "@newGroup": {}, + "newSpace": "Nieuwe space", + "@newSpace": {}, + "enterRoom": "Kamer betreden", + "@enterRoom": {}, + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Onbelangrijke statusgebeurtenissen verbergen", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Niet meer tonen", + "@doNotShowAgain": {}, + "googlyEyesContent": "{senderName} stuurt je wiebelogen", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "Wat wiebelogen versturen", + "@commandHint_googly": {}, + "commandHint_cuddle": "Een knuffel versturen", + "@commandHint_cuddle": {}, + "commandHint_hug": "Een knuffel versturen", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} knuffelt je", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} omhelst je", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "wasDirectChatDisplayName": "Lege chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "disableEncryptionWarning": "Om veiligheidsredenen kun je versleuteling niet uitschakelen in een chat, waar deze eerder is ingeschakeld.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Sorry, dat is niet mogelijk", + "@sorryThatsNotPossible": {}, + "reopenChat": "Chat heropenen", + "@reopenChat": {}, + "encryptThisChat": "Versleutel deze chat", + "@encryptThisChat": {}, + "deviceKeys": "Apparaatsleutels:", + "@deviceKeys": {}, + "startFirstChat": "Begin je eerste chat", + "@startFirstChat": {}, + "newSpaceDescription": "Met spaces kun je je chats samenvoegen en privé- of openbare community's bouwen.", + "@newSpaceDescription": {}, + "noOtherDevicesFound": "Geen andere apparaten gevonden", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Waarschuwing! Zonder de chatback-up in te schakelen, verlies je de toegang tot je versleutelde berichten. Het is sterk aanbevolen om eerst de chatback-up in te schakelen voordat je uitlogt.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "De server meldt dat het bestand te groot is om te verzenden.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Het bestand is opgeslagen op {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Spring naar het laatst gelezen bericht", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Lees tot hier", + "@readUpToHere": {}, + "jump": "Spring", + "@jump": {}, + "openLinkInBrowser": "Link in browser openen", + "@openLinkInBrowser": {}, + "allRooms": "Alle groepschats", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "signInWith": "Aanmelden met {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Geen afbeeldingsbestand.", + "@notAnImage": {}, + "importNow": "Nu importeren", + "@importNow": {}, + "importEmojis": "Emoji's importeren", + "@importEmojis": {}, + "importFromZipFile": "Uit zip-bestand importeren", + "@importFromZipFile": {}, + "exportEmotePack": "Emote-pakket als zip exporteren", + "@exportEmotePack": {}, + "replace": "Vervang", + "@replace": {}, + "report": "rapporteer", + "@report": {}, + "reportErrorDescription": "😭 Oh nee. Er is iets misgegaan. Probeer het later nog eens. Als je wilt, kun je de bug rapporteren aan de ontwikkelaars.", + "@reportErrorDescription": {}, + "sendTypingNotifications": "Typemeldingen verzenden", + "@sendTypingNotifications": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Probeer het later nog eens of kies een andere server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWithPassword": "Aanmelden met wachtwoord", + "@signInWithPassword": {}, + "chatPermissions": "Chat toestemmingen", + "@chatPermissions": {}, + "chatDescription": "Chatbeschrijving", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Chatbeschrijving gewijzigd", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Nog geen chatbeschrijving gemaakt.", + "@noChatDescriptionYet": {}, + "tryAgain": "Opnieuw proberen", + "@tryAgain": {}, + "redactMessageDescription": "Het bericht zal worden aangepast voor alle deelnemers in dit gesprek. Dit kan niet ongedaan gemaakt worden.", + "@redactMessageDescription": {}, + "redactedByBecause": "Aangepast door {username}, reden: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "profileNotFound": "De persoon kan niet gevonden worden op de server. Misschien is er een verbindingsprobleem of de persoon bestaat niet.", + "@profileNotFound": {}, + "createGroup": "Groep aanmaken", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Wil je {contact} uitnodigingen voor de chat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "optionalRedactReason": "(Optioneel) Reden voor aanpassing van dit bericht...", + "@optionalRedactReason": {}, + "addChatDescription": "Voeg een chatbeschrijving toe...", + "@addChatDescription": {}, + "invalidServerName": "Foute servernaam", + "@invalidServerName": {}, + "messagesStyle": "Berichten:", + "@messagesStyle": {}, + "shareInviteLink": "Uitnodigingslink delen", + "@shareInviteLink": {}, + "redactedBy": "Aangepast door {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "Directe chat", + "@directChat": {}, + "setChatDescription": "Chatbeschrijving instellen", + "@setChatDescription": {}, + "setTheme": "Thema instellen:", + "@setTheme": {}, + "setColorTheme": "Kleurthema instellen:", + "@setColorTheme": {}, + "invite": "Uitnodigen", + "@invite": {}, + "inviteGroupChat": "📨 Groeps-chat uitnodiging", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Privé-chat uitnodiging", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Recent-gebruikte emoticons zullen hier verschijnen...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "Ongeldige invoer!", + "@invalidInput": {}, + "wrongPinEntered": "Verkeerde pin ingevoerd! Probeer het nog eens over {seconds} seconden...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "banUserDescription": "De persoon zal worden verbannen van de chat en kan niet meer toetreden totdat de verbanning is opgeheven.", + "@banUserDescription": {}, + "removeDevicesDescription": "Je wordt op dit apparaat uitgelogd en zal niet langer in staat zijn om berichten te ontvangen.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "De persoon zal weer in staat zijn om de chat te betreden als ze het proberen.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Meldingen zijn niet beschikbaar", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Wanneer je deze persoon beheerder maakt kun je dit niet ongedaan maken als jullie dezelfde rechten hebben.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "De chat zal naar het archief worden verplaatst. Andere personen zullen in staat zijn te zien dat je de chat hebt verlaten.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} heeft geklopt", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Lees meer", + "@learnMore": {}, + "roomUpgradeDescription": "De chat zal dan opnieuw gemaakt worden met de nieuwe kamerversie. Alle deelnemers worden geïnformeerd dat ze moeten overstappen naar de nieuwe chat. Je kan meer lezen over kamerversies op https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Vul een getal in groter dan 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "De persoon is verwijderd uit de chat, maar is niet verbannen. In publieke chats kan de persoon op elk moment opnieuw deelnemen.", + "@kickUserDescription": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "joinSpace": "Deelname aan space", + "@joinSpace": {}, + "block": "Blokkeren", + "@block": {}, + "blockedUsers": "Geblokkeerde personen", + "@blockedUsers": {}, + "presenceStyle": "Aanwezigheid:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "searchChatsRooms": "Zoek naar #chats, @personen...", + "@searchChatsRooms": {}, + "swipeRightToLeftToReply": "Veeg van rechts naar links om te reageren", + "@swipeRightToLeftToReply": {}, + "calls": "Gesprekken", + "@calls": {}, + "customEmojisAndStickers": "Aangepaste emojis and stickers", + "@customEmojisAndStickers": {}, + "accessAndVisibilityDescription": "Wie mag meedoen in deze chat en hoe de chat ontdekt kan worden.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "Voeg toe of deel aangepaste emojis of stickers die gebruikt kunnen worden in elke chat.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Verberg verwijderde berichten", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Als iemand een bericht verwijdert, is dit bericht niet meer zichtbaar in de chat.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Verberg ongeldige of onbekende berichtformaten", + "@hideInvalidOrUnknownMessageFormats": {}, + "passwordRecoverySettings": "Wachtwoord herstel instellingen", + "@passwordRecoverySettings": {}, + "youInvitedToBy": "📩 Je bent uitgenodigd via een link voor:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "knock": "Kloppen", + "@knock": {}, + "overview": "Overzicht", + "@overview": {}, + "hidePresences": "Verberg Status Lijst?", + "@hidePresences": {}, + "noOneCanJoin": "Niemand kan deelnemen", + "@noOneCanJoin": {}, + "yourGlobalUserIdIs": "Je globale gebruikers-ID is: ", + "@yourGlobalUserIdIs": {}, + "appLockDescription": "Vergendel de app wanneer het niet gebruikt wordt met een pincode", + "@appLockDescription": {}, + "globalChatId": "Globale chat ID", + "@globalChatId": {}, + "accessAndVisibility": "Toegang en zichtbaarheid", + "@accessAndVisibility": {}, + "invitedBy": "📩 Uitgenodigd door: {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "publicSpaces": "Publieke spaces", + "@publicSpaces": {}, + "blockUsername": "Negeer gebruikersnaam", + "@blockUsername": {}, + "publicChatAddresses": "Publieke chat adressen", + "@publicChatAddresses": {}, + "createNewAddress": "Creëer nieuw adres", + "@createNewAddress": {}, + "countChatsAndCountParticipants": "{chats} chats en {participants} deelnemers", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Geen chats gevonden...", + "@noMoreChatsFound": {}, + "joinedChats": "Deelnemende chats", + "@joinedChats": {}, + "knocking": "Kloppen", + "@knocking": {}, + "space": "Space", + "@space": {}, + "spaces": "Spaces", + "@spaces": {}, + "unread": "Zet als ongelezen", + "@unread": {}, + "databaseBuildErrorBody": "Het aanmaken van de SQlite database is mislukt. De app probeert nu een traditionele database te gebruiken. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze {url}. De foutmelding is: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "groupName": "Groepsnaam", + "@groupName": {}, + "changeGeneralChatSettings": "Wijzig algemene chat instellingen", + "@changeGeneralChatSettings": {}, + "restricted": "Beperkt", + "@restricted": {}, + "searchForUsers": "Zoek naar @personen...", + "@searchForUsers": {}, + "searchMore": "Zoek meer...", + "@searchMore": {}, + "noPublicLinkHasBeenCreatedYet": "Publieke link is nog niet gecreëerd", + "@noPublicLinkHasBeenCreatedYet": {}, + "groupCanBeFoundViaSearch": "Groep kan gevonden worden via zoeken", + "@groupCanBeFoundViaSearch": {}, + "searchIn": "Zoek in chat \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "files": "Bestanden", + "@files": {}, + "unreadChatsInApp": "{appname}: {unread} ongelezen chats", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "noDatabaseEncryption": "Database versleuteling is niet ondersteund op dit platform", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Nu zijn er {count} personen geblokkeerd.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "markAsUnread": "Markeer als ongelezen", + "@markAsUnread": {}, + "userLevel": "{level} - Persoon", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "stickers": "Stickers", + "@stickers": {}, + "nothingFound": "Niets gevonden...", + "@nothingFound": {}, + "gallery": "Gallerij", + "@gallery": {}, + "transparent": "Transparant", + "@transparent": {}, + "incomingMessages": "Inkomende berichten", + "@incomingMessages": {}, + "discover": "Ontdek", + "@discover": {}, + "commandHint_ignore": "Negeer de gegeven matrix ID", + "@commandHint_ignore": {} } diff --git a/assets/l10n/intl_pl.arb b/assets/l10n/intl_pl.arb index 10bce97d27..5c83859351 100644 --- a/assets/l10n/intl_pl.arb +++ b/assets/l10n/intl_pl.arb @@ -1,7 +1,7 @@ { "@@locale": "pl", "@@last_modified": "2021-08-14 12:41:09.943634", - "about": "O nas", + "about": "O aplikacji", "@about": { "type": "text", "placeholders": {} @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} zaakceptował/-a zaproszenie", + "acceptedTheInvitation": "👍 {username} zaakceptował/-a zaproszenie", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informacje o koncie", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktywował/-a szyfrowanie end-to-end", + "activatedEndToEndEncryption": "🔐 {username} aktywował/-a szyfrowanie od końca do końca", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,17 +35,7 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Dodaj opis grupy", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Dodaj nowego przyjaciela", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", + "admin": "Administrator", "@admin": { "type": "text", "placeholders": {} @@ -60,11 +45,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Masz już konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} odebrał połączenie", "@answeredTheCall": { "type": "text", @@ -82,41 +62,26 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Zarchiwizowane pokoje", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Czy użytkownicy-goście mogą dołączyć", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "areYouSure": "Jesteś pewny/-a?", + "areYouSure": "Czy na pewno?", "@areYouSure": { "type": "text", "placeholders": {} }, - "areYouSureYouWantToLogout": "Czy napewno chcesz się wylogować?", + "areYouSureYouWantToLogout": "Czy na pewno chcesz się wylogować?", "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "askSSSSCache": "Wpisz swoje hasło przechowywania lub klucz odzyskiwania żeby załadować klucze.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Aby zalogować inną osobę, proszę wpisać hasło przechowywania lub klucz odzyskiwania.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Wpisz hasło przechowywania lub klucz odzyskiwania aby zweryfikować sesję.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Zaakceptować tą prośbę weryfikacji od {username}?", "@askVerificationRequest": { "type": "text", @@ -124,17 +89,7 @@ "username": {} } }, - "authentication": "Autoryzacja", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Zdjęcie profilowe zostało zmienione", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Serwer wspiera typy logowania:\n{serverVersions}\nAle ta aplikacja wpiera tylko:\n{supportedVersions}", + "badServerLoginTypesException": "Serwer obsługuje typy logowania:\n{serverVersions}\nAle ta aplikacja obsługuje tylko:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", "placeholders": { @@ -142,7 +97,7 @@ "supportedVersions": {} } }, - "badServerVersionsException": "Serwer wspiera wersje Spec:\n{serverVersions}\nAle aplikacja wspiera tylko {supportedVersions}", + "badServerVersionsException": "Serwer obsługuje wersje Spec:\n{serverVersions}\nAle aplikacja obsługuje tylko {supportedVersions}", "@badServerVersionsException": { "type": "text", "placeholders": { @@ -150,7 +105,7 @@ "supportedVersions": {} } }, - "banFromChat": "Ban na czacie", + "banFromChat": "Ban w czacie", "@banFromChat": { "type": "text", "placeholders": {} @@ -168,7 +123,7 @@ "targetName": {} } }, - "blockDevice": "Zablokuj Urządzenie", + "blockDevice": "Zablokuj urządzenie", "@blockDevice": { "type": "text", "placeholders": {} @@ -178,16 +133,11 @@ "type": "text", "placeholders": {} }, - "botMessages": "Wiadomośći Botów", + "botMessages": "Wiadomości botów", "@botMessages": { "type": "text", "placeholders": {} }, - "cachedKeys": "Klucze załadowane", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Anuluj", "@cancel": { "type": "text", @@ -205,7 +155,7 @@ "username": {} } }, - "changedTheChatDescriptionTo": "{username} zmienił/-a opis czatu na: '{description}'", + "changedTheChatDescriptionTo": "{username} zmienił/-a opis czatu na '{description}'", "@changedTheChatDescriptionTo": { "type": "text", "placeholders": { @@ -213,7 +163,7 @@ "description": {} } }, - "changedTheChatNameTo": "{username} zmienił/-a nick na: '{chatname}'", + "changedTheChatNameTo": "{username} zmienił/-a nick na '{chatname}'", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -221,14 +171,14 @@ "chatname": {} } }, - "changedTheChatPermissions": "{username} zmienił/-a uprawnienia czatu", + "changedTheChatPermissions": "{username} zmienił/-a uprawnienia w czacie", "@changedTheChatPermissions": { "type": "text", "placeholders": { "username": {} } }, - "changedTheDisplaynameTo": "{username} zmienił/-a wyświetlany nick na: {displayname}", + "changedTheDisplaynameTo": "{username} zmienił/-a swój nick na '{displayname}'", "@changedTheDisplaynameTo": { "type": "text", "placeholders": { @@ -243,7 +193,7 @@ "username": {} } }, - "changedTheGuestAccessRulesTo": "{username} zmienił/-a zasady dostępu dla gości na: {rules}", + "changedTheGuestAccessRulesTo": "{username} zmienił/-a zasady dostępu dla gości na {rules}", "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { @@ -258,7 +208,7 @@ "username": {} } }, - "changedTheHistoryVisibilityTo": "{username} zmienił/-a widoczność historii na: {rules}", + "changedTheHistoryVisibilityTo": "{username} zmienił/-a widoczność historii na {rules}", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -273,7 +223,7 @@ "username": {} } }, - "changedTheJoinRulesTo": "{username} zmienił/-a zasady wejścia na: {joinRules}", + "changedTheJoinRulesTo": "{username} zmienił/-a zasady wejścia na {joinRules}", "@changedTheJoinRulesTo": { "type": "text", "placeholders": { @@ -295,18 +245,13 @@ "username": {} } }, - "changedTheRoomInvitationLink": "{username} zmienił/-a link do zaproszenia do pokoju", + "changedTheRoomInvitationLink": "{username} zmienił/-a link z zaproszeniem do pokoju", "@changedTheRoomInvitationLink": { "type": "text", "placeholders": { "username": {} } }, - "changelog": "Dziennik zmian", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Zmień hasło", "@changePassword": { "type": "text", @@ -327,32 +272,22 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Zmień tapetę", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Zmień tapetę", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "Szyfrowanie zostało uszkodzone", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "chat": "Rozmowa", + "chat": "Czat", "@chat": { "type": "text", "placeholders": {} }, - "chatBackup": "Kopia zapasowa Rozmów", + "chatBackup": "Kopia zapasowa czatów", "@chatBackup": { "type": "text", "placeholders": {} }, - "chatBackupDescription": "Twoja kopia zapasowa Rozmów jest zabezpieczona kluczem bezpieczeństwa. Uważaj żeby go nie zgubić.", + "chatBackupDescription": "Twoje stare wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -362,7 +297,7 @@ "type": "text", "placeholders": {} }, - "chats": "Rozmowy", + "chats": "Czaty", "@chats": { "type": "text", "placeholders": {} @@ -372,11 +307,6 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Wybierz nick", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Wyczyść archiwum", "@clearArchive": {}, "close": "Zamknij", @@ -384,7 +314,7 @@ "type": "text", "placeholders": {} }, - "commandHint_ban": "Zablokuj użytkownika w tym pokoju", + "commandHint_ban": "Zbanuj użytkownika w tym pokoju", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -409,7 +339,7 @@ "type": "text", "description": "Usage hint for the command /kick" }, - "commandHint_leave": "Wyjdź z tego pokoju", + "commandHint_leave": "Opuść ten pokój", "@commandHint_leave": { "type": "text", "description": "Usage hint for the command /leave" @@ -419,7 +349,7 @@ "type": "text", "description": "Usage hint for the command /me" }, - "commandHint_myroomavatar": "Ustaw awatar dla tego pokoju (przez mxc-uri)", + "commandHint_myroomavatar": "Ustaw swoje zdjęcie w tym pokoju (przez mxc-uri)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" @@ -429,7 +359,7 @@ "type": "text", "description": "Usage hint for the command /myroomnick" }, - "commandHint_op": "Ustaw moc uprawnień użytkownika (domyślnie: 50)", + "commandHint_op": "Ustaw poziom uprawnień tego użytkownika (domyślnie: 50)", "@commandHint_op": { "type": "text", "description": "Usage hint for the command /op" @@ -449,7 +379,7 @@ "type": "text", "description": "Usage hint for the command /send" }, - "commandHint_unban": "Odblokuj użytkownika w tym pokoju", + "commandHint_unban": "Odbanuj użytkownika w tym pokoju", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" @@ -466,12 +396,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Porównaj i sprawdź czy na innym urządzeniu wyświetlają się te same emoji:", + "compareEmojiMatch": "Porównaj emoji", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Porównaj i sprawdź czy na innym urządzeniu wyświetlają się te same cyfry:", + "compareNumbersMatch": "Porównaj cyfry", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -486,11 +416,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Próba połączenia nie powiodła się", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt został zaproszony do grupy", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -506,11 +431,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Przeglądarka treści", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Skopiowano do schowka", "@copiedToClipboard": { "type": "text", @@ -533,16 +453,6 @@ "error": {} } }, - "couldNotSetAvatar": "Nie można ustawić zdjęcia profilowego", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nie można ustawić wyświetlanego nicku", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} uczestników", "@countParticipants": { "type": "text", @@ -555,23 +465,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Stwórz konto teraz", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} stworzył/-a czat", + "createdTheChat": "💬 {username} utworzył/-a czat", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Stwórz nową grupę", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Obecnie aktywny/-a", "@currentlyActive": { "type": "text", @@ -582,7 +482,7 @@ "type": "text", "placeholders": {} }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", + "dateAndTimeOfDay": "{date} {timeOfDay}", "@dateAndTimeOfDay": { "type": "text", "placeholders": { @@ -598,7 +498,7 @@ "day": {} } }, - "dateWithYear": "{day}-{month}-{year}", + "dateWithYear": "{day}.{month}.{year}", "@dateWithYear": { "type": "text", "placeholders": { @@ -607,7 +507,7 @@ "day": {} } }, - "deactivateAccountWarning": "To dezaktywuje twoje konto. To jest nieodwracalne ! Czy jesteś pewien?", + "deactivateAccountWarning": "To zdezaktywuje twoje konto. To jest nieodwracalne! Na pewno chcesz to zrobić?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} @@ -627,17 +527,12 @@ "type": "text", "placeholders": {} }, - "deny": "Odrzuć", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Urządzenie", "@device": { "type": "text", "placeholders": {} }, - "deviceId": "ID Urządzenia", + "deviceId": "Identyfikator urządzenia", "@deviceId": { "type": "text", "placeholders": {} @@ -647,31 +542,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Szyfrowanie jest bezpieczne tylko wtedy gdy, wszystkie urządzenia zostaną zweryfikowane.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Rozmowy bezpośrednie", + "directChats": "Czaty bezpośrednie", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Odrzuć zdjęcie", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Wyświetlany nick został zmieniony", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Wsparcie", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Pobierz plik", "@downloadFile": { "type": "text", @@ -682,16 +562,11 @@ "type": "text", "placeholders": {} }, - "editDisplayname": "Edytuj wyświetlany nick", + "editDisplayname": "Edytuj wyświetlaną nazwę", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Edytuj instancje Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Zmień aliasy pokoju", "@editRoomAliases": { "type": "text", @@ -702,27 +577,27 @@ "type": "text", "placeholders": {} }, - "emoteInvalid": "Nieprawidłowy kod emotikony!", + "emoteInvalid": "Nieprawidłowy kod emotikonu!", "@emoteInvalid": { "type": "text", "placeholders": {} }, - "emotePacks": "Paczki emotikon dla pokoju", + "emotePacks": "Paczki emotikonów dla pokoju", "@emotePacks": { "type": "text", "placeholders": {} }, - "emoteSettings": "Ustawienia Emotikon", + "emoteSettings": "Ustawienia emotikonów", "@emoteSettings": { "type": "text", "placeholders": {} }, - "emoteShortcode": "Kod Emotikony", + "emoteShortcode": "Skrócony kod emotikonu", "@emoteShortcode": { "type": "text", "placeholders": {} }, - "emoteWarnNeedToPick": "Musisz wybrać kod emotikony oraz obraz!", + "emoteWarnNeedToPick": "Musisz wybrać kod emotikonu oraz obraz!", "@emoteWarnNeedToPick": { "type": "text", "placeholders": {} @@ -732,7 +607,7 @@ "type": "text", "placeholders": {} }, - "enableEmotesGlobally": "Włącz paczkę emotikon globalnie", + "enableEmotesGlobally": "Włącz paczkę emotikonów globalnie", "@enableEmotesGlobally": { "type": "text", "placeholders": {} @@ -752,43 +627,23 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algorytm szyfrowania", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Szyfrowanie nie jest włączone", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Ustawienia szyfrowania end-to-end", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} zakończył połączenie", + "endedTheCall": "{senderName} zakończył/-a połączenie", "@endedTheCall": { "type": "text", "placeholders": { "senderName": {} } }, - "enterAGroupName": "Wpisz nazwę grupy", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Wpisz adres email", + "enterAnEmailAddress": "Wpisz adres e-mail", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Wpisz nick", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Wpisz swój serwer domowy", "@enterYourHomeserver": { "type": "text", @@ -804,11 +659,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Rozmiar pliku", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -819,11 +669,6 @@ "type": "text", "placeholders": {} }, - "friday": "Piątek", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Od dołączenia", "@fromJoining": { "type": "text", @@ -844,16 +689,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Opis grupy", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Opis grupy został zmieniony", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Grupa jest publiczna", "@groupIsPublic": { "type": "text", @@ -866,7 +701,7 @@ "displayname": {} } }, - "guestsAreForbidden": "Goście są zabronieni", + "guestsAreForbidden": "Goście są zakazani", "@guestsAreForbidden": { "type": "text", "placeholders": {} @@ -889,7 +724,7 @@ "type": "text", "placeholders": {} }, - "hideRedactedEvents": "Ukryj informacje o zredagowaniu", + "hideRedactedEvents": "Ukryj informacje o usuniętych zdarzeniach", "@hideRedactedEvents": { "type": "text", "placeholders": {} @@ -899,12 +734,7 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Serwer domowy nie jest kompatybilny", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "ID", + "id": "Identyfikator", "@id": { "type": "text", "placeholders": {} @@ -919,16 +749,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Możesz ignorować użytkowników którzy cię irytują. Nie będziesz odbierać od nich wiadomości ani żadnych zaproszeń od użytkowników na tej liście.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignoruj użytkownika", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Nacisnąłem na link", "@iHaveClickedOnLink": { "type": "text", @@ -939,7 +759,7 @@ "type": "text", "placeholders": {} }, - "inviteContact": "Zaproś kontakty", + "inviteContact": "Zaproś kontakt", "@inviteContact": { "type": "text", "placeholders": {} @@ -956,7 +776,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} zaprosił/-a {targetName}", + "invitedUser": "📩 {username} zaprosił/-a {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -969,12 +789,12 @@ "type": "text", "placeholders": {} }, - "inviteForMe": "Zaprosszenie dla mnie", + "inviteForMe": "Zaproszenie dla mnie", "@inviteForMe": { "type": "text", "placeholders": {} }, - "inviteText": "{username} zaprosił/-a cię do FluffyChat. \n1. Zainstaluj FluffyChat: https://fluffychat.im \n2. Zarejestuj się lub zaloguj \n3. Otwórz link zaproszenia: {link}", + "inviteText": "{username} zaprosił/-a Cię do FluffyChat.\n1. Odwiedź fluffychat.im i zainstaluj aplikację\n2. Zarejestuj się lub zaloguj\n3. Otwórz link zaproszenia:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -982,17 +802,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Czy to odpowiedni klucz urządzenia?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "pisze…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} dołączył/-a do czatu", + "joinedTheChat": "👋 {username} dołączył/-a do czatu", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1004,17 +819,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Klucze są załadowane", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Brakuje kluczy", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} wyrzucił/-a {targetName}", + "kicked": "👞 {username} wyrzucił/-a {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1022,7 +827,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} wyrzucił/-a i zbanował/-a {targetName}", + "kickedAndBanned": "🙅 {username} wyrzucił/-a i zbanował/-a {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1035,23 +840,13 @@ "type": "text", "placeholders": {} }, - "lastActiveAgo": "Ostatnio widziano: {localizedTimeShort}", + "lastActiveAgo": "Ostatnio widziano {localizedTimeShort}", "@lastActiveAgo": { "type": "text", "placeholders": { "localizedTimeShort": {} } }, - "lastSeenIp": "Ostatnie widziane IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Widziany/-a dawno temu", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Opuść", "@leave": { "type": "text", @@ -1089,7 +884,7 @@ "type": "text", "placeholders": {} }, - "login": "Zaloguj", + "login": "Zaloguj się", "@login": { "type": "text", "placeholders": {} @@ -1101,26 +896,11 @@ "homeserver": {} } }, - "logout": "Wyloguj", + "logout": "Wyloguj się", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Uczyń moderatorem", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Uczyń adminem", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Upewnij się, że identyfikator jest prawidłowy", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Zmiany członków", "@memberChanges": { "type": "text", @@ -1131,34 +911,17 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Wiadomość zostanie usunięta dla wszystkich użytkowników", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Poniedziałek", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 kolejne wydarzenie} other{{count} więcej wydarzeń}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Wycisz czat", "@muteChat": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "Należy pamiętać, że Pantalaimon wymaga na razie szyfrowania end-to-end.", + "needPantalaimonWarning": "Należy pamiętać, że Pantalaimon wymaga na razie szyfrowania od końca do końca.", "@needPantalaimonWarning": { "type": "text", "placeholders": {} @@ -1168,7 +931,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nowa wiadomość w FluffyChat", + "newMessageInFluffyChat": "💬 Nowa wiadomość we FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1193,7 +956,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Wygląda na to, że nie masz usług Google w swoim telefonie. To dobra decyzja dla twojej prywatności! Aby otrzymywać powiadomienia wysyłane w FluffyChat, zalecamy korzystanie z https://microg.org/ lub https://unifiedpush.org/.", + "noGoogleServicesWarning": "Wygląda na to, że Twoje urządzenie nie obsługuje Firebase Cloud Messaging. Aby wciąż otrzymywać powiadomienia push, zalecamy istalację ntfy. Używając ntfy lub inengo zunifikowanego dostawcy powiadomień push, możesz bezpiecznie otrzymywać takowe powiadomienia. Ntfy można pobrać ze sklepu Google Play Store lub z F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1203,7 +966,7 @@ "type": "text", "placeholders": {} }, - "noPasswordRecoveryDescription": "Nie dodałeś jeszcze sposobu aby odzyskać swoje hasło.", + "noPasswordRecoveryDescription": "Nie dodałeś/-aś jeszcze sposobu odzyskiwania swojego hasła.", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} @@ -1213,21 +976,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Nie znaleziono publicznych pokoi…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nie znaleziono pokoi…", + "noRoomsFound": "Nie znaleziono pokojów…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Na razie brak ststusów.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Powiadomienia", "@notifications": { "type": "text", @@ -1238,19 +991,7 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Nie obsługiwane w sieci", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} wybrany", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "oopsSomethingWentWrong": "Ups! Coś poszło nie tak…", + "oopsSomethingWentWrong": "Ojej! Coś poszło nie tak…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1265,16 +1006,6 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Opcjonalnie) Nazwa grupy", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Urządzenia użytkowników", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "password": "Hasło", "@password": { "type": "text", @@ -1302,47 +1033,27 @@ "fileName": {} } }, - "pleaseChooseAUsername": "Wybierz nick", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Wprowadź proszę identyfikator matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Wpisz swój klucz bezpieczeństwa:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Wpisz swoje hasło", + "pleaseEnterYourPassword": "Wprowadź swoje hasło", "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} }, - "pleaseEnterYourUsername": "Wpisz swój nick", + "pleaseEnterYourUsername": "Wpisz swoją nazwę użytkownika", "@pleaseEnterYourUsername": { "type": "text", "placeholders": {} }, - "pleaseFollowInstructionsOnWeb": "Wykonaj instrukcje na stronie internetowej i naciśnij dalej.", + "pleaseFollowInstructionsOnWeb": "Wykonaj instrukcje na stronie internetowej i naciśnij „dalej”.", "@pleaseFollowInstructionsOnWeb": { "type": "text", "placeholders": {} }, - "publicGroups": "Publiczne Grupy", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Publiczne pokoje", "@publicRooms": { "type": "text", "placeholders": {} }, - "pushRules": "Zasady push", + "pushRules": "Reguły push", "@pushRules": { "type": "text", "placeholders": {} @@ -1352,7 +1063,7 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username} stworzył/-a wydarzenie", + "redactedAnEvent": "{username} usunął/-ęła zdarzenie", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -1398,17 +1109,12 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "Usuń blokadę", + "unbanFromChat": "Odbanuj w czacie", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "Usuń wiadomość", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "reply": "Odpisz", + "reply": "Odpowiedz", "@reply": { "type": "text", "placeholders": {} @@ -1418,48 +1124,11 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Poproś o przeczytanie starszych wiadomości", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Odwołaj wszystkie uprawnienia", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomVersion": "Wersja pokoju", "@roomVersion": { "type": "text", "placeholders": {} }, - "saturday": "Sobota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Zapisano plik jako {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "searchForAChat": "Przeszukaj czat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Klucz bezpieczeństwa", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Zagubiony klucz bezpieczeństwa?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Zobaczone przez {username}", "@seenByUser": { "type": "text", @@ -1467,22 +1136,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Zobaczone przez {username} oraz {count} innych}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Zobaczone przez {username} oraz {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Wyślij", "@send": { "type": "text", @@ -1503,57 +1156,47 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} wysłał/-a plik", + "sentAFile": "📁 {username} wysłał/-a plik", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} wysłał/-a plik audio", + "sentAnAudio": "🎤 {username} wysłał/-a plik dżwiękowy", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} wysłał/-a obraz", + "sentAPicture": "🖼️ {username} wysłał/-a zdjęcie", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} wysłał/-a naklejkę", + "sentASticker": "😊 {username} wysłał/-a naklejkę", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} wysłał/-a wideo", + "sentAVideo": "🎥 {username} wysłał/-a film", "@sentAVideo": { "type": "text", "placeholders": { "username": {} } }, - "setAProfilePicture": "Ustaw zdjęcie profilowe", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Ustaw jako główny alias", "@setAsCanonicalAlias": { "type": "text", "placeholders": {} }, - "setGroupDescription": "Ustaw opis grupy", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Ustaw link zaproszeniowy", + "setInvitationLink": "Ustaw link z zaproszeniem", "@setInvitationLink": { "type": "text", "placeholders": {} @@ -1573,7 +1216,7 @@ "type": "text", "placeholders": {} }, - "sharedTheLocation": "{username} udostępnił/-a lokalizacje", + "sharedTheLocation": "{username} udostępnił/-a swoją lokalizację", "@sharedTheLocation": { "type": "text", "placeholders": { @@ -1585,31 +1228,16 @@ "type": "text", "placeholders": {} }, - "signUp": "Zarejesturuj się", - "@signUp": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Kod żródłowy", "@sourceCode": { "type": "text", "placeholders": {} }, - "startYourFirstChat": "Rozpocznij swój pierwszy czat teraz! 🙂\n- Naciśnij przycisk napisz wiadomość\n- Wpisz nazwę użytkownika przyjaciela\n- Baw się dobrze podczas rozmów", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "Jak się masz dziś?", "@statusExampleMessage": { "type": "text", "placeholders": {} }, - "sunday": "Niedziela", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Synchronizacja… Proszę czekać.", "@synchronizingPleaseWait": { "type": "text", @@ -1620,36 +1248,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Naciśnij na urządzeniu aby zweryfikować", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Kliknij by zobaczyć menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ten pokój został przeniesiony do archiwum.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Czwartek", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1666,11 +1264,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Wtorek", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unbannedUser": "{username} odbanował/-a {targetName}", "@unbannedUser": { "type": "text", @@ -1706,26 +1299,14 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} nieprzeczytanych czatów}}", + "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} nieprzeczytanych wiadomości}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Użyć kolorów kompatybilnych z ekranami AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} oraz {count} innych pisze…", + "userAndOthersAreTyping": "{username} oraz {count} pozostałych pisze…", "@userAndOthersAreTyping": { "type": "text", "placeholders": { @@ -1733,7 +1314,7 @@ "count": {} } }, - "userAndUserAreTyping": "{username} oraz {username2} piszą…", + "userAndUserAreTyping": "{username} i {username2} piszą…", "@userAndUserAreTyping": { "type": "text", "placeholders": { @@ -1748,19 +1329,19 @@ "username": {} } }, - "userLeftTheChat": "{username} opuścił/-a czat", + "userLeftTheChat": "🚪 {username} opuścił/-a czat", "@userLeftTheChat": { "type": "text", "placeholders": { "username": {} } }, - "username": "Nick", + "username": "Nazwa użytkownika", "@username": { "type": "text", "placeholders": {} }, - "userSentUnknownEvent": "{username} wysłał/-a wydarzenie {type}", + "userSentUnknownEvent": "{username} wysłał/-a zdarzenie {type}", "@userSentUnknownEvent": { "type": "text", "placeholders": { @@ -1793,7 +1374,7 @@ "type": "text", "placeholders": {} }, - "visibleForEveryone": "Widoczny dla każdego", + "visibleForEveryone": "Widoczne dla każdego", "@visibleForEveryone": { "type": "text", "placeholders": {} @@ -1803,28 +1384,13 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Tapeta", + "wallpaper": "Tapeta:", "@wallpaper": { "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Szyfrowanie end-to-end jest obecnie w fazie beta! Używaj na własne ryzyko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Środa", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Witamy w najładniejszym komunikatorze w sieci matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kto może dołączyć do tej grupy", - "@whoIsAllowedToJoinThisGroup": { + "whoIsAllowedToJoinThisGroup": "Kto może dołączyć do tej grupy", + "@whoIsAllowedToJoinThisGroup": { "type": "text", "placeholders": {} }, @@ -1843,60 +1409,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Dostałeś/-aś zaproszenie do tego czatu", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Nie uczestniczysz już w tym czacie", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Nie możesz zaprosić siebie", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Zostałeś zbanowany na tym czacie", + "youHaveBeenBannedFromThisChat": "Zostałeś/-aś zbanowany/-a w tym czacie", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Twój nick", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Będziesz połączony do serwera {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Powiększ", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Pomniejsz", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "passwordsDoNotMatch": "Hasła nie pasują!", - "@passwordsDoNotMatch": {}, "allChats": "Wszystkie", "@allChats": { "type": "text", "placeholders": {} }, - "editChatPermissions": "Edytuj uprawnienia", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "ignore": "Ignoruj", "@ignore": { "type": "text", @@ -1907,8 +1434,6 @@ "type": "text", "placeholders": {} }, - "createNewChatExplaination": "Po prostu zeskanuj kod QR lub jeśli nie jesteście obok siebie podziel się linkiem z zaproszeniem.", - "@createNewChatExplaination": {}, "obtainingLocation": "Uzyskiwanie lokalizacji…", "@obtainingLocation": { "type": "text", @@ -1916,7 +1441,7 @@ }, "addAccount": "Dodaj konto", "@addAccount": {}, - "serverRequiresEmail": "Ten serwer wymaga potwierdzenia twojego adresu email w celu rejestracji.", + "serverRequiresEmail": "Ten serwer wymaga potwierdzenia Twojego adresu email w celu rejestracji.", "@serverRequiresEmail": {}, "or": "Lub", "@or": { @@ -1928,17 +1453,17 @@ "type": "text", "placeholders": {} }, - "passwordForgotten": "Zapomniano hasła", + "passwordForgotten": "Nie pamiętam hasła", "@passwordForgotten": { "type": "text", "placeholders": {} }, - "pleaseChoose": "Proszę wybierz", + "pleaseChoose": "Proszę wybrać", "@pleaseChoose": { "type": "text", "placeholders": {} }, - "pleaseClickOnLink": "Proszę kliknij w odnośnik wysłany na email aby kontynuować.", + "pleaseClickOnLink": "Proszę kliknij w odnośnik wysłany w wiadomości e-mail, aby kontynuować.", "@pleaseClickOnLink": { "type": "text", "placeholders": {} @@ -1948,7 +1473,7 @@ "type": "text", "placeholders": {} }, - "removeYourAvatar": "Usuń swój avatar", + "removeYourAvatar": "Usuń swoje zdjęcie", "@removeYourAvatar": { "type": "text", "placeholders": {} @@ -1958,7 +1483,7 @@ "type": "text", "placeholders": {} }, - "replaceRoomWithNewerVersion": "Zamień pokój na nową wersję", + "replaceRoomWithNewerVersion": "Zamień pokój na nowszą wersję", "@replaceRoomWithNewerVersion": { "type": "text", "placeholders": {} @@ -1978,11 +1503,6 @@ "type": "text", "placeholders": {} }, - "saveFileToFolder": "Zapisz plik do tego folderu", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Szukaj", "@search": { "type": "text", @@ -1992,11 +1512,6 @@ "@sendAsText": { "type": "text" }, - "sendBugReports": "Pozwól wysyłać raporty o błędach do sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendAudio": "Wyślij dźwięk", "@sendAudio": { "type": "text", @@ -2022,12 +1537,7 @@ "type": "text", "placeholders": {} }, - "sessionVerified": "Sesja została zweryfikowana", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} rozpoczął rozmowę", + "startedACall": "{senderName} rozpoczął/-ęła rozmowę", "@startedACall": { "type": "text", "placeholders": { @@ -2039,9 +1549,7 @@ "type": "text", "placeholders": {} }, - "yourStory": "Twoja relacja", - "@yourStory": {}, - "enableMultiAccounts": "(BETA) Włącza obsługę wiele kont na tym urządzeniu", + "enableMultiAccounts": "(BETA) Włącza obsługę wielu kont na tym urządzeniu", "@enableMultiAccounts": {}, "pickImage": "Wybierz obraz", "@pickImage": { @@ -2065,24 +1573,8 @@ "type": "text", "placeholders": {} }, - "audioPlayerPause": "Pauza", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Co u Ciebie słychać?", - "@whatIsGoingOn": {}, - "pleaseEnterValidEmail": "Proszę podaj poprawny adres email.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Powtórz hasło", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Proszę podaj przynajmniej {min} znaków.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "all": "Wszystkie", "@all": { "type": "text", @@ -2093,14 +1585,14 @@ "type": "text", "placeholders": {} }, - "theyMatch": "Pasują", + "theyMatch": "Zgadzają się", "@theyMatch": { "type": "text", "placeholders": {} }, "sendOnEnter": "Wyślij enterem", "@sendOnEnter": {}, - "autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotki", + "autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotikony", "@autoplayImages": { "type": "text", "placeholder": {} @@ -2112,13 +1604,11 @@ "uri": {} } }, - "configureChat": "Konfiguruj chat", + "configureChat": "Konfiguruj czat", "@configureChat": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Podaj nazwę przestrzeni", - "@enterASpacepName": {}, "homeserver": "Adres serwera", "@homeserver": {}, "locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.", @@ -2133,22 +1623,7 @@ "type": "text", "placeholders": {} }, - "publicKey": "Klucz publiczny", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Publiczna przestrzeń", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Dotknij by pokazać obraz", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Nie pasują", + "theyDontMatch": "Nie zgadzają się", "@theyDontMatch": { "type": "text", "placeholders": {} @@ -2158,73 +1633,30 @@ "type": "text", "placeholders": {} }, - "setupChatBackup": "Ustaw kopię zapasową", - "@setupChatBackup": {}, - "changesHaveBeenSaved": "Zapisano zmiany", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Twoja nazwa użytkownika:", - "@yourUserId": {}, - "iWroteDownTheKey": "Zapisałem klucz w bezpiecznym miejscu", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Twoja kopia zapasowa chatu została ustawiona.", + "yourChatBackupHasBeenSetUp": "Kopia zapasowa Twojego czatu została ustawiona.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "By chronić Twoje wiadomości, wygenerowaliśmy dla Ciebie klucz bezpieczeństwa.\nProszę zapisz go w bezpiecznym miejscu, takim jak menedżer haseł.", - "@setupChatBackupDescription": {}, - "chatHasBeenAddedToThisSpace": "Chat został dodany do tej przestrzeni", + "chatHasBeenAddedToThisSpace": "Czat został dodany do tej przestrzeni", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Chat został usunięty z tej przestrzeni", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Zawartość została zgłoszona administratorom serwera", + "contentHasBeenReported": "Treść została zgłoszona administratorom serwera", "@contentHasBeenReported": { "type": "text", "placeholders": {} }, - "discover": "Odkrywaj", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Odkrywaj grupy", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Anuluj i nie pytaj ponownie", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "Edytuj zdjęcie pokoju", "@editRoomAvatar": { "type": "text", "placeholders": {} }, - "fontSize": "Rozmiar czcionki", + "fontSize": "Rozmiar fontu", "@fontSize": { "type": "text", "placeholders": {} }, - "friends": "Znajomi", - "@friends": { - "type": "text", - "placeholders": {} - }, "groups": "Grupy", "@groups": { "type": "text", "placeholders": {} }, - "invalidEmail": "Nieprawidłowy adres email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "locationPermissionDeniedNotice": "Brak uprawnień. Proszę zezwól aplikacji na dostęp do lokalizacji aby móc ją udostępnić.", "@locationPermissionDeniedNotice": { "type": "text", @@ -2235,19 +1667,17 @@ "type": "text", "placeholders": {} }, - "loginWithOneClick": "Zaloguj się jednym kliknięciem", - "@loginWithOneClick": {}, "messages": "Wiadomości", "@messages": { "type": "text", "placeholders": {} }, - "offensive": "Agresywne", + "offensive": "Obraźliwe", "@offensive": { "type": "text", "placeholders": {} }, - "pleaseEnterYourPin": "Proszę podaj pin", + "pleaseEnterYourPin": "Podaj swój PIN", "@pleaseEnterYourPin": { "type": "text", "placeholders": {} @@ -2257,17 +1687,12 @@ "type": "text", "placeholders": {} }, - "redactMessage": "Przekaż wiadomość", + "redactMessage": "Usuń wiadomość", "@redactMessage": { "type": "text", "placeholders": {} }, - "sentryInfo": "Polityka prywatności: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Ustaw niestandardowe emotki", + "setCustomEmotes": "Ustaw niestandardowe emotikony", "@setCustomEmotes": { "type": "text", "placeholders": {} @@ -2317,49 +1742,23 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Użytkownik nie został zweryfikowany", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "publish": "Opublikuj", "@publish": {}, - "whoCanSeeMyStories": "Kto może widzieć moje relacje?", - "@whoCanSeeMyStories": {}, "scanQrCode": "Skanuj kod QR", "@scanQrCode": {}, - "addToStory": "Dodaj do relacji", - "@addToStory": {}, - "typeInInviteLinkManually": "Wpisz link ręcznie...", - "@typeInInviteLinkManually": {}, "createNewSpace": "Nowa przestrzeń", "@createNewSpace": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Dźwięk, wibracje i kolor LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "clearText": "Wyczyść tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, "offline": "Offline", "@offline": { "type": "text", "placeholders": {} }, - "bubbleSize": "Rozmiar bąbelków", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Dodaj do przestrzeni", "@addToSpace": {}, - "changeYourAvatar": "Zmień avatar", + "changeYourAvatar": "Zmień swoje zdjęcie", "@changeYourAvatar": { "type": "text", "placeholders": {} @@ -2369,32 +1768,27 @@ "type": "text", "description": "Usage hint for the command /clearcache" }, - "enableChatBackup": "Włącz kopię zapasową aby nigdy nie stracić historii twoich wiadomości.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "commandHint_create": "Stwórz pusty chat\nUżyj --no-encryption by wyłączyć szyfrowanie", + "commandHint_create": "Stwórz pusty czat\nUżyj --no-encryption by wyłączyć szyfrowanie", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" }, - "commandHint_dm": "Rozpocznij bezpośredni chat\nUżyj --no-encryption by wyłączyć szyfrowanie", + "commandHint_dm": "Rozpocznij czat bezpośredni\nUżyj --no-encryption by wyłączyć szyfrowanie", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" }, - "editBlockedServers": "Edytuj blokowane serwery", + "editBlockedServers": "Edytuj zablokowane serwery", "@editBlockedServers": { "type": "text", "placeholders": {} }, - "enableEncryption": "Aktywuj szyfowanie", + "enableEncryption": "Włącz szyfowanie", "@enableEncryption": { "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Domyślny poziom uprawnień", + "defaultPermissionLevel": "Domyślny poziom uprawnień dla nowych użytkowników", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2404,7 +1798,7 @@ "type": "text", "placeholders": {} }, - "oopsPushError": "Ups! Wystąpił błąd podczas ustawiania powiadomień push.", + "oopsPushError": "Ojej! Wystąpił błąd podczas ustawiania powiadomień push.", "@oopsPushError": { "type": "text", "placeholders": {} @@ -2424,9 +1818,1077 @@ "type": "text", "placeholders": {} }, - "tooManyRequestsWarning": "Zbyt wiele zapytań. Proszę spróbuj ponownie później.", + "tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później.", "@tooManyRequestsWarning": { "type": "text", "placeholders": {} - } + }, + "commandHint_discardsession": "Odrzuć sesję", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "warning": "Uwaga!", + "@warning": { + "type": "text", + "placeholders": {} + }, + "messageInfo": "Informacje o wiadomości", + "@messageInfo": {}, + "time": "Czas", + "@time": {}, + "messageType": "Rodzaj wiadomości", + "@messageType": {}, + "separateChatTypes": "Oddzielenie czatów bezpośrednich i grupowych", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…", + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerEmoji": "Oczekiwanie na zaakceptowanie emoji przez drugą osobę…", + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Wybierz kod dostępu", + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "unblockDevice": "Odblokuj urządzenie", + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Dlaczego chcesz to zgłosić?", + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "removeFromSpace": "Usuń z przestrzeni", + "@removeFromSpace": {}, + "extremeOffensive": "Bardzo obraźliwe", + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "errorObtainingLocation": "Błąd w ustalaniu lokalizacji: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "howOffensiveIsThisContent": "Jak bardzo obraźliwa jest ta treść?", + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "inoffensive": "Nieobraźliwe", + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "recoveryKey": "Klucz odzyskiwania", + "@recoveryKey": {}, + "recoveryKeyLost": "Utracono klucz odzyskiwania?", + "@recoveryKeyLost": {}, + "sentCallInformations": "{senderName} wysłał/-a informacje o połączeniu", + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "singlesignon": "Pojedyncze logowanie", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "Rozpocznij swój pierwszy czat", + "@startFirstChat": {}, + "verifyStart": "Rozpocznij weryfikację", + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "verifySuccess": "Pomyślnie zweryfikowano!", + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "verifyTitle": "Weryfikowanie innego konta", + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerNumbers": "Oczekiwanie na zaakceptowanie numerów przez drugą osobę…", + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "sender": "Nadawca", + "@sender": {}, + "openGallery": "Otwórz galerię", + "@openGallery": {}, + "start": "Start", + "@start": {}, + "pleaseEnterRecoveryKeyDescription": "Aby odblokować wcześniejsze wiadomości, wprowadź swój klucz odzyskiwania, który został wygenerowany w poprzedniej sesji. Twój klucz odzyskiwania NIE jest Twoim hasłem.", + "@pleaseEnterRecoveryKeyDescription": {}, + "videoWithSize": "Film ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "hydrateTorLong": "Czy ostatnio eksportowałeś/-aś swoją sesję na TOR? Szybko ją zaimportuj i kontynuuj rozmowy.", + "@hydrateTorLong": {}, + "dehydrateTorLong": "W przypadku użytkowników sieci TOR zaleca się eksportowanie sesji przed zamknięciem okna.", + "@dehydrateTorLong": {}, + "hydrate": "Przywracanie z pliku kopii zapasowej", + "@hydrate": {}, + "noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "hydrateTor": "Użytkownicy TOR: Importuj eksport sesji", + "@hydrateTor": {}, + "numUsersTyping": "{count} użytkowników pisze…", + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "onlineKeyBackupEnabled": "Kopia zapasowa kluczy online jest włączona", + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "Wprowadź swój klucz odzyskiwania:", + "@pleaseEnterRecoveryKey": {}, + "submit": "Odeślij", + "@submit": { + "type": "text", + "placeholders": {} + }, + "weSentYouAnEmail": "Wysłaliśmy Ci wiadomość e-mail", + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "unverified": "Niezweryfikowane", + "@unverified": {}, + "wipeChatBackup": "Wymazać kopię zapasową czatu, aby utworzyć nowy klucz odzyskiwania?", + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kto może wykonywać jakie czynności", + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "reportUser": "Zgłoś użytkownika", + "@reportUser": {}, + "dismiss": "Odrzuć", + "@dismiss": {}, + "markAsRead": "Oznacz jako przeczytane", + "@markAsRead": {}, + "passphraseOrKey": "fraza dostępu lub klucz odzyskiwania", + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "openChat": "Otwórz czat", + "@openChat": {}, + "addToSpaceDescription": "Wybierz przestrzeń, do której ten czat ma być dodany.", + "@addToSpaceDescription": {}, + "supposedMxid": "To powinno być {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasdm": "Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID", + "@commandHint_markasdm": {}, + "confirmMatrixId": "Potwierdź swój identyfikator Matrix w celu usunięcia konta.", + "@confirmMatrixId": {}, + "commandHint_markasgroup": "Oznacz jako grupę", + "@commandHint_markasgroup": {}, + "noEmotesFound": "Nie znaleziono żadnych emotikonów. 😕", + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "dehydrate": "Eksportuj sesję i wymaż urządzenie", + "@dehydrate": {}, + "dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.", + "@dehydrateWarning": {}, + "dehydrateTor": "Użytkownicy TOR: Eksportuj sesję", + "@dehydrateTor": {}, + "unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android", + "@unsupportedAndroidVersion": {}, + "widgetCustom": "Własny", + "@widgetCustom": {}, + "widgetEtherpad": "Notatka", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "pinMessage": "Przypnij do pokoju", + "@pinMessage": {}, + "confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?", + "@confirmEventUnpin": {}, + "youJoinedTheChat": "Dołączono do czatu", + "@youJoinedTheChat": {}, + "user": "Użytkownik", + "@user": {}, + "custom": "Własne", + "@custom": {}, + "newGroup": "Nowa grupa", + "@newGroup": {}, + "newSpace": "Nowa przestrzeń", + "@newSpace": {}, + "fileIsTooBigForServer": "Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości {max}.", + "@fileIsTooBigForServer": {}, + "youBannedUser": "Zbanowałeś/-aś {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "users": "Użytkownicy", + "@users": {}, + "countFiles": "{count} plików", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "noOtherDevicesFound": "Nie znaleziono innych urządzeń", + "@noOtherDevicesFound": {}, + "widgetUrlError": "Niepoprawny URL.", + "@widgetUrlError": {}, + "widgetNameError": "Podaj nazwę wyświetlaną.", + "@widgetNameError": {}, + "encryptThisChat": "Zaszyfruj ten czat", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.", + "@disableEncryptionWarning": {}, + "deviceKeys": "Klucze urządzenia:", + "@deviceKeys": {}, + "emailOrUsername": "Adres e-mail lub nazwa użytkownika", + "@emailOrUsername": {}, + "indexedDbErrorLong": "Przechowywanie wiadomości niestety nie jest domyślnie włączone w trybie prywatnym.\nOdwiedź\n - about:config\n - ustaw dom.indexedDB.privateBrowsing.enabled na true\nW przeciwnym razie nie jest możliwe uruchomienie FluffyChat.", + "@indexedDbErrorLong": {}, + "saveKeyManuallyDescription": "Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.", + "@saveKeyManuallyDescription": {}, + "screenSharingTitle": "udostępnianie ekranu", + "@screenSharingTitle": {}, + "appearOnTopDetails": "Umożliwia wyświetlanie aplikacji nad innymi (nie jest to konieczne, jeśli FluffyChat jest już ustawiony jako konto do dzwonienia)", + "@appearOnTopDetails": {}, + "noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.", + "@noKeyForThisMessage": {}, + "sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe", + "@sorryThatsNotPossible": {}, + "noBackupWarning": "Uwaga! Bez włączenia kopii zapasowej czatu, stracisz dostęp do swoich zaszyfrowanych wiadomości. Zaleca się włączenie kopii zapasowej czatu przed wylogowaniem.", + "@noBackupWarning": {}, + "commandHint_googly": "Wyślij kręcące się oczka", + "@commandHint_googly": {}, + "callingPermissions": "Uprawnienia połączeń", + "@callingPermissions": {}, + "storeInAndroidKeystore": "Przechowaj w Android KeyStore", + "@storeInAndroidKeystore": {}, + "commandHint_cuddle": "Wyślij przytulenie", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName} wysyła ci kręcące się oczka", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "cuddleContent": "{senderName} przytula cię", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} uściska cię", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_hug": "Wyślij uścisk", + "@commandHint_hug": {}, + "reactedWith": "{sender} zareagował/-a z {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "emojis": "Emoji", + "@emojis": {}, + "placeCall": "Zadzwoń", + "@placeCall": {}, + "voiceCall": "Połączenie głosowe", + "@voiceCall": {}, + "unsupportedAndroidVersionLong": "Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Należy pamiętać, że połączenia wideo są obecnie w fazie beta. Mogą nie działać zgodnie z oczekiwaniami lub nie działać w ogóle na wszystkich platformach.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Eksperymentalne połączenia wideo", + "@experimentalVideoCalls": {}, + "indexedDbErrorTitle": "Problemy związane z trybem prywatnym", + "@indexedDbErrorTitle": {}, + "switchToAccount": "Przełącz na konto {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "nextAccount": "Następne konto", + "@nextAccount": {}, + "previousAccount": "Poprzednie konto", + "@previousAccount": {}, + "addWidget": "Dodaj widżet", + "@addWidget": {}, + "widgetVideo": "Film", + "@widgetVideo": {}, + "widgetName": "Nazwa", + "@widgetName": {}, + "errorAddingWidget": "Błąd podczas dodawania widżetu.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "Odrzucono zaproszenie", + "@youRejectedTheInvitation": {}, + "youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Wycofano zaproszenie dla {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 Zostałeś/-aś zaproszony/-a przez {user}", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youInvitedUser": "📩 Zaprosiłeś/-aś {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "youKicked": "👞 Wyrzuciłeś/-aś {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "youKickedAndBanned": "🙅 Wyrzuciłeś/-aś i zbanowałeś/-aś {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "Odbanowałeś/-aś {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "unlockOldMessages": "Odblokuj stare wiadomości", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Przechowaj klucz odzyskiwania w bezpiecznym magazynie tego urządzenia.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Przechowaj w pęku kluczy Apple", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Przechowaj bezpiecznie na tym urządzeniu", + "@storeSecurlyOnThisDevice": {}, + "foregroundServiceRunning": "To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "Udostępniasz swój ekran w FluffyChat", + "@screenSharingDetail": {}, + "callingAccount": "Konto połączeń", + "@callingAccount": {}, + "callingAccountDetails": "Pozwala FluffyChat używać natywnej aplikacji do wykonywania połączeń w Androidzie.", + "@callingAccountDetails": {}, + "appearOnTop": "Wyświetlaj nad innymi", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofon, kamera i inne uprawnienia FluffyChat", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?", + "@whyIsThisMessageEncrypted": {}, + "enterSpace": "Wejdź do przestrzeni", + "@enterSpace": {}, + "enterRoom": "Wejdź do pokoju", + "@enterRoom": {}, + "allSpaces": "Wszystkie przestrzenie", + "@allSpaces": {}, + "numChats": "{number} czatów", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Ukryj nieistotne wydarzenia stanu", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nie pokazuj ponownie", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "newSpaceDescription": "Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.", + "@newSpaceDescription": {}, + "reopenChat": "Otwórz ponownie czat", + "@reopenChat": {}, + "fileHasBeenSavedAt": "Plik został zapisany w ścieżce {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "addToBundle": "Dodaj do pakietu", + "@addToBundle": {}, + "bundleName": "Nazwa pakietu", + "@bundleName": {}, + "editBundlesForAccount": "Edytuj pakiety dla tego konta", + "@editBundlesForAccount": {}, + "jumpToLastReadMessage": "Przejdź do ostatnio przeczytanej wiadomości", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Czytaj do tego miejsca", + "@readUpToHere": {}, + "jump": "Przejdź", + "@jump": {}, + "removeFromBundle": "Usuń z tego pakietu", + "@removeFromBundle": {}, + "openLinkInBrowser": "Otwórz link w przeglądarce", + "@openLinkInBrowser": {}, + "allRooms": "Wszystkie czaty grupowe", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.", + "@reportErrorDescription": {}, + "setColorTheme": "Ustal styl kolorów:", + "@setColorTheme": {}, + "tryAgain": "Spróbuj ponownie", + "@tryAgain": {}, + "messagesStyle": "Wiadomości:", + "@messagesStyle": {}, + "chatDescription": "Opis czatu", + "@chatDescription": {}, + "invalidServerName": "Nieprawidłowa nazwa serwera", + "@invalidServerName": {}, + "chatPermissions": "Uprawnienia w czacie", + "@chatPermissions": {}, + "signInWithPassword": "Zaloguj się z hasłem", + "@signInWithPassword": {}, + "setChatDescription": "Ustaw opis czatu", + "@setChatDescription": {}, + "importFromZipFile": "Zaimportuj z pliku .zip", + "@importFromZipFile": {}, + "redactedBy": "Usunięte przez {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "signInWith": "Zaloguj się z {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...", + "@optionalRedactReason": {}, + "exportEmotePack": "Eksportuj pakiet emotikonów jako .zip", + "@exportEmotePack": {}, + "inviteContactToGroupQuestion": "Czy chcesz zaprosić {contact} do czatu „{groupName}”?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Usunięte przez {username} z powodu „{reason}”", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "redactMessageDescription": "Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.", + "@redactMessageDescription": {}, + "invalidInput": "Nieprawidłowe dane!", + "@invalidInput": {}, + "report": "zgłoś", + "@report": {}, + "addChatDescription": "Dodaj opis tego czatu...", + "@addChatDescription": {}, + "directChat": "Czat bezpośredni", + "@directChat": {}, + "wrongPinEntered": "Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za {seconds} sekund...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Wysyłaj powiadomienie o pisaniu", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Zaproszenie do rozmowy prywatnej", + "@invitePrivateChat": {}, + "importEmojis": "Zaimportuj emotikony", + "@importEmojis": {}, + "noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.", + "@noChatDescriptionYet": {}, + "notAnImage": "To nie jest plik obrazu.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "Zmieniono opis czatu", + "@chatDescriptionHasBeenChanged": {}, + "profileNotFound": "Nie można odnaleźć użytkownika na serwerze. Być może wystąpił problem z połączeniem lub użytkownik nie istnieje.", + "@profileNotFound": {}, + "shareInviteLink": "Udostępnij link z zaproszeniem", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Ustaw wygląd:", + "@setTheme": {}, + "replace": "Zastąp", + "@replace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Spróbuj ponownie później lub wybierz inny serwer.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Utwórz grupę", + "@createGroup": {}, + "importNow": "Zaimportuj", + "@importNow": {}, + "invite": "Zaproszenie", + "@invite": {}, + "block": "Zablokuj", + "@block": {}, + "blockedUsers": "Zablokowani użytkownicy", + "@blockedUsers": {}, + "blockUsername": "Ignoruj użytkownika", + "@blockUsername": {}, + "publicLink": "Link publiczny", + "@publicLink": {}, + "transparent": "Przezroczystość", + "@transparent": {}, + "select": "Zaznacz", + "@select": {}, + "calls": "Połączenia", + "@calls": {}, + "overview": "Podsumowanie", + "@overview": {}, + "learnMore": "Dowiedz się więcej", + "@learnMore": {}, + "groupName": "Nazwa grupy", + "@groupName": {}, + "startConversation": "Rozpocznij rozmowę", + "@startConversation": {}, + "newPassword": "Nowe hasło", + "@newPassword": {}, + "thisDevice": "To urządzenie:", + "@thisDevice": {}, + "gallery": "Galeria", + "@gallery": {}, + "files": "Pliki", + "@files": {}, + "discover": "Odkrywaj", + "@discover": {}, + "restricted": "Ograniczone", + "@restricted": {}, + "decline": "Odmów", + "@decline": {}, + "nothingFound": "Nic nie odnaleziono...", + "@nothingFound": {}, + "stickers": "Naklejki", + "@stickers": {}, + "noChatsFoundHere": "Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️", + "@noChatsFoundHere": {}, + "hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Ukryj zmiany członkostwa w publicznych czatach", + "@hideMemberChangesInPublicChats": {}, + "passwordRecoverySettings": "Ustawienia odzyskiwania hasła", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChatsBody": "W celu poprawienia czytelności, nie pokazuj w historii publicznego czatu, czy ktoś do niego dołączył lub go opuścił.", + "@hideMemberChangesInPublicChatsBody": {}, + "presenceStyle": "Obecność:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "invitedBy": "Zaproszony/-a przez {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "archiveRoomDescription": "Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.", + "@archiveRoomDescription": {}, + "yourGlobalUserIdIs": "Twój globalny identyfikator to: ", + "@yourGlobalUserIdIs": {}, + "canceledKeyVerification": "{sender} anulował/-a weryfikację kluczy", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} jest gotowy/-a do weryfikacji kluczy", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "commandHint_ignore": "Ignoruj podany identyfikator Matrix", + "@commandHint_ignore": {}, + "commandHint_unignore": "Przestań ignorować podany identyfikator Matrix", + "@commandHint_unignore": {}, + "changeTheChatPermissions": "Zmień uprawnienia w czacie", + "@changeTheChatPermissions": {}, + "changelog": "Lista zmian", + "@changelog": {}, + "inviteOtherUsers": "Zaproś innych użytkowników do tego czatu", + "@inviteOtherUsers": {}, + "blockListDescription": "Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.", + "@blockListDescription": {}, + "formattedMessages": "Sformatowane wiadomości", + "@formattedMessages": {}, + "banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.", + "@banUserDescription": {}, + "subspace": "Podprzestrzeń", + "@subspace": {}, + "sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości", + "@sendReadReceipts": {}, + "verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie", + "@verifyOtherDevice": {}, + "prepareSendingAttachment": "Przygotuj wysyłanie załącznika...", + "@prepareSendingAttachment": {}, + "acceptedKeyVerification": "{sender} zaakceptował/-a weryfikację kluczy", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "databaseMigrationTitle": "Baza danych jest zoptymalizowana", + "@databaseMigrationTitle": {}, + "hasKnocked": "{user} zapukał-/a", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "userLevel": "{level} - Użytkownik", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeTheVisibilityOfChatHistory": "Zmień widoczność historii czatu", + "@changeTheVisibilityOfChatHistory": {}, + "sendImages": "Wyślij {count} obrazów", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Nie utworzono jeszcze żadnego publicznego linku", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Zapukaj", + "@knock": {}, + "databaseBuildErrorBody": "Nie udało się utworzyć bazy danych SQLite. Aplikacja na razie spróbuje korzystać ze starej bazy. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Aplikacja spróbuje teraz odzyskać Twoją sesję z kopii zapasowej. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "startedKeyVerification": "{sender} rozpoczął/-ęła weryfikację kluczy", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "sendTypingNotificationsDescription": "Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.", + "@sendReadReceiptsDescription": {}, + "noDatabaseEncryption": "Szyfrowanie bazy danych nie jest obsługiwane na tej platformie", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Obecnie jest {count} zablokowanych użytkowników.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "goToSpace": "Przejdź do przestrzeni {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Oznacz jako nieprzeczytane", + "@markAsUnread": {}, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "sendRoomNotifications": "Wysyłaj powiadomienia @room", + "@sendRoomNotifications": {}, + "chatPermissionsDescription": "Ustal jaki poziom uprawnień jest wymagany dla określonych czynności w czacie. Poziomy uprawnień 0, 50 i 100 zwykle dotyczą odpowiednio użytkowników, moderatorów i administratorów, ale możliwa jest dowolna gradacja.", + "@chatPermissionsDescription": {}, + "changeTheCanonicalRoomAlias": "Zmień główny publiczny czatu", + "@changeTheCanonicalRoomAlias": {}, + "changeTheDescriptionOfTheGroup": "Zmień opis czatu", + "@changeTheDescriptionOfTheGroup": {}, + "sendCanceled": "Anulowano wysyłanie", + "@sendCanceled": {}, + "homeserverDescription": "Wszystkie Twoje dane trzymane są na serwerze domowym, jak u dostawców usług e-mail. Możesz wybrać swój serwer domowy i nadal rozmawiać ze wszystkimi. Dowiedz się więcej na https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Obliczanie rozmiaru pliku...", + "@calculatingFileSize": {}, + "sendingAttachment": "Wysyłanie załącznika...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Generowanie podglądu filmu...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Kompresowanie filmu...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Wysyłanie {index} z {length} części załącznika...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "welcomeText": "No cześć! 👋 Tutaj FluffyChat. Możesz zapisać się do dowolnego serwera domowego, kompatybilnego z https://matrix.org i rozmawiać ze wszystkimi. To duża zdecentralizowana sieć czatów!", + "@welcomeText": {}, + "blur": "Rozmazanie:", + "@blur": {}, + "opacity": "Przezroczystość:", + "@opacity": {}, + "setWallpaper": "Ustaw tapetę", + "@setWallpaper": {}, + "manageAccount": "Zarządzaj kontem", + "@manageAccount": {}, + "noContactInformationProvided": "Serwer nie dostarcza żadnych poprawnych danych kontaktowych", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Skontaktuj się z administratorem serwera", + "@contactServerAdmin": {}, + "compress": "Skompresuj", + "@compress": {}, + "pleaseFillOut": "Proszę wypełnić", + "@pleaseFillOut": {}, + "invalidUrl": "Niepoprawny adres URL", + "@invalidUrl": {}, + "unableToJoinChat": "Nie udało się dołączyć do czatu. Może druga strona zakończyła już rozmowę?", + "@unableToJoinChat": {}, + "aboutHomeserver": "O {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "updateInstalled": "🎉 Zainstalowano aktualizację do wersji {version}!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "continueText": "Kontynuuj", + "@continueText": {}, + "noticeChatBackupDeviceVerification": "Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.", + "@noticeChatBackupDeviceVerification": {}, + "serverLimitReached": "Osiągnięto limit serwera. Czekanie {seconds} sekund...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Tylko kiedy Twoje urządzenie nie jest zweryfikowane", + "@oneOfYourDevicesIsNotVerified": {}, + "supportPage": "Strona obsługi użytkownika", + "@supportPage": {}, + "serverInformation": "Informacje o serwerze:", + "@serverInformation": {}, + "name": "Nazwa", + "@name": {}, + "website": "Strona internetowa", + "@website": {}, + "contactServerSecurity": "Skontaktuj się z działem bezpieczeństwa serwera", + "@contactServerSecurity": {}, + "version": "Wersja", + "@version": {}, + "accessAndVisibility": "Dostęp i widoczność", + "@accessAndVisibility": {}, + "customEmojisAndStickers": "Własne emotikony i naklejki", + "@customEmojisAndStickers": {}, + "globalChatId": "Globalny identyfikator czatu", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Nie pokazuj usuniętych wiadomości", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości", + "@hideInvalidOrUnknownMessageFormats": {}, + "notifyMeFor": "Powiadom mnie o", + "@notifyMeFor": {}, + "pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne", + "@pushNotificationsNotAvailable": {}, + "noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "Czat będzie można znaleźć, szukając na {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "publicSpaces": "Przestrzenie publiczne", + "@publicSpaces": {}, + "searchMore": "Szukaj dalej...", + "@searchMore": {}, + "formattedMessagesDescription": "Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Zweryfikuj innego użytkownika", + "@verifyOtherUser": {}, + "knockRestricted": "Pukanie jest ograniczone", + "@knockRestricted": {}, + "appLockDescription": "Zablokuj aplikację pinem kiedy nie jest używana", + "@appLockDescription": {}, + "knocking": "Pukanie", + "@knocking": {}, + "pleaseChooseAStrongPassword": "Proszę wybrać silne hasło", + "@pleaseChooseAStrongPassword": {}, + "usersMustKnock": "Użytkownicy muszą zapukać", + "@usersMustKnock": {}, + "noOneCanJoin": "Nikt nie może dołączyć", + "@noOneCanJoin": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "swipeRightToLeftToReply": "Przeciągnij w lewo, by odpowiedzieć", + "@swipeRightToLeftToReply": {}, + "presencesToggle": "Pokazuj zmiany statusów innych użytkowników", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "hidePresences": "Ukryć listę statusów?", + "@hidePresences": {}, + "pleaseEnterANumber": "Proszę podać liczbę większą od 0", + "@pleaseEnterANumber": {}, + "commandHint_sendraw": "Wyślij zwykły JSON", + "@commandHint_sendraw": {}, + "databaseMigrationBody": "Proszę czekać. Może to potrwać chwilę.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Pozostaw puste, aby wyczyścić swój status.", + "@leaveEmptyToClearStatus": {}, + "sessionLostBody": "Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "forwardMessageTo": "Przekazać wiadomość do {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "publicChatAddresses": "Adresy publicznych czatów", + "@publicChatAddresses": {}, + "createNewAddress": "Utwórz nowy adres", + "@createNewAddress": {}, + "userRole": "Rola użytkownika/-czki", + "@userRole": {}, + "completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "italicText": "Kursywa", + "@italicText": {}, + "boldText": "Pogrubienie", + "@boldText": {}, + "strikeThrough": "Przekreślenie", + "@strikeThrough": {}, + "incomingMessages": "Wiadomości przychodzące", + "@incomingMessages": {}, + "discoverHomeservers": "Odkrywaj serwery domowe", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Czym jest serwer domowy?", + "@whatIsAHomeserver": {}, + "loginWithMatrixId": "Zaloguj się identyfikatorem Matrix", + "@loginWithMatrixId": {}, + "passwordsDoNotMatch": "Hasła się nie zgadzają", + "@passwordsDoNotMatch": {}, + "unbanUserDescription": "Użytkownik będzie w stanie dołączyć do czatu ponownie.", + "@unbanUserDescription": {}, + "roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "userWouldLikeToChangeTheChat": "{user} chce dołączyć do czatu.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "changeGeneralChatSettings": "Zmień ogólne ustawienia czatu", + "@changeGeneralChatSettings": {}, + "youInvitedToBy": "Otrzymałeś/-aś link z zaproszeniem do:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳", + "@verifyOtherDeviceDescription": {}, + "unreadChatsInApp": "{appname}: {unread} nieprzeczytanych czatów", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "addLink": "Dodaj link", + "@addLink": {}, + "unread": "Nieprzeczytane", + "@unread": {}, + "space": "Przestrzeń", + "@space": {}, + "spaces": "Przestrzenie", + "@spaces": {}, + "countChatsAndCountParticipants": "{participants}{chats} czatów i {participants} uczestników", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Nie znaleziono więcej czatów...", + "@noMoreChatsFound": {}, + "joinedChats": "Czaty, do których dołączono", + "@joinedChats": {}, + "removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.", + "@removeDevicesDescription": {}, + "makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.", + "@makeAdminDescription": {}, + "searchChatsRooms": "Szukaj #czatów, @użytkowników...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Utwórz grupę i zaproś użytkowników", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Grupa może być znaleziona poprzez wyszukiwanie", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Niestety to nie wygląda na poprawny klucz odzyskiwania.", + "@wrongRecoveryKey": {}, + "searchForUsers": "Szukaj @użytkowników...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Proszę podać swoje obecne hasło", + "@pleaseEnterYourCurrentPassword": {}, + "passwordIsWrong": "Podano niepoprawne hasło", + "@passwordIsWrong": {}, + "joinSpace": "Dołącz do przestrzeni", + "@joinSpace": {}, + "addChatOrSubSpace": "Dodaj czat lub podprzestrzeń", + "@addChatOrSubSpace": {}, + "initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji", + "@initAppError": {}, + "minimumPowerLevel": "{level} jest minimalnym poziomem uprawnień.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "searchIn": "Szukaj w czacie \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "kickUserDescription": "Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.", + "@kickUserDescription": {} } diff --git a/assets/l10n/intl_pt.arb b/assets/l10n/intl_pt.arb index 8246d81497..c6deaff388 100644 --- a/assets/l10n/intl_pt.arb +++ b/assets/l10n/intl_pt.arb @@ -1,3 +1,1903 @@ { - "@@last_modified": "2021-08-14 12:41:09.940318" + "@@last_modified": "2021-08-14 12:41:09.940318", + "copiedToClipboard": "Copiada para a área de transferência", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "login": "Iniciar sessão", + "@login": { + "type": "text", + "placeholders": {} + }, + "about": "Sobre", + "@about": { + "type": "text", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "text", + "placeholders": {} + }, + "areYouSure": "Tens a certeza?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "text", + "placeholders": {} + }, + "account": "Conta", + "@account": { + "type": "text", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "text", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "help": "Ajuda", + "@help": { + "type": "text", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "text", + "placeholders": {} + }, + "reason": "Razão", + "@reason": { + "type": "text", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "text", + "placeholders": {} + }, + "openCamera": "Abrir câmara", + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "settings": "Configurações", + "@settings": { + "type": "text", + "placeholders": {} + }, + "logout": "Terminar sessão", + "@logout": { + "type": "text", + "placeholders": {} + }, + "search": "Pesquisar", + "@search": { + "type": "text", + "placeholders": {} + }, + "users": "Utilizadores", + "@users": {}, + "close": "Fechar", + "@close": { + "type": "text", + "placeholders": {} + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@addAccount": {}, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "text", + "placeholders": {} + }, + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "text", + "placeholders": {} + }, + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@encryption": { + "type": "text", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@password": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "@remove": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@alias": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "text", + "placeholders": {} + }, + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@copy": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "text", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@username": { + "type": "text", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "@verified": { + "type": "text", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "@callingPermissions": {}, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "text", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@ignore": { + "type": "text", + "placeholders": {} + }, + "@recording": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@moderator": { + "type": "text", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@send": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "@banned": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@chat": { + "type": "text", + "placeholders": {} + }, + "@group": { + "type": "text", + "placeholders": {} + }, + "@leave": { + "type": "text", + "placeholders": {} + }, + "@skip": { + "type": "text", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@allChats": { + "type": "text", + "placeholders": {} + }, + "@reportUser": {}, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@license": { + "type": "text", + "placeholders": {} + }, + "@addToSpace": {}, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@forward": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "text", + "placeholders": {} + }, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "text", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@you": { + "type": "text", + "placeholders": {} + }, + "@notAnImage": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@scanQrCode": {}, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@security": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "text", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@archive": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "@devices": { + "type": "text", + "placeholders": {} + }, + "@accept": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@share": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "@verify": { + "type": "text", + "placeholders": {} + }, + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@pin": { + "type": "text", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@unsupportedAndroidVersionLong": {}, + "@storeSecurlyOnThisDevice": {}, + "@ok": { + "type": "text", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@screenSharingDetail": {}, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "text", + "placeholders": {} + } } \ No newline at end of file diff --git a/assets/l10n/intl_pt_BR.arb b/assets/l10n/intl_pt_BR.arb index 0b2993a879..95ba83675a 100644 --- a/assets/l10n/intl_pt_BR.arb +++ b/assets/l10n/intl_pt_BR.arb @@ -10,7 +10,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} aceitou o convite", + "acceptedTheInvitation": "👍 {username} aceitou o convite", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -22,12 +22,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Dados da conta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ativou a criptografia ponta-a-ponta", + "activatedEndToEndEncryption": "🔐 {username} ativou a criptografia ponta-a-ponta", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -39,16 +34,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Adicionar uma descrição para o grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Adicionar novo(a) amigo(a)", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Admin", "@admin": { "type": "text", @@ -69,11 +54,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Você já possui uma conta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} atendeu à chamada", "@answeredTheCall": { "type": "text", @@ -96,11 +76,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Sala arquivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Usuários convidados podem participar", "@areGuestsAllowedToJoin": { "type": "text", @@ -116,21 +91,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Por favor, insira sua frase secreta ou chave de recuperação para serem guardadas.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Para poder validar a outra pessoa, por favor, insira sua frase secreta ou chave de recuperação.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Por favor, insira a frase secreta ou chave de recuperação para verificar sua sessão.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Aceitar esta solicitação de verificação de {username}?", "@askVerificationRequest": { "type": "text", @@ -138,31 +103,11 @@ "username": {} } }, - "audioPlayerPause": "Pausar", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Tocar", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticação", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Reproduzir automaticamente figurinhas animadas e emojis", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar alterado", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "O servidor matriz suporta os tipos de login:\n{serverVersions}\nMas este app suporta apenas:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -212,11 +157,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Chaves guardadas", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "text", @@ -338,21 +278,11 @@ "username": {} } }, - "changelog": "Lista de mudanças", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Alterar a senha", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Alterações foram salvas", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Alterar o servidor matriz", "@changeTheHomeserver": { "type": "text", @@ -368,16 +298,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Alterar o servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Alterar o pano de fundo", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Alterar seu avatar", "@changeYourAvatar": { "type": "text", @@ -398,7 +318,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "O backup da sua conversa é protegido com sua chave de segurança. Por favor, evite perdê-la.", + "chatBackupDescription": "Suas mensagens antigas são protegidas com sua chave de recuperação. Por favor, evite perdê-la.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -418,18 +338,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Escolha um nome de usuário", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Limpar arquivo", "@clearArchive": {}, - "clearText": "Limpar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Fechar", "@close": { "type": "text", @@ -517,12 +427,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Compare e certifique-se que os seguintes emojis batem com os do outro dispositivo:", + "compareEmojiMatch": "Por favor compare os emojis", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Compare e certifique-se de que os seguintes números batem com os do outro dispositivo:", + "compareNumbersMatch": "Por favor compare os números", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -542,11 +452,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "A tentativa de conexão falhou", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "O contato foi convidado ao grupo", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -567,11 +472,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Visualizador de conteúdo", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copiado para área de transferência", "@copiedToClipboard": { "type": "text", @@ -594,16 +494,6 @@ "error": {} } }, - "couldNotSetAvatar": "Não foi possível fixar o avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Não foi possível fixar o nome de exibição", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participantes", "@countParticipants": { "type": "text", @@ -616,38 +506,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Criar conta agora", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} criou a conversa", + "createdTheChat": "💬 {username} criou a conversa", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Novo grupo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Novo espaço", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Assinatura cruzada desativada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Assinatura cruzada ativada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Ativo", "@currentlyActive": { "type": "text", @@ -708,11 +578,6 @@ "type": "text", "placeholders": {} }, - "deny": "Rejeitar", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Dispositivo", "@device": { "type": "text", @@ -728,46 +593,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "A criptografia só é segura quando todos os dispositivos forem verificados.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Conversas diretas", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Descartar imagem", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Desvendar", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Desvendar grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "O nome de exibição foi alterado", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Doar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar e não perguntar novamente", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Baixar arquivo", "@downloadFile": { "type": "text", @@ -783,21 +618,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Editar permissões da conversa", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Editar nome de exibição", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Alterar a instância Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Editar cognome da sala", "@editRoomAliases": { "type": "text", @@ -843,11 +668,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Habilite o backup de conversas para nunca perder acesso a elas.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Habilitar globalmente o pacote de emoji", "@enableEmotesGlobally": { "type": "text", @@ -873,21 +693,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritmo criptográfico", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "A criptografia não está habilitada", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Configuração da criptografia ponta-a-ponta", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} finalizou a chamada", "@endedTheCall": { "type": "text", @@ -895,23 +705,11 @@ "senderName": {} } }, - "enterAGroupName": "Insira um nome de grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Inserir endereço de e-mail", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Insira um nome pro espaço", - "@enterASpacepName": {}, - "enterAUsername": "Insira um nome de usuário", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Insira um servidor matriz", "@enterYourHomeserver": { "type": "text", @@ -939,11 +737,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Tamanho do arquivo", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -959,16 +752,6 @@ "type": "text", "placeholders": {} }, - "friday": "Sexta-feira", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amigos", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Desde que entrou", "@fromJoining": { "type": "text", @@ -989,16 +772,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Descrição do grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descrição do grupo alterada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Grupo público", "@groupIsPublic": { "type": "text", @@ -1049,11 +822,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Servidor matriz não é compatível", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "O quão ofensivo é este conteúdo?", "@howOffensiveIsThisContent": { "type": "text", @@ -1079,16 +847,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Você pode ignorar usuários que estão lhe pertubando. Não será possível receber mensagens ou convites de usuários na sua lista pessoal de ignorados.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorar usuário", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Eu cliquei no link", "@iHaveClickedOnLink": { "type": "text", @@ -1104,11 +862,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Email inválido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Convidar contato", "@inviteContact": { "type": "text", @@ -1126,7 +879,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} convidou {targetName}", + "invitedUser": "📩 {username} convidou {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1144,7 +897,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} convidou você para o FluffyChat. \n1. Instale o FluffyChat: https://fluffychat.im \n2. Entre ou crie uma conta \n3. Abra o link do convite: {link}", + "inviteText": "{username} convidou você para o FluffyChat. \n1. Visite fluffychat.im e instale o aplicativo\n2. Entre ou crie uma conta \n3. Abra o link do convite:\n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1152,17 +905,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "A seguinte chave de dispositivo está correta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "está escrevendo…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} entrou na conversa", + "joinedTheChat": "👋 {username} entrou na conversa", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1174,17 +922,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Chaves guardadas", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Chaves faltando", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} enxotou {targetName}", + "kicked": "👞 {username} enxotou {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1192,7 +930,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} expulsou e baniu {targetName}", + "kickedAndBanned": "🙅 {username} expulsou e baniu {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1212,16 +950,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Último IP conhecido", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto há muito tempo atrás", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Sair", "@leave": { "type": "text", @@ -1281,33 +1009,11 @@ "homeserver": {} } }, - "loginWith": "Entrar com {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Encerrar sessão", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Atribuir papel de moderador", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Atribuir papel de admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Certifique-se de que a identificação é válida", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Alterações de membros", "@memberChanges": { "type": "text", @@ -1323,28 +1029,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Mensagem será removida para todos os participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderador", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Segunda-feira", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Mais 1 evento} other{Mais {count} eventos}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Silenciar", "@muteChat": { "type": "text", @@ -1360,7 +1049,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nova mensagem no FluffyChat", + "newMessageInFluffyChat": "💬 Nova mensagem no FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1385,16 +1074,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat atualmente não suporta a habilitação de assinatura cruzada. Por favor, habilite via Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sem descrição", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Nenhum emoji encontrado. 😕", "@noEmotesFound": { "type": "text", @@ -1405,7 +1084,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Aparentemente você não tem serviços Google no seu celular. Boa decisão para a sua privacidade! Para receber notificações no FluffyChat, recomendamos usar https://microg.org/ ou https://unifiedpush.org.", + "noGoogleServicesWarning": "Aparentemente você não tem serviços Google no seu celular. Para receber notificações no FluffyChat, recomendamos instalar ntfy.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1418,11 +1097,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Por favor, habilite o backup de chaves via Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Nenhum", "@none": { "type": "text", @@ -1438,21 +1112,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Não foram encontradas salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Nenhuma sala encontrada…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Nenhum status encontrado por enquanto.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notificações", "@notifications": { "type": "text", @@ -1463,18 +1127,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Sem suporte na versão Web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selecionados", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} usuários estão digitando…", "@numUsersTyping": { "type": "text", @@ -1507,11 +1159,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Backup de chaves está desabilitado", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Backup de chaves está ativado", "@onlineKeyBackupEnabled": { "type": "text", @@ -1542,16 +1189,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Opcional) Seu endereço de email", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcional) Nome do Grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Ou", "@or": { "type": "text", @@ -1562,11 +1199,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Dispositivos dos participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "frase secreta ou chave de recuperação", "@passphraseOrKey": { "type": "text", @@ -1624,11 +1256,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Por favor, escolha um nome de usuário", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Por favor, clique a ligação no e-mail para prosseguir.", "@pleaseClickOnLink": { "type": "text", @@ -1639,16 +1266,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Por favor, insira o ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Por favor, insira sua chave de segurança:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Por favor, insira sua senha", "@pleaseEnterYourPassword": { "type": "text", @@ -1674,26 +1291,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Grupos Públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chave Pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Salas públicas", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Espaço público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Regras de notificação", "@pushRules": { "type": "text", @@ -1770,11 +1372,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Remover mensagem", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Remover seu avatar", "@removeYourAvatar": { "type": "text", @@ -1805,16 +1402,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Solicitar leitura de mensagens antigas", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revogar todas permissões", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Sala foi atualizada", "@roomHasBeenUpgraded": { "type": "text", @@ -1825,53 +1412,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Salvar arquivo como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Salvar arquivo", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Salvar arquivo nesta pasta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Buscar", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Buscar uma conversa", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Segurança", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Chave de segurança", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Chave de segurança perdida?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Visto por {username}", "@seenByUser": { "type": "text", @@ -1879,22 +1434,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Visto por {username} e mais {count} pessoas}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto por {username} e {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Enviar", "@send": { "type": "text", @@ -1914,11 +1453,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Permitir envio de falhas via sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Enviar arquivo", "@sendFile": { "type": "text", @@ -1949,35 +1483,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} enviou um arquivo", + "sentAFile": "📁 {username} enviou um arquivo", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} enviou um audio", + "sentAnAudio": "🎤 {username} enviou um audio", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} enviou uma imagem", + "sentAPicture": "🖼️ {username} enviou uma imagem", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} enviou uma figurinha", + "sentASticker": "😊 {username} enviou uma figurinha", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} enviou um vídeo", + "sentAVideo": "🎥 {username} enviou um vídeo", "@sentAVideo": { "type": "text", "placeholders": { @@ -1991,21 +1525,6 @@ "senderName": {} } }, - "sentryInfo": "Informações sobre a sua privacidade: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessão verificada", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Fixar uma imagem de perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Fixar como cognome principal", "@setAsCanonicalAlias": { "type": "text", @@ -2016,11 +1535,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Fixar uma descrição do grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Enviar link de convite", "@setInvitationLink": { "type": "text", @@ -2063,11 +1577,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Registrar", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Identidade Única", "@singlesignon": { "type": "text", @@ -2078,11 +1587,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Som, vibração e cor LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Código fonte", "@sourceCode": { "type": "text", @@ -2105,11 +1609,6 @@ "senderName": {} } }, - "startYourFirstChat": "Inicie sua primeira conversa agora mesmo! 🙂\n- Pressione 'Nova conversa'\n- Escaneie o código QR de um(a) amigo(a)\n- Divirta-se conversando", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Status", "@status": { "type": "text", @@ -2125,11 +1624,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Domingo", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Sincronizando… Por favor, aguarde.", "@synchronizingPleaseWait": { "type": "text", @@ -2140,21 +1634,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Toque num dispositivo para verificar", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Toque para mostrar a imagem", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toque para mostrar o menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Não correspondem", "@theyDontMatch": { "type": "text", @@ -2165,26 +1644,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Esta sala foi arquivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Quinta-feira", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2221,11 +1680,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Terça-feira", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Indisponível", "@unavailable": { "type": "text", @@ -2261,16 +1715,6 @@ "type": {} } }, - "unknownSessionVerify": "Sessão desconhecida, favor verificar", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Destrancar o backup da conversa", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Cancelar silenciamento", "@unmuteChat": { "type": "text", @@ -2288,18 +1732,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 mensagem não lida} other{{unreadEvents} mensagens não lidas}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Usar cores compatíveis com AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} e mais {count} pessoas estão digitando…", "@userAndOthersAreTyping": { "type": "text", @@ -2323,7 +1755,7 @@ "username": {} } }, - "userLeftTheChat": "{username} saiu da conversa", + "userLeftTheChat": "🚪 {username} saiu da conversa", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2335,11 +1767,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Usuário(a) não verificado(a)", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} enviou um evento {type}", "@userSentUnknownEvent": { "type": "text", @@ -2348,36 +1775,16 @@ "type": {} } }, - "userUnknownVerification": "Usuário(a) tem um status de verificação desconhecido", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Usuário(a) verificado(a)", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Verificado", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Sessão verificada com sucesso!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verificar", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verificar manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Iniciar verificação", "@verifyStart": { "type": "text", @@ -2393,11 +1800,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verificar usuário", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Vídeochamada", "@videoCall": { "type": "text", @@ -2438,7 +1840,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Pano de fundo", + "wallpaper": "Pano de fundo:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2448,21 +1850,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Criptografia ponta-a-ponta está em fase beta! Use por sua própria conta e risco!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Quarta-feira", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bem-vindo(a) ao mensageiro mais fofo da rede Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Enviamos um e-mail para você", "@weSentYouAnEmail": { "type": "text", @@ -2483,7 +1870,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "Limpar o backup da conversa para criar uma nova chave de segurança?", + "wipeChatBackup": "Limpar o backup da conversa para criar uma nova chave de recuperação?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2508,83 +1895,29 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Você foi convidada(o) a esta conversa", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Você não está mais participando desta conversa", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Você não pode se autoconvidar", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Você foi banido desta conversa", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Sua conversas estão sendo sincronizadas…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Seu próprio nome de usuário", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Sua chave pública", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Você se conectará a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Ampliar", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Reduzir", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "createNewChatExplaination": "Apenas escaneie o código QR ou compartilhe o link do convite se estiverem próximos entre si.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Compartilhar o link do convite", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Digitar o link do convite manualmente...", - "@typeInInviteLinkManually": {}, "oneClientLoggedOut": "Um dos seus clientes foi desvinculado", "@oneClientLoggedOut": {}, "addAccount": "Adicionar conta", "@addAccount": {}, "unverified": "Não verificado", "@unverified": {}, - "bubbleSize": "Tamanho do balão", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "yourChatBackupHasBeenSetUp": "Seu backup de conversas foi configurado.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Para proteger suas mensagens, nós geramos uma chave de segurança para você.\nPor favor, guarde-a num lugar seguro, como um gerenciador de senhas.", - "@setupChatBackupDescription": {}, - "removeFromSpaceDescription": "Isto remove esta conversa do atual espaço. Ela continuará visível sob \"Todas conversas\".", - "@removeFromSpaceDescription": {}, - "newPasswordDescription": "Para poder recuperar a sua senha, você deve posteriormente cadastrar um email na sua conta.", - "@newPasswordDescription": {}, "editBundlesForAccount": "Editar coleções para esta conta", "@editBundlesForAccount": {}, "serverRequiresEmail": "Este servidor precisa validar seu email para efetuar o registro.", @@ -2595,70 +1928,22 @@ "@sender": {}, "publish": "Publicar", "@publish": {}, - "storyPrivacyWarning": "Por favor, note que pessoas podem ver e contactar umas às outras no seu painel. Ele ficará visível por apenas 24 horas, mas não há garantias de que será apagado por todos dispositivos e servidores.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Eu compreendo", - "@iUnderstand": {}, - "yourStory": "Seu painel", - "@yourStory": {}, - "replyHasBeenSent": "Resposta enviada", - "@replyHasBeenSent": {}, "removeFromSpace": "Remover do espaço", "@removeFromSpace": {}, - "loginWithOneClick": "Entrar com um clique", - "@loginWithOneClick": {}, - "storyFrom": "Painel de {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Por favor, note que pessoas podem ver e contactar umas às outras no seu painel.", - "@whoCanSeeMyStoriesDesc": {}, "link": "Link", "@link": {}, "start": "Começar", "@start": {}, - "setupChatBackupNow": "Configurar seu backup de conversas agora", - "@setupChatBackupNow": {}, - "whatIsGoingOn": "O que está acontecendo?", - "@whatIsGoingOn": {}, - "addDescription": "Adicionar descrição", - "@addDescription": {}, - "passwordsDoNotMatch": "Senhas diferentes!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Por favor, insira um email válido.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Repita a senha", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Por favor, use ao menos {min} caracteres.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "addToSpace": "Adicionar ao espaço", "@addToSpace": {}, "sendOnEnter": "Enviar ao pressionar enter", "@sendOnEnter": {}, "homeserver": "Servidor matriz", "@homeserver": {}, - "yourUserId": "Seu ID de usuário:", - "@yourUserId": {}, - "setupChatBackup": "Configurar backup da conversa", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Eu anotei a chave", - "@iWroteDownTheKey": {}, "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "A conversa foi removida deste espaço", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "commandHint_clearcache": "Limpar dados temporários", "@commandHint_clearcache": { "type": "text", @@ -2681,8 +1966,6 @@ }, "scanQrCode": "Escanear o código QR", "@scanQrCode": {}, - "newUsernameDescription": "Seu ID de usuário(a) deve ter o formato @usuario:nomedoservidor", - "@newUsernameDescription": {}, "openVideoCamera": "Abra a câmera para um vídeo", "@openVideoCamera": { "type": "text", @@ -2704,18 +1987,6 @@ "@openGallery": {}, "addToSpaceDescription": "Selecione um espaço para adicionar esta conversa.", "@addToSpaceDescription": {}, - "pleaseEnterSecurityKeyDescription": "Para destravar seu backup de conversas, por favor, insira sua chave de segurança gerada na sessão anterior. Sua chave de segurança NÃO é a sua senha.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Salvar a chave de segurança agora", - "@saveTheSecurityKeyNow": {}, - "addToStory": "Adicionar ao painel", - "@addToStory": {}, - "whoCanSeeMyStories": "Quem pode ver meu painel?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Desinscrever de painéis", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Este(a) usuário(a) ainda não postou no seu painel", - "@thisUserHasNotPostedAnythingYet": {}, "videoWithSize": "Vídeo ({size})", "@videoWithSize": { "type": "text", @@ -2727,9 +1998,7 @@ "@markAsRead": {}, "dismiss": "Descartar", "@dismiss": {}, - "matrixWidgets": "Ferramentas Matrix", - "@matrixWidgets": {}, - "separateChatTypes": "Separar Conversas Diretas, Grupos e Espaços", + "separateChatTypes": "Separar Conversas Diretas e Grupos", "@separateChatTypes": { "type": "text", "placeholders": {} @@ -2742,10 +2011,6 @@ "@emojis": {}, "placeCall": "Chamar", "@placeCall": {}, - "integrationsNotImplemented": "Ainda não é possível editar ferramentas e integrações.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Editar ferramentas e integrações", - "@editIntegrations": {}, "reactedWith": "{sender} reagiu com {reaction}", "@reactedWith": { "type": "text", @@ -2758,8 +2023,6 @@ "@confirmEventUnpin": {}, "pinMessage": "Afixar à sala", "@pinMessage": {}, - "pinnedEventsError": "Erro ao carregar mensagens afixadas", - "@pinnedEventsError": {}, "voiceCall": "Chamada de voz", "@voiceCall": {}, "unsupportedAndroidVersion": "Versão Android não suportada", @@ -2801,15 +2064,6 @@ "@nextAccount": {}, "previousAccount": "Conta anterior", "@previousAccount": {}, - "editWidgets": "Editar ferramentas", - "@editWidgets": {}, - "showSpaces": "Mostrar lista de espaços", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Mostrar Conversas Diretas relacionadas nos Espaços", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "youRejectedTheInvitation": "Você rejeitou o convite", "@youRejectedTheInvitation": {}, "youBannedUser": "Você baniu {user}", @@ -2824,29 +2078,29 @@ "user": {} } }, - "youInvitedBy": "Você foi convidado por {user}", + "youInvitedBy": "📩 Você foi convidado por {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "Você convidou {user}", + "youInvitedUser": "📩 Você convidou {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youAcceptedTheInvitation": "Você aceitou o convite", + "youAcceptedTheInvitation": "👍 Você aceitou o convite", "@youAcceptedTheInvitation": {}, "youJoinedTheChat": "Você entrou na conversa", "@youJoinedTheChat": {}, - "youKicked": "Você expulsou {user}", + "youKicked": "👞 Você expulsou {user}", "@youKicked": { "placeholders": { "user": {} } }, - "youKickedAndBanned": "Você expulsou e baniu {user}", + "youKickedAndBanned": "🙅 Você expulsou e baniu {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2857,5 +2111,599 @@ "placeholders": { "user": {} } - } + }, + "cuddleContent": "{senderName} afagou você", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "pleaseEnterRecoveryKeyDescription": "Para destrancar suas mensagens antigas, por favor, insira sua chave de recuperação gerada numa sessão prévia. Suas chave de recuperação NÃO é sua senha.", + "@pleaseEnterRecoveryKeyDescription": {}, + "indexedDbErrorLong": "Infelizmente, o armazenamento de mensagens não é habilitado por padrão no modo privado.\nPor favor, visite\n- about:config\n- atribua \"true\" a \"dom.indexedDB.privateBrowsing.enabled\"\nDe outro modo, não será possível executar o FluffyChat.", + "@indexedDbErrorLong": {}, + "users": "Usuários", + "@users": {}, + "confirmMatrixId": "Por favor, confirme seu ID Matrix para apagar sua conta.", + "@confirmMatrixId": {}, + "supposedMxid": "Isto deveria ser {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "dehydrateTor": "Usuários TOR: Exportar sessão", + "@dehydrateTor": {}, + "recoveryKey": "Chave de recuperação", + "@recoveryKey": {}, + "recoveryKeyLost": "Perdeu a chave de recuperação?", + "@recoveryKeyLost": {}, + "commandHint_cuddle": "Enviar um afago", + "@commandHint_cuddle": {}, + "commandHint_hug": "Enviar um abraço", + "@commandHint_hug": {}, + "commandHint_googly": "Enviar olhos arregalados", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} enviou olhos arregalados", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} abraçou você", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_markasdm": "Marcar como conversa direta para o ID Matrix dado", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marcar como grupo", + "@commandHint_markasgroup": {}, + "hydrateTor": "Usuários TOR: Importar sessão", + "@hydrateTor": {}, + "hydrateTorLong": "Você exportou sua última sessão no TOR? Importe ela rapidamente e continue conversando.", + "@hydrateTorLong": {}, + "hydrate": "Restaurar a partir de arquivo backup", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Por favor, insira sua chave de recuperação:", + "@pleaseEnterRecoveryKey": {}, + "indexedDbErrorTitle": "Problemas no modo privado", + "@indexedDbErrorTitle": {}, + "storeInSecureStorageDescription": "Guardar a chave de recuperação no armazenamento seguro deste dispositivo.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Salvar esta chave manualmente via compartilhamento do sistema ou área de transferência.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Guardar no cofre do Android", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Guardar no chaveiro da Apple", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Guardar de modo seguro neste dispositivo", + "@storeSecurlyOnThisDevice": {}, + "user": "Usuário", + "@user": {}, + "custom": "Personalizado", + "@custom": {}, + "foregroundServiceRunning": "Esta notificação aparece quando um serviço está executando.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Permissões de chamada", + "@callingPermissions": {}, + "callingAccount": "Conta para chamadas", + "@callingAccount": {}, + "callingAccountDetails": "Permitir que o FluffyChat use o app de chamadas nativo do Android.", + "@callingAccountDetails": {}, + "appearOnTop": "Aparecer no topo", + "@appearOnTop": {}, + "appearOnTopDetails": "Permitir que o app apareça no topo (desnecessário caso FluffyChat já esteja configurado como conta para chamadas)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microfone, câmera e outras permissões do FluffyChat", + "@otherCallingPermissions": {}, + "newGroup": "Novo grupo", + "@newGroup": {}, + "newSpace": "Novo espaço", + "@newSpace": {}, + "enterSpace": "Entrar no espaço", + "@enterSpace": {}, + "enterRoom": "Entrar na conversa", + "@enterRoom": {}, + "allSpaces": "Todos espaços", + "@allSpaces": {}, + "hideUnimportantStateEvents": "Ocultar eventos desimportantes", + "@hideUnimportantStateEvents": {}, + "countFiles": "{count} arquivos", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "doNotShowAgain": "Não mostrar novamente", + "@doNotShowAgain": {}, + "unlockOldMessages": "Destrancar mensagens antigas", + "@unlockOldMessages": {}, + "dehydrate": "Exportar sessão e limpar dispositivo", + "@dehydrate": {}, + "dehydrateWarning": "Esta ação não pode ser desfeita. Certifique-se de que o arquivo backup está guardado e seguro.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "Para usuários TOR, é recomendado exportar a sessão antes de fechar a janela.", + "@dehydrateTorLong": {}, + "whyIsThisMessageEncrypted": "Por que esta mensagem está ilegível?", + "@whyIsThisMessageEncrypted": {}, + "screenSharingTitle": "Compartilhar tela", + "@screenSharingTitle": {}, + "screenSharingDetail": "Você está compartilhando sua tela no FluffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} conversas", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "noKeyForThisMessage": "Isto pode ocorrer caso a mensagem tenha sido enviada antes da entrada na sua conta com este dispositivo.\n\nTambém é possível que o remetente tenha bloqueado o seu dispositivo ou ocorreu algum problema com a conexão.\n\nVocê consegue ler as mensagens em outra sessão? Então, pode transferir as mensagens de lá! Vá em Configurações > Dispositivos e confira se os dispositivos verificaram um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estiverem abertas, as chaves serão transmitidas automaticamente.\n\nNão gostaria de perder suas chaves quando sair ou trocar de dispositivos? Certifique-se que o backup de conversas esteja habilitado nas configurações.", + "@noKeyForThisMessage": {}, + "allRooms": "Todos os Chats em Grupo", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "notAnImage": "Não é uma imagem.", + "@notAnImage": {}, + "importNow": "Importar agora", + "@importNow": {}, + "importEmojis": "Importar Emojis", + "@importEmojis": {}, + "importFromZipFile": "Importar de arquivo .zip", + "@importFromZipFile": {}, + "sendTypingNotifications": "Enviar notificações de digitação", + "@sendTypingNotifications": {}, + "startFirstChat": "Comece seu primeiro chat", + "@startFirstChat": {}, + "exportEmotePack": "Exportar pacote de Emotes como .zip", + "@exportEmotePack": {}, + "replace": "Substituir", + "@replace": {}, + "jumpToLastReadMessage": "Pular para a última mensagem lida", + "@jumpToLastReadMessage": {}, + "reportErrorDescription": "😭 Ah, não. Algo deu errado. Se quiser, pode relatar isto aos desenvolvedores.", + "@reportErrorDescription": {}, + "setColorTheme": "Aplicar paleta de cor:", + "@setColorTheme": {}, + "banUserDescription": "O usuário será banido da conversa e não poderá participar novamente até que isto seja revogado.", + "@banUserDescription": {}, + "removeDevicesDescription": "Você encerrará a sessão neste dispositivo e não poderá mais receber mensagens.", + "@removeDevicesDescription": {}, + "tryAgain": "Tente novamente", + "@tryAgain": {}, + "unbanUserDescription": "O usuário poderá ingressar novamente na conversa, caso tente.", + "@unbanUserDescription": {}, + "messagesStyle": "Mensagens:", + "@messagesStyle": {}, + "newSpaceDescription": "Espaços permitem que você consolide suas conversas e construa comunidades públicas ou privadas.", + "@newSpaceDescription": {}, + "chatDescription": "Descrição da conversa", + "@chatDescription": {}, + "encryptThisChat": "Encriptar esta conversa", + "@encryptThisChat": {}, + "reopenChat": "Reabrir conversa", + "@reopenChat": {}, + "pushNotificationsNotAvailable": "Notificações não estão disponíveis", + "@pushNotificationsNotAvailable": {}, + "invalidServerName": "Nome de usuário inválido", + "@invalidServerName": {}, + "chatPermissions": "Permissões da conversa", + "@chatPermissions": {}, + "signInWithPassword": "Autenticar com senha", + "@signInWithPassword": {}, + "makeAdminDescription": "Assim que promover este usuário a administrador, não poderá desfazê-lo e ele terá as mesmas permissões que você.", + "@makeAdminDescription": {}, + "setChatDescription": "Inserir descrição da conversa", + "@setChatDescription": {}, + "noOtherDevicesFound": "Nenhum outro dispositivo encontrado", + "@noOtherDevicesFound": {}, + "redactedBy": "Removido por {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "signInWith": "Autenticar com {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "fileIsTooBigForServer": "O servidor avisa que o arquivo é grande demais para ser enviado.", + "@fileIsTooBigForServer": {}, + "readUpToHere": "Marcar como lido até aqui", + "@readUpToHere": {}, + "optionalRedactReason": "(Opcional) Motivo para remover esta mensagem.", + "@optionalRedactReason": {}, + "archiveRoomDescription": "A conversa será movida para o arquivo. Outros usuários verão que você deixou a conversa.", + "@archiveRoomDescription": {}, + "inviteContactToGroupQuestion": "Você quer convidar {contact} para a conversa \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Removido por {username}, pois: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "fileHasBeenSavedAt": "Arquivo salvo em {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "redactMessageDescription": "A mensagem será removida para todos participantes desta conversa. Isto não poderá ser desfeito.", + "@redactMessageDescription": {}, + "invalidInput": "Inserção inválida!", + "@invalidInput": {}, + "report": "Relatar", + "@report": {}, + "addChatDescription": "Inserir descrição da conversa...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user} bateu na porta", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "openLinkInBrowser": "Abrir no navegador", + "@openLinkInBrowser": {}, + "disableEncryptionWarning": "Por razões de segurança, não possível desabilitar a encriptação uma vez habilitada.", + "@disableEncryptionWarning": {}, + "directChat": "Conversa direta", + "@directChat": {}, + "wrongPinEntered": "PIN incorreto! Tente novamente em {seconds} segundos...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "inviteGroupChat": "📨 Convidar para o grupo", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Convidar para uma conversa privada", + "@invitePrivateChat": {}, + "wasDirectChatDisplayName": "Conversa vazia (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "noChatDescriptionYet": "Nenhuma descrição da conversa disponível.", + "@noChatDescriptionYet": {}, + "learnMore": "Saiba mais", + "@learnMore": {}, + "chatDescriptionHasBeenChanged": "Descrição da conversa alterada", + "@chatDescriptionHasBeenChanged": {}, + "roomUpgradeDescription": "A conversa será recriada com a nova versão de sala. Todos participantes será notificados e terão que migrar para a nova sala. Você pode encontrar mais informações sobre versões de sala em https://spec.matrix.org/latest/room/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Por favor, insira um número maior que 0", + "@pleaseEnterANumber": {}, + "profileNotFound": "O usuário não foi encontrado neste servidor. Talvez um problema de conexão ou o usuário não existe.", + "@profileNotFound": {}, + "jump": "Pular", + "@jump": {}, + "sorryThatsNotPossible": "Desculpe... isto não é possível", + "@sorryThatsNotPossible": {}, + "shareInviteLink": "Compartilhar convite", + "@shareInviteLink": {}, + "deviceKeys": "Chaves de dispositivo:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Emotes recentes aparecem aqui...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Aplicar tema:", + "@setTheme": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Por favor, tente novamente mais tarde ou escolha um servidor diferente.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Criar grupo", + "@createGroup": {}, + "noBackupWarning": "Atenção! Sem habilitar o backup de conversa, você perderá acesso a suas mensagens encriptadas. É altamente recomendável habilitar o backup antes de encerrar a sessão.", + "@noBackupWarning": {}, + "kickUserDescription": "O usuário foi enxotado da conversa, mas não banido. Em conversas públicas, o usuário pode reingressar a qualquer momento.", + "@kickUserDescription": {}, + "invite": "Convidar", + "@invite": {}, + "blockListDescription": "Você pode bloquear usuários que estejam perturbando. Você não receberá mensagens ou convites de usuários na sua lista pessoal de bloqueios.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Criar um grupo e convidar pessoas", + "@createGroupAndInviteUsers": {}, + "thisDevice": "Este dispositivo:", + "@thisDevice": {}, + "startConversation": "Começar uma conversa", + "@startConversation": {}, + "publicSpaces": "Espaços públicos", + "@publicSpaces": {}, + "blockedUsers": "Usuários bloqueados", + "@blockedUsers": {}, + "passwordIsWrong": "A senha inserida está incorreta", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Por favor, insira sua senha atual", + "@pleaseEnterYourCurrentPassword": {}, + "groupCanBeFoundViaSearch": "Grupos podem ser encontrados via busca", + "@groupCanBeFoundViaSearch": {}, + "publicLink": "Link público", + "@publicLink": {}, + "noUsersFoundWithQuery": "Infelizmente, não foi encontrado usuário via \"{query}\". Por favor, verifique se digitou corretamente.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "Bloquear", + "@block": {}, + "nothingFound": "Nada foi encontrado...", + "@nothingFound": {}, + "yourGlobalUserIdIs": "Seu ID global é: ", + "@yourGlobalUserIdIs": {}, + "decline": "Rejeitar", + "@decline": {}, + "newPassword": "Nova senha", + "@newPassword": {}, + "passwordsDoNotMatch": "Senhas não batem", + "@passwordsDoNotMatch": {}, + "commandHint_sendraw": "Enviar JSON puro", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Desculpe... esta não parece ser a chave de recuperação correta.", + "@wrongRecoveryKey": {}, + "subspace": "Subespaço", + "@subspace": {}, + "select": "Selecionar", + "@select": {}, + "pleaseChooseAStrongPassword": "Por favor, escolha uma senha forte", + "@pleaseChooseAStrongPassword": {}, + "blockUsername": "Ignore usuário", + "@blockUsername": {}, + "addChatOrSubSpace": "Adicionar conversa ou subespaço", + "@addChatOrSubSpace": {}, + "groupName": "Nome do grupo", + "@groupName": {}, + "leaveEmptyToClearStatus": "Deixe em branco para limpar seu Status.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Ingressar no espaço", + "@joinSpace": {}, + "searchForUsers": "Buscar por @usuários...", + "@searchForUsers": {}, + "databaseMigrationTitle": "Banco de dados otimizado", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Buscar por #conversas, @usuários...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Por favor, espere. Isto pode demorar um pouco.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "Você foi convidado através do link para:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "forwardMessageTo": "Encaminhar mensagem para {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "formattedMessagesDescription": "Mostrar mensagens ricas com conteúdos tipo negrito usando markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verificar outro usuário", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Verificar outro aparelho", + "@verifyOtherDevice": {}, + "acceptedKeyVerification": "{sender} aceitou sua chave de verificação", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} iniciou a chave de verificação", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Transparente", + "@transparent": {}, + "databaseBuildErrorBody": "Não foi possível construir o banco de dados SQLite. O aplicativo tentará utilizar o banco de dados legado por enquanto. Por favor, reporte este erro aos desenvolvedores em {url}. A mensagem de erro é: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "Ocorreu um erro enquanto o aplicativo era iniciado", + "@initAppError": {}, + "restoreSessionBody": "O aplicativo tentará agora restaurar sua sessão a partir do backup. Por favor, reporte este ao desenvolvedor em {url}. A mensagem de erro é: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendReadReceipts": "Enviar recibos de leitura", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Outros participantes neste chat podem ver quando você está digitando uma nova mensagem.", + "@sendTypingNotificationsDescription": {}, + "formattedMessages": "Mensagens formatadas", + "@formattedMessages": {}, + "presenceStyle": "Presença:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Mostrar o status das mensagens de outros usuários", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "commandHint_ignore": "Ignorar o seguinte ID Matrix", + "@commandHint_ignore": {}, + "commandHint_unignore": "Designorar o seguinte ID Matrix", + "@commandHint_unignore": {}, + "hidePresences": "Esconder lista de status?", + "@hidePresences": {}, + "sessionLostBody": "Sua sessão foi desconectada. Por favor, reporte este ao desenvolvedor em {url}. A mensagem de erro é: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendReadReceiptsDescription": "Outros participantes neste chat podem ver quando você tiver lido uma mensagem.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUserDescription": "Se você verificar outro usuário, você terá certeza que você conhece com quem está conversando. 💪\n\nQuando iniciar uma verificação, você e o outro usuário receberão um popup no aplicativo. Então vocês receberão uma série de emojis ou números para comparar um com o outro.\n\nA melhor maneira de fazer este procedimento é encontrar pessoalmente ou através de um vídeochamada. 👭", + "@verifyOtherUserDescription": {}, + "requestedKeyVerification": "{sender} enviou uma chave de verificação", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "verifyOtherDeviceDescription": "Quando você verifica outro aparelho, estes aparelhos poderão trocar chaves, aumentando sua segurança. 💪\n\nQuando iniciar a verificação, um popup aparecerá no aplicativo em ambos os aparelhos. Então você verá uma série de emojis ou números que você terá que comparar um com o outro.\n\nÉ melhor fazer esse procedimento com ambos os aparelhos em mãos antes de começar a verificação. 🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} cancelou sua chave de verificação", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} está pronto para a chave de verificação", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} completou a chave de verificação", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "stickers": "Stickers", + "@stickers": {}, + "discover": "Descubra", + "@discover": {}, + "incomingMessages": "Mensagens recebidas", + "@incomingMessages": {}, + "unreadChatsInApp": "{appname}: {unread} mensagens não lidas", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "appLockDescription": "Bloquear o app com um código PIN quando não estiver usando", + "@appLockDescription": {}, + "accessAndVisibilityDescription": "Quem é permitido entrar nesse chat e como pode ser descoberto.", + "@accessAndVisibilityDescription": {}, + "calls": "Chamadas", + "@calls": {}, + "customEmojisAndStickers": "Emojis e stickers customizados", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Adicionar ou compartilhar emojis ou stickers customizados que podem ser usados em qualquer chat.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Esconder mensagens excluídas", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Se alguém excluir uma mensagem, esta mensagem não será mais visível no chat.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Esconder formatos de mensagem inválidos ou desconhecidos", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Esconder mudanças de membro em chats públicos", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Não mostre se alguém entrou ou saiu no chat para melhorar a legibilidade.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Visão geral", + "@overview": {}, + "notifyMeFor": "Notificar me para", + "@notifyMeFor": {}, + "usersMustKnock": "Usuários devem bater na porta", + "@usersMustKnock": {}, + "noOneCanJoin": "Ninguém pode entrar", + "@noOneCanJoin": {}, + "knocking": "Batendo na porta", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "O chat pode ser descoberto pela pesquisa em {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "publicChatAddresses": "Endereços de chat públicos", + "@publicChatAddresses": {}, + "thereAreCountUsersBlocked": "Nesse momento, há {count} usuários bloqueados.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "globalChatId": "ID de chat global", + "@globalChatId": {}, + "accessAndVisibility": "Acesso e visibilidade", + "@accessAndVisibility": {}, + "passwordRecoverySettings": "Configurações de recuperação de senha", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} gostaria de entrar no chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Nenhum link público foi criado ainda", + "@noPublicLinkHasBeenCreatedYet": {}, + "userRole": "Cargo do usuário", + "@userRole": {}, + "minimumPowerLevel": "{level} é o nível mínimo de poder.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "noDatabaseEncryption": "A criptografia do banco de dados não é suportada nesta plataforma", + "@noDatabaseEncryption": {}, + "createNewAddress": "Criar um novo endereço", + "@createNewAddress": {}, + "knock": "Bater na porta", + "@knock": {}, + "searchIn": "Pesquisar em {chat}...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "restricted": "Restrito", + "@restricted": {}, + "knockRestricted": "Bater na porta restrito", + "@knockRestricted": {}, + "searchMore": "Pesquisar mais...", + "@searchMore": {}, + "gallery": "Galeria", + "@gallery": {}, + "files": "Arquivos", + "@files": {} } diff --git a/assets/l10n/intl_pt_PT.arb b/assets/l10n/intl_pt_PT.arb index bdec9572fe..1cdce9ee15 100644 --- a/assets/l10n/intl_pt_PT.arb +++ b/assets/l10n/intl_pt_PT.arb @@ -1,17 +1,6 @@ { - "passwordsDoNotMatch": "As palavras-passe não correspondem!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Por favor, insere um endereço de correio eletrónico válido.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Repete a palavra-passe", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Por favor, usa no mínimo {min} caracteres.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "about": "Acerca de", "@about": { "type": "text", @@ -34,11 +23,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informação de conta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} ativou encriptação ponta-a-ponta", "@activatedEndToEndEncryption": { "type": "text", @@ -51,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Adicionar descrição de grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Adicionar novo amigo", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Adicionar ao espaço", "@addToSpace": {}, "admin": "Admin", @@ -83,11 +57,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Já tens uma conta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} atendeu a chamada", "@answeredTheCall": { "type": "text", @@ -105,11 +74,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Sala arquivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Todos os visitantes podem entrar", "@areGuestsAllowedToJoin": { "type": "text", @@ -130,11 +94,6 @@ "type": "text", "placeholders": {} }, - "askSSSSVerify": "Por favor, insere a tua senha de armazenamento seguro ou a chave de recuperação para verificares a tua sessão.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Aceitar este pedido de verificação de {username}?", "@askVerificationRequest": { "type": "text", @@ -142,31 +101,11 @@ "username": {} } }, - "audioPlayerPause": "Pausar", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Reproduzir", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticação", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Automaticamente reproduzir autocolantes e emotes animados", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar alterado", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "sendOnEnter": "Enviar com Enter", "@sendOnEnter": {}, "badServerVersionsException": "O servidor suporta as versões Spec:\n{serverVersions}\nMas esta aplicação apenas suporta {suportedVersions}", @@ -218,11 +157,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Chaves armazenadas em cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "text", @@ -299,21 +233,11 @@ "username": {} } }, - "changelog": "Registo de alterações", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Alterar palavra-passe", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "As alterações foram guardadas", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Alterar o servidor", "@changeTheHomeserver": { "type": "text", @@ -329,16 +253,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Alterar o servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Alterar o fundo", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Alterar o teu avatar", "@changeYourAvatar": { "type": "text", @@ -354,12 +268,6 @@ "type": "text", "placeholders": {} }, - "yourUserId": "O teu ID de utilizador:", - "@yourUserId": {}, - "setupChatBackup": "Configurar cópia de segurança de conversas", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Eu anotei a chave num papel", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "A cópia de segurança foi configurada.", "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "Cópia de segurança de conversas", @@ -367,9 +275,7 @@ "type": "text", "placeholders": {} }, - "setupChatBackupDescription": "Para proteger as tuas mensagens, gerámos uma chave de segurança para ti.\nPor favo, mantém-na num sítio seguro, como um gestor de palavras-passe.", - "@setupChatBackupDescription": {}, - "chatBackupDescription": "A tua cópia de segurança de conversas está protegida com uma chave de segurança. Por favor, certifica-te que não a perdes.", + "chatBackupDescription": "A tuas mensagens antigas estão protegidas com uma chave de recuperação. Por favor, certifica-te que não a perdes.", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -381,11 +287,6 @@ }, "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "A conversa foi removida deste espaço", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "Conversas", "@chats": { "type": "text", @@ -396,18 +297,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Escolhe um nome de utilizador", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Limpar arquivo", "@clearArchive": {}, - "clearText": "Limpar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Fechar", "@close": { "type": "text", @@ -520,11 +411,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Falha ao tentar ligar", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "O contacto foi convidado para o grupo", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -545,11 +431,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Visualizador de conteúdo", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Copiado para a área de transferência", "@copiedToClipboard": { "type": "text", @@ -572,16 +453,6 @@ "error": {} } }, - "couldNotSetAvatar": "Não foi possível definir o avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Não foi possível definir o nome de exibição", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} participantes", "@countParticipants": { "type": "text", @@ -594,11 +465,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Criar conta agora", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} criou a conversa", "@createdTheChat": { "type": "text", @@ -606,26 +472,11 @@ "username": {} } }, - "createNewGroup": "Criar novo grupo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Novo espaço", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningEnabled": "Assinatura cruzada ativada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Assinatura cruzada desativada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Ativo(a) agora", "@currentlyActive": { "type": "text", @@ -686,11 +537,6 @@ "type": "text", "placeholders": {} }, - "deny": "Recusar", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Dispositivo", "@device": { "type": "text", @@ -706,46 +552,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "A encriptação só é segura quando todos os dispositivos forem verificados.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Conversas diretas", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Descartar imagem", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Descobrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Descobrir grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Nome de exibição alterado", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Doar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar e não voltar a perguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Descarregar ficheiro", "@downloadFile": { "type": "text", @@ -761,21 +577,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Editar permissões de conversa", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Editar nome de exibição", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Editar instância de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Editar alcunhas da sala", "@editRoomAliases": { "type": "text", @@ -821,11 +627,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Ativar a cópia de segurança para nunca perder acesso às tuas conversas.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Ativar pacote de emotes globalmente", "@enableEmotesGlobally": { "type": "text", @@ -851,21 +652,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Algoritmo de encriptação", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "A encriptação não está ativada", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Configurações de encriptação ponta-a-ponta", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} terminou a chamada", "@endedTheCall": { "type": "text", @@ -873,23 +664,11 @@ "senderName": {} } }, - "enterAGroupName": "Insere o nome do grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Insere um endereço de correio eletrónico", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Insere o nome do espaço", - "@enterASpacepName": {}, - "enterAUsername": "Insere um nome de utilizador", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "homeserver": "Servidor", "@homeserver": {}, "enterYourHomeserver": "Insere o teu servidor", @@ -919,11 +698,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Tamanho do ficheiro", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -939,16 +713,6 @@ "type": "text", "placeholders": {} }, - "friday": "Sexta-feira", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amigos", - "@friends": { - "type": "text", - "placeholders": {} - }, "goToTheNewRoom": "Ir para a nova sala", "@goToTheNewRoom": { "type": "text", @@ -959,16 +723,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Descrição do grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descrição do grupo alterada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "O grupo é público", "@groupIsPublic": { "type": "text", @@ -1019,11 +773,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "O servidor é incompatível", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Quão ofensivo é este conteúdo?", "@howOffensiveIsThisContent": { "type": "text", @@ -1049,16 +798,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Podes ignorar utilizadores que te incomodem. Não irás poder receber quaisquer mensagens ou convites para salas de utilizadores na tua lista pessoal de ignorados.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Nome do utilizador a ignorar", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Eu cliquei na ligação", "@iHaveClickedOnLink": { "type": "text", @@ -1074,11 +813,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Correio eletrónico inválido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Convidar contacto", "@inviteContact": { "type": "text", @@ -1122,11 +856,6 @@ "link": {} } }, - "isDeviceKeyCorrect": "A seguinte chave de dispositivo está correta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "está a escrever…", "@isTyping": { "type": "text", @@ -1144,16 +873,6 @@ "type": "text", "placeholders": {} }, - "keysCached": "Chaves estão armazenadas em cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Chaves em falta", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, "kicked": "{username} expulsou {targetName}", "@kicked": { "type": "text", @@ -1182,16 +901,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Último IP visto", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto(a) há muito tempo", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Sair", "@leave": { "type": "text", @@ -1251,28 +960,11 @@ "homeserver": {} } }, - "loginWithOneClick": "Entrar com um clique", - "@loginWithOneClick": {}, "logout": "Sair", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Promover a moderador", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Promover a admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Certifica-te que o identificador é válido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Alterações de membros", "@memberChanges": { "type": "text", @@ -1288,27 +980,17 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "A mensagem será eliminada para todos os participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderador", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Segunda-feira", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Silenciar conversa", "@muteChat": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "", + "needPantalaimonWarning": "Por favor,", "@needPantalaimonWarning": { "type": "text", "placeholders": {} @@ -1343,16 +1025,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "O FluffyChat, de momento, não suporta ativar a assinatura cruzada. Por favor, ativa-a a partir do Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Nenhuma descrição", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Nenhuns emotes encontrados. 😕", "@noEmotesFound": { "type": "text", @@ -1376,15 +1048,6 @@ "server2": {} } }, - "shareYourInviteLink": "Partilhar a ligação de convite", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Escrever a ligação de convite manualmente...", - "@typeInInviteLinkManually": {}, - "noMegolmBootstrap": "Por favor, ativa a cópia de segurança de chaves online a partir do Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Nenhum", "@none": { "type": "text", @@ -1435,11 +1098,6 @@ "username": {} } }, - "sendBugReports": "Permitir enviar relatórios de problemas com o sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendAMessage": "Enviar a mensagem", "@sendAMessage": { "type": "text", @@ -1450,11 +1108,6 @@ "type": "text", "placeholders": {} }, - "securityKeyLost": "Perdeste a chave de segurança?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "sendAsText": "Enviar como texto", "@sendAsText": { "type": "text" @@ -1469,10 +1122,6 @@ "type": "text", "placeholders": {} }, - "newPasswordDescription": "Para poderes recuperar a tua palavra-passe, deves adicionar um endereço de correio eletrónico à tua conta.", - "@newPasswordDescription": {}, - "newUsernameDescription": "O teu ID de utilizador terá o formato @utilizador:servidor", - "@newUsernameDescription": {}, "noPasswordRecoveryDescription": "Ainda não adicionaste uma forma de recuperar a tua palavra-passe.", "@noPasswordRecoveryDescription": { "type": "text", @@ -1483,21 +1132,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Não foram encontradas nenhumas salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Não foram encontradas nenhumas salas…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Nenhuns estados encontrados até agora.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Notificações", "@notifications": { "type": "text", @@ -1508,18 +1147,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Não suportadas na web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selecionados(as)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "Estão {count} utilizadores(as) a escrever…", "@numUsersTyping": { "type": "text", @@ -1552,11 +1179,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "A cópia de segurança online de chaves está desativada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "A cópia de segurança online de chaves está ativada", "@onlineKeyBackupEnabled": { "type": "text", @@ -1605,11 +1227,6 @@ "@link": {}, "serverRequiresEmail": "Este servidor precisa de validar o teu endereço de correio eletrónico para o registo.", "@serverRequiresEmail": {}, - "optionalGroupName": "(Opcional) Nome do grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Ou", "@or": { "type": "text", @@ -1620,11 +1237,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Dispositivos de utilizadores participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "senha ou chave de recuperação", "@passphraseOrKey": { "type": "text", @@ -1682,11 +1294,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Por favor, escolhe um nome de utilizador", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Por favor, clica na ligação no correio eletrónico e depois continua.", "@pleaseClickOnLink": { "type": "text", @@ -1697,16 +1304,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Por favor, insere um ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Por favor, insere a tua chave de segurança:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Por favor, insere a tua palavra-passe", "@pleaseEnterYourPassword": { "type": "text", @@ -1732,26 +1329,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Grupos públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chave pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Salas públicas", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Espaço público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "reason": "Razão", "@reason": { "type": "text", @@ -1823,11 +1405,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Remover mensagem", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Remover o teu avatar", "@removeYourAvatar": { "type": "text", @@ -1858,16 +1435,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Pedir para ler mensagens antigas", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revogar todas as permissões", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "A sala foi atualizada", "@roomHasBeenUpgraded": { "type": "text", @@ -1878,48 +1445,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Ficheiro guardado como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Guardar ficheiro", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Guardar ficheiro nesta pasta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Procurar", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Procurar por conversa", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Segurança", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Chave de segurança", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Visto por {username}", "@seenByUser": { "type": "text", @@ -1927,14 +1467,6 @@ "username": {} } }, - "seenByUserAndUser": "Visto por {username} e por {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "sendFile": "Enviar ficheiro", "@sendFile": { "type": "text", @@ -1999,5 +1531,39 @@ "placeholders": { "username": {} } - } + }, + "commandHint_clearcache": "Limpar cache", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Criar uma conversa de grupo vazia\nUsa --no-encryption para desativar a encriptação", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descartar sessão", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Iniciar uma conversa direta\nUsa --no-encryption para desativar a encriptação", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "dehydrate": "Exportar sessão e limpar dispositivo", + "@dehydrate": {}, + "dehydrateWarning": "Esta ação não pode ser revertida. Assegura-te que guardas bem a cópia de segurança.", + "@dehydrateWarning": {}, + "hydrateTorLong": "Exportaste a tua sessão na última vez que estiveste no TOR? Importa-a rapidamente e continua a conversar.", + "@hydrateTorLong": {}, + "dehydrateTor": "Utilizadores do TOR: Exportar sessão", + "@dehydrateTor": {}, + "hydrate": "Restaurar a partir de cópia de segurança", + "@hydrate": {}, + "hydrateTor": "Utilizadores do TOR: Importar sessão", + "@hydrateTor": {}, + "dehydrateTorLong": "Para utilizadores do TOR, é recomendado exportar a sessão antes de fechar a janela.", + "@dehydrateTorLong": {} } diff --git a/assets/l10n/intl_ro.arb b/assets/l10n/intl_ro.arb index 95675ddacc..4715436e7f 100644 --- a/assets/l10n/intl_ro.arb +++ b/assets/l10n/intl_ro.arb @@ -22,11 +22,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Informații despre cont", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} a activat criptarea end-to-end", "@activatedEndToEndEncryption": { "type": "text", @@ -34,11 +29,6 @@ "username": {} } }, - "addGroupDescription": "Adaugă o descriere de", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Administrator", "@admin": { "type": "text", @@ -49,12 +39,7 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Ai deja un cont?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{sendername} a acceptat apelul", + "answeredTheCall": "{senderName} a acceptat apelul", "@answeredTheCall": { "type": "text", "placeholders": { @@ -71,11 +56,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Grup arhivat", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Vizitatorii \"guest\" se pot alătura", "@areGuestsAllowedToJoin": { "type": "text", @@ -86,21 +66,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Te rog introdu parola ta sau cheile de recuparare pentru a depozita cheile.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Pentru a putea conecta cealaltă persoană, te rog introdu parola sau cheia ta de recuperare.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Te rog introdu parola sau cheia ta de recuperare pentru a-ți verifica sesiunea.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Accepți cererea de verificare de la {username}?", "@askVerificationRequest": { "type": "text", @@ -108,16 +78,6 @@ "username": {} } }, - "authentication": "Autentificare", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Image de profil schimbată", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "banFromChat": "Interzis din conversație", "@banFromChat": { "type": "text", @@ -141,11 +101,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Chei salvate", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Anulează", "@cancel": { "type": "text", @@ -178,5 +133,2171 @@ "username": {}, "chatname": {} } - } -} \ No newline at end of file + }, + "commandHint_unban": "Dezinterziceți utilizatorul ales din această cameră", + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "deviceId": "ID-ul Dispozitiv", + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "devices": "Dispozitive", + "@devices": { + "type": "text", + "placeholders": {} + }, + "directChats": "Chaturi directe", + "@directChats": { + "type": "text", + "placeholders": {} + }, + "endedTheCall": "{senderName} a terminat apelul", + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "enterYourHomeserver": "Introduceți homeserverul vostru", + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "groupWith": "Grup cu {displayname}", + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "howOffensiveIsThisContent": "Cât de ofensiv este acest conținut?", + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "kickFromChat": "Dați afară din chat", + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "rejoin": "Reintrați", + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "sentCallInformations": "{senderName} a trimis informație de apel", + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "showPassword": "Afișați parola", + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "no": "Nu", + "@no": { + "type": "text", + "placeholders": {} + }, + "sendMessages": "Trimiteți mesaje", + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "submit": "Trimiteți", + "@submit": { + "type": "text", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{Un chat necitit} other{{unreadCount} chaturi necitite}}", + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "verifySuccess": "A reușit verificarea!", + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "voiceMessage": "Mesaj vocal", + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "wallpaper": "Imagine de fundal", + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "reactedWith": "{sender} a reacționat cu {reaction}", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "changePassword": "Schimbați parola", + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "next": "Următor", + "@next": { + "type": "text", + "placeholders": {} + }, + "noConnectionToTheServer": "Fără conexiune la server", + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Nu ați adăugat încă nici un mod de recuperare pentru parola voastră.", + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "notifications": "Notificări", + "@notifications": { + "type": "text", + "placeholders": {} + }, + "openVideoCamera": "Deschideți camera pentru video", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "openAppToReadMessages": "Deschideți aplicația să citiți mesajele", + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "openCamera": "Deschideți camera", + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "removedBy": "Eliminat de {username}", + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "removeDevice": "Eliminați dispozitivul", + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "share": "Partajați", + "@share": { + "type": "text", + "placeholders": {} + }, + "shareLocation": "Partajați locația", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "skip": "Săriți peste", + "@skip": { + "type": "text", + "placeholders": {} + }, + "sourceCode": "Codul surs", + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "spaceIsPublic": "Spațiul este public", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "spaceName": "Numele spațiului", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "toggleFavorite": "Comutați favoritul", + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "unblockDevice": "Debloca dispozitiv", + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "unknownDevice": "Dispozitiv necunoscut", + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "verify": "Verificați", + "@verify": { + "type": "text", + "placeholders": {} + }, + "weSentYouAnEmail": "V-am trimis un email", + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Nu mai participați în acest chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "yourPublicKey": "Cheia voastră publică", + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "addToSpaceDescription": "Alegeți un spațiu în care să adăugați acest chat.", + "@addToSpaceDescription": {}, + "placeCall": "Faceți apel", + "@placeCall": {}, + "voiceCall": "Apel vocal", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Versiune de Android nesuportat", + "@unsupportedAndroidVersion": {}, + "previousAccount": "Contul anterior", + "@previousAccount": {}, + "userIsTyping": "{username} tastează…", + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "widgetCustom": "Personalizat", + "@widgetCustom": {}, + "screenSharingTitle": "partajarea de ecran", + "@screenSharingTitle": {}, + "newGroup": "Grup nou", + "@newGroup": {}, + "changedTheRoomInvitationLink": "{username} a schimbat linkul de invitație", + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "chat": "Chat", + "@chat": { + "type": "text", + "placeholders": {} + }, + "chats": "Chaturi", + "@chats": { + "type": "text", + "placeholders": {} + }, + "invited": "Invitat", + "@invited": { + "type": "text", + "placeholders": {} + }, + "login": "Conectați-vă", + "@login": { + "type": "text", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "text", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Backup de cheie online este activat", + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "removeFromBundle": "Stergeți din acest pachet", + "@removeFromBundle": {}, + "enableMultiAccounts": "(BETA) Activați multiple conturi pe acest dispozitiv", + "@enableMultiAccounts": {}, + "participant": "Participant", + "@participant": { + "type": "text", + "placeholders": {} + }, + "openInMaps": "Deschideți pe hartă", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourPin": "Vă rugăm să introduceți pinul vostru", + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "privacy": "Confidențialitate", + "@privacy": { + "type": "text", + "placeholders": {} + }, + "pushRules": "Regulile Push", + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "recording": "Înregistrare", + "@recording": { + "type": "text", + "placeholders": {} + }, + "register": "Înregistrați-vă", + "@register": { + "type": "text", + "placeholders": {} + }, + "redactMessage": "Redactați mesaj", + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "roomVersion": "Versiunea camerei", + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "security": "Securitate", + "@security": { + "type": "text", + "placeholders": {} + }, + "sendFile": "Trimiteți fișier", + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "setStatus": "Stabiliți status", + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "settings": "Configurări", + "@settings": { + "type": "text", + "placeholders": {} + }, + "inviteForMe": "Invitați pentru mine", + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} a retras invitația pentru {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "help": "Ajutor", + "@help": { + "type": "text", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritm de criptare necunoscut", + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "unmuteChat": "Dezamuțați chat", + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "unpin": "Anulează fixarea", + "@unpin": { + "type": "text", + "placeholders": {} + }, + "unbannedUser": "{username} a ridicat interzicerea lui {targetName}", + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "openChat": "Deschideți Chat", + "@openChat": {}, + "emailOrUsername": "Email sau nume de utilizator", + "@emailOrUsername": {}, + "youBannedUser": "Ați interzis pe {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "fileIsTooBigForServer": "Serverul reportează că fișierul este prea mare să fie trimis.", + "@fileIsTooBigForServer": {}, + "widgetName": "Nume", + "@widgetName": {}, + "sorryThatsNotPossible": "Scuze... acest nu este posibil", + "@sorryThatsNotPossible": {}, + "enableEncryptionWarning": "Activând criptare, nu mai puteți să o dezactivați în viitor. Sunteți sigur?", + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "commandMissing": "{command} nu este o comandă.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "status": "Status", + "@status": { + "type": "text", + "placeholders": {} + }, + "connect": "Conectați", + "@connect": { + "type": "text", + "placeholders": {} + }, + "you": "Voi", + "@you": { + "type": "text", + "placeholders": {} + }, + "start": "Începeți", + "@start": {}, + "videoCallsBetaWarning": "Vă rugăm să luați notă că apeluri video sunt în beta. Se poate că nu funcționează normal sau de loc pe fie care platformă.", + "@videoCallsBetaWarning": {}, + "pinMessage": "Fixați în cameră", + "@pinMessage": {}, + "wasDirectChatDisplayName": "Chat gol (a fost {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "pleaseClickOnLink": "Vă rugăm să deschideți linkul din email și apoi să procedați.", + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "reportUser": "Reportați utilizator", + "@reportUser": {}, + "encryptionNotEnabled": "Criptare nu e activată", + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "publicRooms": "Camere Publice", + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "addToBundle": "Adăugați în pachet", + "@addToBundle": {}, + "theyDontMatch": "Nu sunt asemănători", + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "loadingPleaseWait": "Încărcând... Vă rugăm să așteptați.", + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "theyMatch": "Sunt asemănători", + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "toggleMuted": "Comutați amuțeștarea", + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "scanQrCode": "Scanați cod QR", + "@scanQrCode": {}, + "addAccount": "Adăugați cont", + "@addAccount": {}, + "experimentalVideoCalls": "Apeluri video experimentale", + "@experimentalVideoCalls": {}, + "confirmEventUnpin": "Sunteți sigur că doriți să anulați permanent fixarea evenimentului?", + "@confirmEventUnpin": {}, + "emojis": "Emoji-uri", + "@emojis": {}, + "switchToAccount": "Schimbați la contul {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "nextAccount": "Contul următor", + "@nextAccount": {}, + "indexedDbErrorTitle": "Probleme cu modul privat", + "@indexedDbErrorTitle": {}, + "users": "Utilizatori", + "@users": {}, + "startFirstChat": "Începeți primul chatul vostru", + "@startFirstChat": {}, + "callingPermissions": "Permisiuni de apel", + "@callingPermissions": {}, + "callingAccount": "Cont de apel", + "@callingAccount": {}, + "foregroundServiceRunning": "Această notificare apare când serviciul de foreground rulează.", + "@foregroundServiceRunning": {}, + "callingAccountDetails": "Permite FluffyChat să folosească aplicația de apeluri nativă android.", + "@callingAccountDetails": {}, + "appearOnTop": "Apare deasupra", + "@appearOnTop": {}, + "appearOnTopDetails": "Permite aplicația să apare deasupra (nu este necesar dacă aveți FluffyChat stabilit ca cont de apeluri)", + "@appearOnTopDetails": {}, + "currentlyActive": "Activ acum", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "containsDisplayName": "Conține displayname", + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "isTyping": "tastează…", + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "chatBackup": "Backup de chat", + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "repeatPassword": "Repetați parola", + "@repeatPassword": {}, + "changeTheme": "Schimbați tema aplicației", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chatul a fost adăugat la acest spațiu", + "@chatHasBeenAddedToThisSpace": {}, + "clearArchive": "Ștergeți arhiva", + "@clearArchive": {}, + "commandHint_markasdm": "Marcați ca cameră de mesaje directe", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marcați ca grup", + "@commandHint_markasgroup": {}, + "commandHint_ban": "Interziceți acesul utilizatorului ales din această cameră", + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Ștergeți cache", + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Creați un grup de chat gol\nFolosiți --no-encryption să dezactivați criptare", + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Renunțați sesiunea", + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_kick": "Dați afară pe utilizatorul ales din această cameră", + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Renunțați la această cameră", + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Alegeți un avatar pentru această cameră (foloșește mxc-uri)", + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Alegeți un displayname pentru această cameră", + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Stabiliți nivelul de putere a utilizatorul ales (implicit: 50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Trimiteți text simplu/neformatat", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Trimiteți răspuns ca reacție", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Trimiteți text", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "commandInvalid": "Comandă nevalibilă", + "@commandInvalid": { + "type": "text" + }, + "compareEmojiMatch": "Vă rugăm să comparați emoji-urile", + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "compareNumbersMatch": "Vă rugăm să comparați numerele", + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "couldNotDecryptMessage": "Dezcriptarea mesajului a eșuat: {error}", + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "create": "Creați", + "@create": { + "type": "text", + "placeholders": {} + }, + "createdTheChat": "💬{username} a creat chatul", + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "createNewSpace": "Spațiu nou", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "allRooms": "Toate chaturi de grup", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "forward": "Înainte", + "@forward": { + "type": "text", + "placeholders": {} + }, + "groups": "Grupuri", + "@groups": { + "type": "text", + "placeholders": {} + }, + "hideRedactedEvents": "Ascunde evenimente redactate", + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "hideUnknownEvents": "Ascunde evenimente necunoscute", + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "identity": "Identitate", + "@identity": { + "type": "text", + "placeholders": {} + }, + "ignore": "Ignorați", + "@ignore": { + "type": "text", + "placeholders": {} + }, + "ignoredUsers": "Utilizatori ignorați", + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "iHaveClickedOnLink": "Am făcut click pe link", + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Parolă sau cheie de recuperare incorectă", + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "inoffensive": "Inofensiv", + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "inviteContact": "Invitați contact", + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroup": "Invitați contact la {groupName}", + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "inviteText": "{username} v-a invitat la FluffyChat.\n1. Instalați FluffyChat: https://fluffychat.im\n2. Înregistrați-vă sau conectați-vă\n3. Deschideți invitația: {link}", + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "joinedTheChat": "👋{username} a intrat în chat", + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "kicked": "👞{username} a dat afară pe {targetName}", + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "lastActiveAgo": "Ultima dată activ: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "leave": "Renunțați", + "@leave": { + "type": "text", + "placeholders": {} + }, + "leftTheChat": "A plecat din chat", + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "license": "Permis", + "@license": { + "type": "text", + "placeholders": {} + }, + "lightTheme": "Luminat", + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "loadCountMoreParticipants": "Încărcați încă mai {count} participanți", + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "dehydrate": "Exportați sesiunea și ștergeți dispozitivul", + "@dehydrate": {}, + "dehydrateTor": "Utilizatori de TOR: Exportați sesiunea", + "@dehydrateTor": {}, + "dehydrateTorLong": "Pentru utilizatori de TOR, este recomandat să exportați sesiunea înainte de a închideți fereastra.", + "@dehydrateTorLong": {}, + "hydrateTor": "Utilizatori TOR: Importați sesiune exportată", + "@hydrateTor": {}, + "hydrateTorLong": "Ați exportat sesiunea vostră ultima dată pe TOR? Importați-o repede și continuați să conversați.", + "@hydrateTorLong": {}, + "hydrate": "Restaurați din fișier backup", + "@hydrate": {}, + "loadMore": "Încarcă mai multe…", + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "logout": "Deconectați-vă", + "@logout": { + "type": "text", + "placeholders": {} + }, + "mention": "Menționați", + "@mention": { + "type": "text", + "placeholders": {} + }, + "messages": "Mesaje", + "@messages": { + "type": "text", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "text", + "placeholders": {} + }, + "noEmotesFound": "Nu s-a găsit nici un emote. 😕", + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Criptare nu poate fi activată până când camera este accesibilă public.", + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "none": "Niciunul", + "@none": { + "type": "text", + "placeholders": {} + }, + "noPermission": "Fără permisie", + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "noRoomsFound": "Nici o cameră nu s-a găsit…", + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificări activate pentru acest cont", + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "obtainingLocation": "Obținând locație…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "text", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, ceva a eșuat…", + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "reject": "Respingeți", + "@reject": { + "type": "text", + "placeholders": {} + }, + "unbanFromChat": "Revoca interzicerea din chat", + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Camera a fost actualizată", + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "setCustomEmotes": "Stabiliți emoji-uri personalizate", + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "setPermissionsLevel": "Stabiliți nivelul de permisii", + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "singlesignon": "Autentificare unică", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "startedACall": "{senderName} a început un apel", + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "statusExampleMessage": "Ce faceți?", + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "tooManyRequestsWarning": "Prea multe cereri. Vă rugăm să încercați din nou mai tărziu!", + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "unknownEvent": "Evenimet necunoscut '{type}'", + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "verified": "Verificat", + "@verified": { + "type": "text", + "placeholders": {} + }, + "verifyStart": "Începeți verificare", + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "videoCall": "Apel video", + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vizibilitatea istoria chatului", + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "visibleForAllParticipants": "Vizibil pentru toți participanți", + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerEmoji": "Așteptând pe partenerul să accepte emoji-ul…", + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerNumbers": "Așteptând pe partenerul să accepte numerele…", + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "warning": "Avertizment!", + "@warning": { + "type": "text", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Cine poate face care acțiune", + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Cine se poate alătura la acest grup", + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "De ce doriți să reportați acest conținut?", + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "wipeChatBackup": "Ștergeți backup-ul vostru de chat să creați o nouă cheie de recuperare?", + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Cu acestea adrese puteți să vă recuperați parola.", + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Ați fost interzis din acest chat", + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "messageInfo": "Info mesajului", + "@messageInfo": {}, + "time": "Timp", + "@time": {}, + "messageType": "Fel de mesaj", + "@messageType": {}, + "sender": "Trimițător", + "@sender": {}, + "openGallery": "Deschideți galeria", + "@openGallery": {}, + "removeFromSpace": "Eliminați din spațiu", + "@removeFromSpace": {}, + "publish": "Publicați", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "unsupportedAndroidVersionLong": "Această funcție are nevoie de o versiune de Android mai nouă. Vă rugăm să verificați dacă sunt actualizări sau suport de la Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "dismiss": "Respingeți", + "@dismiss": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Notiță text", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetUrlError": "Acest URL nu este valibil.", + "@widgetUrlError": {}, + "widgetNameError": "Vă rugăm să introduceți un nume de afișare.", + "@widgetNameError": {}, + "errorAddingWidget": "Adăugarea widget-ului a eșuat.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "Ați respins invitația", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Va-ți alăturat la chat", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍Ați acceptat invitația", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Ați retras invitația pentru {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩Ați fost invitat de {user}", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "unlockOldMessages": "Deblocați mesajele vechi", + "@unlockOldMessages": {}, + "youInvitedUser": "📩Ați invitat pe {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "youKicked": "👞Ați dat afară pe {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "Ați ridicat interzicerea lui {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "storeInAndroidKeystore": "Stoca în Android KeyStore", + "@storeInAndroidKeystore": {}, + "user": "Utilizator", + "@user": {}, + "custom": "Personalizat", + "@custom": {}, + "screenSharingDetail": "Partajați ecranul în FluffyChat", + "@screenSharingDetail": {}, + "storeSecurlyOnThisDevice": "Stoca sigur pe acest dispozitiv", + "@storeSecurlyOnThisDevice": {}, + "otherCallingPermissions": "Microfon, cameră și alte permisiuni lui FluffyChat", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "De ce este acest mesaj ilizibil?", + "@whyIsThisMessageEncrypted": {}, + "newSpace": "Spațiu nou", + "@newSpace": {}, + "enterSpace": "Intrați în spațiu", + "@enterSpace": {}, + "enterRoom": "Intrați în cameră", + "@enterRoom": {}, + "allSpaces": "Toate spațiile", + "@allSpaces": {}, + "numChats": "{number} chaturi", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Ascundeți evenimente de stare neimportante", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nu se mai apară din nou", + "@doNotShowAgain": {}, + "newSpaceDescription": "Spațiile vă permit să vă consolidați chaturile și să stabiliți comunități private sau publice.", + "@newSpaceDescription": {}, + "encryptThisChat": "Criptați acest chat", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Pentru motive de securitate, nu este posibil să dezactivați criptarea unui chat în care criptare este activată.", + "@disableEncryptionWarning": {}, + "noBackupWarning": "Avertisment! Fără să activați backup de chat, veți pierde accesul la mesajele voastre criptate. E foarte recomandat să activați backup de chat înainte să vă deconectați.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Nu s-a găsit alte dispozitive", + "@noOtherDevicesFound": {}, + "fileHasBeenSavedAt": "Fișierul a fost salvat la {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jump": "Săriți", + "@jump": {}, + "report": "reportați", + "@report": {}, + "jumpToLastReadMessage": "Săriți la ultimul citit mesaj", + "@jumpToLastReadMessage": {}, + "memberChanges": "Schimbări de membri", + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "guestsCanJoin": "Musafiri pot să se alăture", + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "fileName": "Nume de fișier", + "@fileName": { + "type": "text", + "placeholders": {} + }, + "fontSize": "Mărimea fontului", + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "fromJoining": "De la alăturare", + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "fromTheInvitation": "De la invitația", + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "goToTheNewRoom": "Mergeți la camera nouă", + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "text", + "placeholders": {} + }, + "groupIsPublic": "Grupul este public", + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "guestsAreForbidden": "Musafiri sunt interziși", + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "kickedAndBanned": "🙅{username} a dat afară și a interzis pe {targetName} din cameră", + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "dehydrateWarning": "Această actiune nu poate fi anulată. Asigurați-vă că păstrați fișierul backup.", + "@dehydrateWarning": {}, + "joinRoom": "Alăturați la cameră", + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "logInTo": "Conectați-vă la {homeserver}", + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "locationDisabledNotice": "Servicile de locație sunt dezactivate. Vă rugăm să le activați să împărțiți locația voastră.", + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "noGoogleServicesWarning": "Se pare că nu aveți serviciile google pe dispozitivul vostru. Această decizie este bună pentru confidențialitatea voastră! Să primiți notificari push în FluffyChat vă recomandăm https://microg.org/ sau https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "noMatrixServer": "{server1} nu este server matrix, înlocuiți cu {server2}?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "numUsersTyping": "{count} utilizatori tastează…", + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "offensive": "Ofensiv", + "@offensive": { + "type": "text", + "placeholders": {} + }, + "confirm": "Confirmați", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "or": "Sau", + "@or": { + "type": "text", + "placeholders": {} + }, + "serverRequiresEmail": "Acest server trebuie să valideze emailul vostru pentru înregistrare.", + "@serverRequiresEmail": {}, + "waitingPartnerAcceptRequest": "Așteptând pe partenerul să accepte cererea…", + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "darkTheme": "Întunecat", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "sharedTheLocation": "{username} sa partajat locația", + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "setInvitationLink": "Stabiliți linkul de invitație", + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfera de la alt dispozitiv", + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizează... Vă rugăm să așteptați.", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "toggleUnread": "Marcați Citit/Necitit", + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "tryToSendAgain": "Încercați să trimiteți din nou", + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "unavailable": "Nedisponibil", + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} și {username2} tastează…", + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "userLeftTheChat": "🚪{username} a plecat din chat", + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "userAndOthersAreTyping": "{username} și {count} alți tastează…", + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "userSentUnknownEvent": "{username} a trimis un eveniment {type}", + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "unverified": "Neverificat", + "@unverified": {}, + "verifyTitle": "Verificând celălalt cont", + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "visibleForEveryone": "Vizibil pentru toți", + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "readUpToHere": "Citit până aici", + "@readUpToHere": {}, + "changedTheHistoryVisibility": "{username} a schimbat vizibilitatea istoriei chatului", + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "copy": "Copiați", + "@copy": { + "type": "text", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displayname a fost schimbat", + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "invitedUsersOnly": "Numai utilizatori invitați", + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "configureChat": "Configurați chat", + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "copiedToClipboard": "Copiat în clipboard", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "device": "Dispozitiv", + "@device": { + "type": "text", + "placeholders": {} + }, + "username": "Nume de utilizator", + "@username": { + "type": "text", + "placeholders": {} + }, + "sentAnAudio": "🎤{username} a trimis audio", + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAFile": "📁{username} a trimis un fișier", + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "indexedDbErrorLong": "Stocarea de mesaje nu este activat implicit în modul privat.\nVă rugăm să vizitați\n- about:config\n- stabiliți dom.indexedDB.privateBrowsing.enabled la true\nAstfel, nu este posibil să folosiți FluffyChat.", + "@indexedDbErrorLong": {}, + "addWidget": "Adăugați widget", + "@addWidget": {}, + "locationPermissionDeniedNotice": "Permisiunea locației blocată. Vă rugăm să o dezblocați să împărțiți locația voastră.", + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "newChat": "Chat nou", + "@newChat": { + "type": "text", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Mesaj nou în FluffyChat", + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} a trimis o poză", + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAVideo": "🎥{username} a trimis un video", + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentASticker": "😊 {username} a trimis un sticker", + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "storeInSecureStorageDescription": "Păstrați cheia de recuperare în stocarea sigură a acestui dispozitiv.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Activați dialogul de partajare sistemului sau folosiți clipboard-ul să salvați manual această cheie.", + "@saveKeyManuallyDescription": {}, + "countFiles": "{count} fișiere", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "hugContent": "{senderName} vă îmbrățișează", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "storeInAppleKeyChain": "Stoca în Apple KeyChain", + "@storeInAppleKeyChain": {}, + "addEmail": "Adăugați email", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "confirmMatrixId": "Vă rugăm să confirmați Matrix ID-ul vostru să ștergeți contul vostru.", + "@confirmMatrixId": {}, + "cuddleContent": "{senderName} vă îmbrățișează", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "supposedMxid": "ID-ul ar trebuii să fie {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_html": "Trimiteți text format ca HTML", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "addToSpace": "Adăugați la spațiu", + "@addToSpace": {}, + "commandHint_hug": "Trimiteți o îmbrățișare", + "@commandHint_hug": {}, + "badServerVersionsException": "Homeserver-ul suportă versiunele de Spec următoare:\n{serverVersions}\nDar această aplicație suportă numai {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "badServerLoginTypesException": "Homeserver-ul suportă următoarele feluri de login:\n{serverVersions}\nDar această aplicație suportă numai:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "changedTheGuestAccessRulesTo": "{username} a schimbat regulile pentru acesul musafirilor la: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheJoinRulesTo": "{username} a schimbat regulile de alăturare la: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "yourChatBackupHasBeenSetUp": "Backup-ul vostru de chat a fost configurat.", + "@yourChatBackupHasBeenSetUp": {}, + "cantOpenUri": "Nu se poate deschide URI-ul {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "changedTheDisplaynameTo": "{username} s-a schimbat displayname la: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "changedTheGuestAccessRules": "{username} a schimbat regulile pentru acesul musafirilor", + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changeTheHomeserver": "Schimbați homeserver-ul", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "chatBackupDescription": "Mesajele voastre vechi sunt sigurate cu o cheie de recuperare. Vă rugăm să nu o pierdeți.", + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "contentHasBeenReported": "Conținutul a fost reportat la administratori serverului", + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "Detalii de chat", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "commandHint_dm": "Porniți un chat direct\nFolosiți --no-encryption să dezactivați criptare", + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "commandHint_me": "Descrieți-vă", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "contactHasBeenInvitedToTheGroup": "Contactul a fost invitat la grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "containsUserName": "Conține nume de utilizator", + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "copyToClipboard": "Copiați în clipboard", + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "countParticipants": "{count} participanți", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "delete": "Ștergeți", + "@delete": { + "type": "text", + "placeholders": {} + }, + "deactivateAccountWarning": "Această acțiune va dezactiva contul vostru. Nu poate fi anulat! Sunteți sigur?", + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "deleteAccount": "Ștergeți contul", + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permisiuni implicită", + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "Ștergeți mesajul", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "downloadFile": "Descărcați fișierul", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "enableEmotesGlobally": "Activați pachet de emote global", + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "everythingReady": "Totul e gata!", + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "editBlockedServers": "Editați servere blocate", + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "emoteInvalid": "Shortcode de emote nevalibil!", + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "edit": "Editați", + "@edit": { + "type": "text", + "placeholders": {} + }, + "editRoomAliases": "Schimbați pseudonimele camerei", + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "emptyChat": "Chat gol", + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "enableEncryption": "Activați criptare", + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "encrypted": "Criptat", + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "editDisplayname": "Schimbați displayname", + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "editRoomAvatar": "Schimbați avatarul din cameră", + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "emoteExists": "Emote deja există!", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "emotePacks": "Pachete de emoturi din cameră", + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "emoteSettings": "Configurări Emote", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "emoteShortcode": "Shortcode de emote", + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Trebuie să alegeți shortcode pentru emote și o imagine!", + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "encryption": "Criptare", + "@encryption": { + "type": "text", + "placeholders": {} + }, + "enterAnEmailAddress": "Introduceți o adresă email", + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "homeserver": "Homeserver", + "@homeserver": {}, + "errorObtainingLocation": "Obținerea locației a eșuat: {error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "ok": "Ok", + "@ok": { + "type": "text", + "placeholders": {} + }, + "youKickedAndBanned": "🙅Ați dat afară și interzis pe {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "noKeyForThisMessage": "Această chestie poate să se întâmple când mesajul a fost trimis înainte să vă conectați contul cu acest dispozitiv.\n\nO altă explicație ar fi dacă trimițătorul a blocat dispozitivul vostru sau ceva s-a întâmplat cu conexiunea la internet\n\nPuteți să citiți mesajul în o altă seșiune? Atunci puteți să transferați mesajul de acolo! Mergeți la Configurări > Dispozitive și verificați că dispozitivele s-au verificat. Când deschideți camera în viitor și ambele seșiune sunt în foreground, cheile va fi transmise automat. \n\nDoriți să îți păstrați cheile când deconectați sau schimbați dispozitive? Fiți atenți să activați backup de chat în configurări.", + "@noKeyForThisMessage": {}, + "sendAsText": "Trimiteți ca text", + "@sendAsText": { + "type": "text" + }, + "reportErrorDescription": "Ceva a eșuat. Vă rugăm să încercați din nou mai tărziu. Dacă doriți, puteți să reportați problema la dezvoltatori.", + "@reportErrorDescription": {}, + "openLinkInBrowser": "Deschideți linkul în browser", + "@openLinkInBrowser": {}, + "send": "Trimiteți", + "@send": { + "type": "text", + "placeholders": {} + }, + "sendAMessage": "Trimiteți un mesaj", + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "sendAudio": "Trimiteți audio", + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "sendOriginal": "Trimiteți original", + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "sendVideo": "Trimiteți video", + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "sendImage": "Trimiteți imagine", + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "sendSticker": "Trimiteți sticker", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterRecoveryKeyDescription": "Să vă deblocați mesajele vechi, vă rugăm să introduceți cheia de recuperare creată de o seșiune anterioră. Cheia de recuperare NU este parola voastră.", + "@pleaseEnterRecoveryKeyDescription": {}, + "separateChatTypes": "Afișați chaturi directe și grupuri separat", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "setAsCanonicalAlias": "Stabiliți ca pseudonimul primar", + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "writeAMessage": "Scrieți un mesaj…", + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "yes": "Da", + "@yes": { + "type": "text", + "placeholders": {} + }, + "markAsRead": "Marcați ca citit", + "@markAsRead": {}, + "oopsPushError": "Ups! Din păcate, o eroare s-a întâmplat cu stabilirea de notificări push.", + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "oneClientLoggedOut": "Unul dintre clienților voștri a fost deconectat", + "@oneClientLoggedOut": {}, + "editBundlesForAccount": "Editați pachetele pentru acest cont", + "@editBundlesForAccount": {}, + "bundleName": "Numele pachetului", + "@bundleName": {}, + "link": "Link", + "@link": {}, + "passphraseOrKey": "frază de acces sau cheie de recuperare", + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "password": "Parolă", + "@password": { + "type": "text", + "placeholders": {} + }, + "passwordForgotten": "Parola uitată", + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parola a fost schimbată", + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "passwordRecovery": "Recuperare parolei", + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "people": "Persoane", + "@people": { + "type": "text", + "placeholders": {} + }, + "pickImage": "Alegeți o imagine", + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "pleaseChoose": "Vă rugăm să alegeți", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "pin": "Fixați", + "@pin": { + "type": "text", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Vă rugăm să alegeți un passcode", + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "pleaseEnter4Digits": "Vă rugăm să introduceți 4 cifre sau puteți să lăsați gol să dezactivați lacătul aplicației.", + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Vă rugăm să introduceți parola voastră", + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Vă rugăm să introduceți username-ul vostru", + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vă rugăm să urmați instrucțiunele pe website și apoi să apăsați pe următor.", + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "reason": "Motiv", + "@reason": { + "type": "text", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} a respins invitația", + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedAnEvent": "{username} a redactat un eveniment", + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "removeAllOtherDevices": "Eliminați toate celelalte dispozitive", + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "removeYourAvatar": "Ștergeți avatarul", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "renderRichContent": "Reda conținut bogat al mesajelor", + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Înlocuiți camera cu versiune mai nouă", + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "reply": "Răspundeți", + "@reply": { + "type": "text", + "placeholders": {} + }, + "reportMessage": "Raportați mesajul", + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "requestPermission": "Cereți permisiune", + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "saveFile": "Salvați fișierul", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "search": "Căutați", + "@search": { + "type": "text", + "placeholders": {} + }, + "recoveryKey": "Cheie de recuperare", + "@recoveryKey": {}, + "recoveryKeyLost": "Cheia de recuperare pierdută?", + "@recoveryKeyLost": {}, + "seenByUser": "Văzut de {username}", + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "muteChat": "Amuțați chatul", + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "needPantalaimonWarning": "Vă rugăm să fiți conștienți că e nevoie de Pantalaimon să folosiți criptare end-to-end deocamdată.", + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "autoplayImages": "Anima automatic stickere și emote animate", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "sendOnEnter": "Trimite cu tasta enter", + "@sendOnEnter": {}, + "changedTheChatPermissions": "{username} a schimbat permisiunile chatului", + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "extremeOffensive": "De foarte mare ofensă", + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "text", + "placeholders": {} + }, + "invitedUser": "📩{username} a invitat {targetName}", + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "deviceKeys": "Cheile dispozitivului:", + "@deviceKeys": {}, + "pleaseEnterRecoveryKey": "Vă rugăm să introduceți cheia voastră de recuperare:", + "@pleaseEnterRecoveryKey": {}, + "newVerificationRequest": "Cerere de verificare nouă!", + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "remove": "Eliminați", + "@remove": { + "type": "text", + "placeholders": {} + }, + "play": "Redați {fileName}", + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "channelCorruptedDecryptError": "Criptarea a fost corupată", + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "chooseAStrongPassword": "Alegeți o parolă robustă", + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "commandHint_cuddle": "Trimiteți o îmbrățișare", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName} v-a trimis ochi googly", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "areYouSureYouWantToLogout": "Sunteți sigur că doriți să vă deconectați?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} a schimbat pseudonimele camerei", + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changeYourAvatar": "Schimbați avatarul vostru", + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "commandHint_join": "Alăturați-vă la camera alesă", + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "allChats": "Toate Chaturile", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "commandHint_invite": "Invitați utilizatorul ales la această cameră", + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "changeTheNameOfTheGroup": "Schimbați numele grupului", + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "Trimiteți câțiva ochi googly", + "@commandHint_googly": {}, + "botMessages": "Mesaje Bot", + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "all": "Toate", + "@all": { + "type": "text", + "placeholders": {} + }, + "blocked": "Blocat", + "@blocked": { + "type": "text", + "placeholders": {} + }, + "changedTheJoinRules": "{username} a schimbat regulile de alăturare", + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheProfileAvatar": "{username} s-a schimbat avatarul", + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "appLock": "Lacăt aplicație", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} a schimbat vizibilitatea istoriei chatului la: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "close": "Închideți", + "@close": { + "type": "text", + "placeholders": {} + }, + "reopenChat": "Deschide din nou chatul", + "@reopenChat": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Vă rugăm să încercați din nou mai târziu sau să alegeți un server diferit.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWithPassword": "Conectați-vă cu parolă", + "@signInWithPassword": {} +} diff --git a/assets/l10n/intl_ru.arb b/assets/l10n/intl_ru.arb index 67509d2206..0d3a77d349 100644 --- a/assets/l10n/intl_ru.arb +++ b/assets/l10n/intl_ru.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} принял(а) приглашение войти в чат", + "acceptedTheInvitation": "👍 {username} принял(а) приглашение", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Сведения об учётной записи", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} активировал(а) сквозное шифрование", + "activatedEndToEndEncryption": "🔐 {username} активировал(а) сквозное шифрование", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Добавить описание группы", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Добавить нового друга", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Администратор", "@admin": { "type": "text", @@ -70,11 +55,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Уже есть учётная запись?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} ответил(а) на звонок", "@answeredTheCall": { "type": "text", @@ -97,11 +77,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Архивированная комната", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Разрешено ли гостям присоединяться", "@areGuestsAllowedToJoin": { "type": "text", @@ -117,21 +92,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Введите кодовую фразу для безопасного хранилища или ключ восстановления, чтобы кэшировать ключи.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Для подписи ключа другого пользователя, пожалуйста, введите вашу парольную фразу или ключ восстановления.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Пожалуйста, введите вашу парольную фразу или ключ восстановления для подтвердждения сессии.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Принять этот запрос подтверждения от {username}?", "@askVerificationRequest": { "type": "text", @@ -139,31 +104,11 @@ "username": {} } }, - "audioPlayerPause": "Пауза", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Играть", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Аутентификация", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Автоматически воспроизводить анимированные стикеры и эмодзи", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Аватар изменён", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Домашний сервер поддерживает следующие типы входа в систему:\n{serverVersions}\nНо это приложение поддерживает только:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -213,11 +158,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Ключи кэшированы", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Отмена", "@cancel": { "type": "text", @@ -339,27 +279,17 @@ "username": {} } }, - "changelog": "Журнал изменений", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Изменить пароль", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Изменения были сохранены", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Изменить сервер Matrix", + "changeTheHomeserver": "Изменить домашний сервер", "@changeTheHomeserver": { "type": "text", "placeholders": {} }, - "changeTheme": "Тема", + "changeTheme": "Персонализация", "@changeTheme": { "type": "text", "placeholders": {} @@ -369,16 +299,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Изменить сервер", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Изменить фон чатов", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Изменить свой аватар", "@changeYourAvatar": { "type": "text", @@ -419,18 +339,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Выберите имя пользователя", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Очистить архив", "@clearArchive": {}, - "clearText": "Очистить текст", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Закрыть", "@close": { "type": "text", @@ -518,12 +428,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Сравните и убедитесь, что следующие эмодзи соответствуют эмодзи на другом устройстве:", + "compareEmojiMatch": "Сравните эмодзи", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Сравните и убедитесь, что следующие числа соответствуют числам на другом устройстве:", + "compareNumbersMatch": "Сравните числа", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -543,11 +453,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Попытка подключения не удалась", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Контакт был приглашен в группу", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -568,11 +473,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Просмотр содержимого", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Скопировано в буфер обмена", "@copiedToClipboard": { "type": "text", @@ -595,16 +495,6 @@ "error": {} } }, - "couldNotSetAvatar": "Не удалось установить аватар", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Не удалось установить отображаемое имя", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} участника(ов)", "@countParticipants": { "type": "text", @@ -617,38 +507,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Создать учётную запись сейчас", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} создал(а) чат", + "createdTheChat": "💬 {username} создал(а) чат", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Новая группа", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Новое пространство", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Кросс-подпись отключена", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Кросс-подпись включена", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "В настоящее время активен(а)", "@currentlyActive": { "type": "text", @@ -689,7 +559,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Уровень разрешений по умолчанию", + "defaultPermissionLevel": "Уровень разрешений по умолчанию для новых пользователей", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -709,11 +579,6 @@ "type": "text", "placeholders": {} }, - "deny": "Отклонить", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Устройство", "@device": { "type": "text", @@ -729,46 +594,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Шифрование является безопасным только тогда, когда все устройства проверены.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Личные чаты", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Удалить изображение", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Обзор", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Обзор групп", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Отображаемое имя было изменено", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Пожертвовать", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Отменить и больше не спрашивать", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Скачать файл", "@downloadFile": { "type": "text", @@ -784,21 +619,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Изменить разрешения чата", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Отображаемое имя", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Сервер Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Редактировать псевдонимы комнаты", "@editRoomAliases": { "type": "text", @@ -814,7 +639,7 @@ "type": "text", "placeholders": {} }, - "emoteInvalid": "Недопустимый краткий код эмодзи!", + "emoteInvalid": "Недопустимый код эмодзи!", "@emoteInvalid": { "type": "text", "placeholders": {} @@ -829,7 +654,7 @@ "type": "text", "placeholders": {} }, - "emoteShortcode": "Краткий код для эмодзи", + "emoteShortcode": "Код эмодзи", "@emoteShortcode": { "type": "text", "placeholders": {} @@ -844,11 +669,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Включите резервное копирование чатов, чтобы никогда не терять доступ к своим чатам.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "Включить набор эмодзи глобально", "@enableEmotesGlobally": { "type": "text", @@ -874,21 +694,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Алгоритм шифрования", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Шифрование не включено", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Настройки сквозного шифрования", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} завершил(а) звонок", "@endedTheCall": { "type": "text", @@ -896,24 +706,12 @@ "senderName": {} } }, - "enterAGroupName": "Введите название группы", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Введите адрес электронной почты", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Введите название пространства", - "@enterASpacepName": {}, - "enterAUsername": "Введите имя пользователя", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Введите адрес вашего сервера Matrix", + "enterYourHomeserver": "Введите адрес вашего домашнего сервера", "@enterYourHomeserver": { "type": "text", "placeholders": {} @@ -940,11 +738,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Размер файла", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -960,16 +753,6 @@ "type": "text", "placeholders": {} }, - "friday": "Пятница", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Друзья", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "С момента присоединения", "@fromJoining": { "type": "text", @@ -990,16 +773,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Описание группы", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Описание группы изменено", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Публичная группа", "@groupIsPublic": { "type": "text", @@ -1050,11 +823,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Несовместимый сервер Matrix", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Насколько оскорбительным является этот контент?", "@howOffensiveIsThisContent": { "type": "text", @@ -1080,16 +848,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Вы можете игнорировать пользователей, которые вам мешают. Вы не сможете получать сообщения или приглашения в комнату от пользователей из вашего личного списка игнорирования.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Игнорировать имя пользователя", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Я перешёл по ссылке", "@iHaveClickedOnLink": { "type": "text", @@ -1105,11 +863,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Неверный адрес", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Пригласить контакт", "@inviteContact": { "type": "text", @@ -1127,7 +880,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} пригласил(а) {targetName}", + "invitedUser": "📩 {username} пригласил(а) {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1145,7 +898,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} пригласил(а) вас в FluffyChat. \n1. Установите FluffyChat: https://fluffychat.im \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: {link}", + "inviteText": "{username} пригласил(а) вас в FluffyChat. \n1. Посетите https://fluffychat.im и установите приложение \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1153,17 +906,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Правильно ли указан следующий ключ устройства?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "печатает…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} присоединился(ась) к чату", + "joinedTheChat": "👋 {username} присоединился(ась) к чату", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1175,17 +923,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Ключи сохранены в кэше", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Ключи отсутствуют", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} исключил(а) {targetName}", + "kicked": "👞 {username} выгнал(а) {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1193,7 +931,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} исключил(а) и заблокировал(а) {targetName}", + "kickedAndBanned": "🙅 {username} выгнал(а) и заблокировал(а) {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1201,7 +939,7 @@ "targetName": {} } }, - "kickFromChat": "Исключить из чата", + "kickFromChat": "Выгнать из чата", "@kickFromChat": { "type": "text", "placeholders": {} @@ -1213,16 +951,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Последний IP, с которого заходили", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "был(а) в сети давно", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Покинуть", "@leave": { "type": "text", @@ -1282,33 +1010,11 @@ "homeserver": {} } }, - "loginWith": "Войти через {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Выйти", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Сделать модератором", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Сделать администратором", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Убедитесь, что идентификатор действителен", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Изменения участников", "@memberChanges": { "type": "text", @@ -1324,28 +1030,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Сообщение будет удалено для всех участников", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Модератор", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Понедельник", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Еще 1 событие} other{ещё {count} событий}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Отключить уведомления", "@muteChat": { "type": "text", @@ -1361,7 +1050,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Новое сообщение во FluffyChat", + "newMessageInFluffyChat": "💬 Новое сообщение во FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1386,16 +1075,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat в настоящее время не поддерживает включение кросс-подписи. Пожалуйста, включите его в Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Нет описания", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Эмодзи не найдены 😕", "@noEmotesFound": { "type": "text", @@ -1406,7 +1085,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Похоже, у вас нет служб Google на вашем телефоне. Это хорошее решение для вашей конфиденциальности! Для получения push-уведомлений во FluffyChat мы рекомендуем использовать https://microg.org/ или https://unifiedpush.org/.", + "noGoogleServicesWarning": "Похоже, у вас нет служб Google на вашем телефоне. Это хорошее решение для вашей конфиденциальности! Для получения push-уведомлений во FluffyChat мы рекомендуем использовать ntfy. С ntfy или другим провайдером единых уведомлений вы можете получать push-уведомления безопасным способом передачи данных. Скачать ntfy можно из F-Droid или из Play Маркета.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1419,11 +1098,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Пожалуйста, включите резервное копирование онлайн-ключей из Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ничего", "@none": { "type": "text", @@ -1439,21 +1113,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Никаких общественных комнат не найдено…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Комнаты не найдены…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Статусы пока не найдены.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Уведомления", "@notifications": { "type": "text", @@ -1464,18 +1128,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Не поддерживается в веб-версии", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} выбран(о)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} пользователей печатают…", "@numUsersTyping": { "type": "text", @@ -1508,11 +1160,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Резервное копирование ключей на сервере отключено", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Резервное копирование ключей на сервере включено", "@onlineKeyBackupEnabled": { "type": "text", @@ -1523,7 +1170,7 @@ "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "Упс! Что-то пошло не так…", + "oopsSomethingWentWrong": "Ой, что-то пошло не так…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1543,16 +1190,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(Необязательно) Ваш адрес электронной почты", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(необязательно) Название группы", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Или", "@or": { "type": "text", @@ -1563,11 +1200,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Участвующие устройства", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "пароль или ключ восстановления", "@passphraseOrKey": { "type": "text", @@ -1625,11 +1257,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Пожалуйста, выберите имя пользователя", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Пожалуйста, нажмите на ссылку в электронной почте, для того чтобы продолжить.", "@pleaseClickOnLink": { "type": "text", @@ -1640,16 +1267,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Пожалуйста, введите Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Пожалуйста, введите свой ключ безопасности:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Пожалуйста, введите ваш пароль", "@pleaseEnterYourPassword": { "type": "text", @@ -1675,26 +1292,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Публичные группы", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Открытый ключ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Публичные комнаты", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Публичное пространство", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Правила push", "@pushRules": { "type": "text", @@ -1727,7 +1329,7 @@ "type": "text", "placeholders": {} }, - "reject": "Отклонить", + "reject": "Отказать", "@reject": { "type": "text", "placeholders": {} @@ -1771,11 +1373,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Удалить сообщение", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Удалить свой аватар", "@removeYourAvatar": { "type": "text", @@ -1806,16 +1403,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Запросить доступ к предыдущим сообщениям", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Отменить все права доступа", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Комната обновлена", "@roomHasBeenUpgraded": { "type": "text", @@ -1826,53 +1413,21 @@ "type": "text", "placeholders": {} }, - "saturday": "Суббота", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Файл сохранён как {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "Сохранить файл", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "Сохранить файл в эту папку", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "Поиск", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Поиск чата", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Безопасность", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Ключ безопасности", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ключ безопасности потерян?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Просмотрено пользователем {username}", "@seenByUser": { "type": "text", @@ -1880,23 +1435,7 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Просмотрено пользователями {username} и {count} другими}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Просмотрено пользователями {username} и {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Отправить", + "send": "Прислать", "@send": { "type": "text", "placeholders": {} @@ -1915,11 +1454,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Разрешить отправку отчетов об ошибках в sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Отправить файл", "@sendFile": { "type": "text", @@ -1950,35 +1484,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} отправил(а) файл", + "sentAFile": "📁 {username} отправил(а) файл", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} отправил(а) аудио", + "sentAnAudio": "🎤 {username} отправил(а) аудио", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} отправил(а) изображение", + "sentAPicture": "🖼️ {username} отправил(а) изображение", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} отправил(а) стикер", + "sentASticker": "😊 {username} отправил(а) стикер", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} отправил(а) видео", + "sentAVideo": "🎥 {username} отправил(а) видео", "@sentAVideo": { "type": "text", "placeholders": { @@ -1992,21 +1526,6 @@ "senderName": {} } }, - "sentryInfo": "Информация о вашей конфиденциальности: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Сессия подтверждена", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Установить изображение профиля", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Установить как основной псевдоним", "@setAsCanonicalAlias": { "type": "text", @@ -2017,11 +1536,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Задать описание группы", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Установить ссылку для приглашения", "@setInvitationLink": { "type": "text", @@ -2064,11 +1578,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Зарегистрироваться", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Единая точка входа", "@singlesignon": { "type": "text", @@ -2079,11 +1588,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Звук, вибрация, цвет светодиода", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Исходный код", "@sourceCode": { "type": "text", @@ -2106,11 +1610,6 @@ "senderName": {} } }, - "startYourFirstChat": "Начните свой первый чат прямо сейчас! 🙂\n- Нажмите на 'Новый чат'\n- Сканируйте QR-код друга\n- Веселитесь в чате", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Статус", "@status": { "type": "text", @@ -2126,11 +1625,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Воскресенье", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Синхронизация… Пожалуйста, подождите.", "@synchronizingPleaseWait": { "type": "text", @@ -2141,21 +1635,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Нажмите на устройство, чтобы проверить", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Нажмите, чтобы показать изображение", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Нажмите, чтобы показать меню", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Они не совпадают", "@theyDontMatch": { "type": "text", @@ -2166,26 +1645,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Эта комната была заархивирована.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Четверг", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes}:{suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2222,11 +1681,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Вторник", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Недоступен", "@unavailable": { "type": "text", @@ -2262,16 +1716,6 @@ "type": {} } }, - "unknownSessionVerify": "Неизвестная сессия, пожалуйста, проверьте", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Разблокировать резервную копию чата", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Включить уведомления", "@unmuteChat": { "type": "text", @@ -2289,18 +1733,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} непрочитанных сообщения(ий)}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Использовать цвета, совместимые с AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} и {count} других участников печатают…", "@userAndOthersAreTyping": { "type": "text", @@ -2324,7 +1756,7 @@ "username": {} } }, - "userLeftTheChat": "{username} покинул(а) чат", + "userLeftTheChat": "🚪 {username} покинул(а) чат", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2336,11 +1768,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Пользователь не проверен", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} отправил(а) событие типа \"{type}\"", "@userSentUnknownEvent": { "type": "text", @@ -2349,36 +1776,16 @@ "type": {} } }, - "userUnknownVerification": "У пользователя неизвестный статус верификации", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Пользователь проверен", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Проверено", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Успешно проверена сессия!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Проверить", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Проверить вручную", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Начать проверку", "@verifyStart": { "type": "text", @@ -2394,11 +1801,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Проверить пользователя", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Видеозвонок", "@videoCall": { "type": "text", @@ -2439,7 +1841,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Обои", + "wallpaper": "Обои:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2449,21 +1851,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Сквозное шифрование в настоящее время в бета-версии! Используйте на свой риск!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Среда", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Добро пожаловать в самый симпатичный мессенджер в сети Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Мы отправили вам электронное письмо", "@weSentYouAnEmail": { "type": "text", @@ -2509,78 +1896,30 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Вы приглашены в этот чат", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Вы больше не участвуете в этом чате", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Вы не можете пригласить себя", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Вы были заблокированы в этом чате", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Ваши чаты синхронизируются…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Ваше имя пользователя", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Ваш открытый ключ", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Вы будете подключены к {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Приблизить", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Отдалить", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Чат был удален из этого пространства", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Чат был добавлен в это пространство", "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Добавить в пространство", "@addToSpace": {}, "scanQrCode": "Сканировать QR-код", "@scanQrCode": {}, - "typeInInviteLinkManually": "Введите ссылку приглашения...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Поделиться ссылкой приглашения", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Просто отсканируйте QR-код или поделитесь ссылкой приглашения, если вы не рядом друг с другом.", - "@createNewChatExplaination": {}, "sendOnEnter": "Отправлять по Enter", "@sendOnEnter": {}, - "homeserver": "Сервер Matrix", + "homeserver": "Домашний сервер", "@homeserver": {}, "serverRequiresEmail": "Этот сервер должен подтвердить ваш адрес электронной почты для регистрации.", "@serverRequiresEmail": {}, @@ -2596,28 +1935,14 @@ "@editBundlesForAccount": {}, "addAccount": "Добавить учетную запись", "@addAccount": {}, - "newUsernameDescription": "Ваш идентификатор пользователя будет иметь формат @имяпользователя:названиесервера", - "@newUsernameDescription": {}, - "newPasswordDescription": "Чтобы иметь возможность восстановить свой пароль, вы должны позже добавить адрес электронной почты в свою учетную запись.", - "@newPasswordDescription": {}, "link": "Ссылка", "@link": {}, "oneClientLoggedOut": "Один из ваших клиентов вышел", "@oneClientLoggedOut": {}, "yourChatBackupHasBeenSetUp": "Резервное копирование чата настроено.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Для защиты ваших сообщений мы сгенерировали для вас ключ восстановления.\nПожалуйста, храните его в надежном месте, например, в менеджере паролей.", - "@setupChatBackupDescription": {}, - "setupChatBackup": "Настройте резервное копирование чата", - "@setupChatBackup": {}, - "yourUserId": "Ваш ID пользователя:", - "@yourUserId": {}, "unverified": "Не проверено", "@unverified": {}, - "iWroteDownTheKey": "Ключ записан", - "@iWroteDownTheKey": {}, - "passwordsDoNotMatch": "Пароли не совпадают!", - "@passwordsDoNotMatch": {}, "commandHint_clearcache": "Очистить кэш", "@commandHint_clearcache": { "type": "text", @@ -2639,19 +1964,6 @@ "@openGallery": {}, "removeFromSpace": "Удалить из пространства", "@removeFromSpace": {}, - "removeFromSpaceDescription": "Это удалит данный чат из текущего пространства. Он все еще будет виден в разделе \"Все чаты\".", - "@removeFromSpaceDescription": {}, - "loginWithOneClick": "Вход одним нажатием", - "@loginWithOneClick": {}, - "pleaseEnterValidEmail": "Пожалуйста, введите действительный адрес электронной почты.", - "@pleaseEnterValidEmail": {}, - "pleaseChooseAtLeastChars": "Пожалуйста, выберите не менее {min} символов.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "commandHint_create": "Создайте пустой групповой чат\nИспользуйте --no-encryption, чтобы отключить шифрование", "@commandHint_create": { "type": "text", @@ -2663,16 +1975,10 @@ "@addToSpaceDescription": {}, "start": "Начать", "@start": {}, - "setupChatBackupNow": "Настройте резервную копию чата прямо сейчас", - "@setupChatBackupNow": {}, "time": "Время", "@time": {}, "messageType": "Тип сообщения", "@messageType": {}, - "pleaseEnterSecurityKeyDescription": "Чтобы разблокировать резервную копию чата, введите ключ безопасности, сгенерированный в предыдущей сессии. Ваш ключ безопасности НЕ является вашим паролем.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Сохранить ключ безопасности сейчас", - "@saveTheSecurityKeyNow": {}, "repeatPassword": "Повторите пароль", "@repeatPassword": {}, "openVideoCamera": "Открыть камеру для видео", @@ -2680,10 +1986,6 @@ "type": "text", "placeholders": {} }, - "yourStory": "Ваша история", - "@yourStory": {}, - "replyHasBeenSent": "Ответ отправлен", - "@replyHasBeenSent": {}, "videoWithSize": "Видео ({size})", "@videoWithSize": { "type": "text", @@ -2691,39 +1993,8 @@ "size": {} } }, - "storyFrom": "История за {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "addToStory": "Добавить в историю", - "@addToStory": {}, "publish": "Опубликовать", "@publish": {}, - "whoCanSeeMyStories": "Кто может видеть мои истории?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Отписаться от историй", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Этот пользователь еще ничего не опубликовал в своей истории", - "@thisUserHasNotPostedAnythingYet": {}, - "bubbleSize": "Размер пузыря", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whoCanSeeMyStoriesDesc": "Обратите внимание, что люди могут видеть и связываться друг с другом в вашей истории.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Что происходит?", - "@whatIsGoingOn": {}, - "addDescription": "Добавить описание", - "@addDescription": {}, - "storyPrivacyWarning": "Обратите внимание, что люди могут видеть и связываться друг с другом в вашей истории. Ваши истории будут видны в течение 24 часов, но нет гарантии, что они будут удалены со всех устройств и серверов.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Я понимаю", - "@iUnderstand": {}, "dismiss": "Отклонить", "@dismiss": {}, "markAsRead": "Отметить как прочитанное", @@ -2732,12 +2003,6 @@ "@reportUser": {}, "openChat": "Открыть чат", "@openChat": {}, - "matrixWidgets": "Виджеты Matrix", - "@matrixWidgets": {}, - "editIntegrations": "Редактирование виджетов и интеграций", - "@editIntegrations": {}, - "integrationsNotImplemented": "Редактирование виджетов и интеграций пока невозможно.", - "@integrationsNotImplemented": {}, "reactedWith": "{sender} реагирует с {reaction}", "@reactedWith": { "type": "text", @@ -2746,7 +2011,7 @@ "reaction": {} } }, - "emojis": "Эмоджи", + "emojis": "Эмодзи", "@emojis": {}, "voiceCall": "Голосовой звонок", "@voiceCall": {}, @@ -2764,8 +2029,6 @@ "@emailOrUsername": {}, "pinMessage": "Прикрепить к комнате", "@pinMessage": {}, - "pinnedEventsError": "Ошибка загрузки закрепленных сообщений", - "@pinnedEventsError": {}, "confirmEventUnpin": "Вы уверены, что хотите навсегда открепить событие?", "@confirmEventUnpin": {}, "switchToAccount": "Переключиться на учётную запись {number}", @@ -2779,8 +2042,6 @@ "@nextAccount": {}, "previousAccount": "Предыдущая учётная запись", "@previousAccount": {}, - "editWidgets": "Редактировать виджеты", - "@editWidgets": {}, "addWidget": "Добавить виджет", "@addWidget": {}, "widgetVideo": "Видео", @@ -2799,19 +2060,14 @@ "@widgetNameError": {}, "errorAddingWidget": "Ошибка при добавлении виджета.", "@errorAddingWidget": {}, - "showDirectChatsInSpaces": "Показывать связанные Личные чаты в Пространствах", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "separateChatTypes": "Разделять Личные чаты, Группы и Пространства", + "separateChatTypes": "Разделять личные чаты и группы", "@separateChatTypes": { "type": "text", "placeholders": {} }, "youRejectedTheInvitation": "Вы отклонили приглашение", "@youRejectedTheInvitation": {}, - "youAcceptedTheInvitation": "Вы приняли приглашение", + "youAcceptedTheInvitation": "👍 Вы приняли приглашение", "@youAcceptedTheInvitation": {}, "youUnbannedUser": "Вы разблокировали {user}", "@youUnbannedUser": { @@ -2821,19 +2077,19 @@ }, "youJoinedTheChat": "Вы присоединились к чату", "@youJoinedTheChat": {}, - "youKickedAndBanned": "Вы исключили и заблокировали {user}", + "youKickedAndBanned": "🙅 Вы выгнали и заблокировали {user}", "@youKickedAndBanned": { "placeholders": { "user": {} } }, - "youInvitedUser": "Вы пригласили {user}", + "youInvitedUser": "📩 Вы пригласили {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "Вы исключили {user}", + "youKicked": "👞 Вы выгнали {user}", "@youKicked": { "placeholders": { "user": {} @@ -2851,24 +2107,16 @@ "user": {} } }, - "youInvitedBy": "Вы были приглашены {user}", + "youInvitedBy": "📩 Вы были приглашены {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "showSpaces": "Показать список пространств", - "@showSpaces": {}, - "noEmailWarning": "Пожалуйста, введите действительный адрес электронной почты. В противном случае вы не сможете сбросить пароль. Если вы не хотите этого делать, нажмите еще раз на кнопку, чтобы продолжить.", - "@noEmailWarning": {}, "recoveryKeyLost": "Ключ восстановления утерян?", "@recoveryKeyLost": {}, - "stories": "Истории", - "@stories": {}, "users": "Пользователи", "@users": {}, - "enableAutoBackups": "Включить автоматическое резервное копирование", - "@enableAutoBackups": {}, "unlockOldMessages": "Разблокировать старые сообщения", "@unlockOldMessages": {}, "storeInSecureStorageDescription": "Сохраните ключ восстановления в безопасном хранилище этого устройства.", @@ -2881,12 +2129,768 @@ "@recoveryKey": {}, "pleaseEnterRecoveryKey": "Введите ключ восстановления:", "@pleaseEnterRecoveryKey": {}, - "saveTheRecoveryKeyNow": "Сохранить ключ восстановления сейчас", - "@saveTheRecoveryKeyNow": {}, "pleaseEnterRecoveryKeyDescription": "Чтобы разблокировать старые сообщения, введите ключ восстановления, сгенерированный в предыдущем сеансе. Ваш ключ восстановления НЕ является вашим паролем.", "@pleaseEnterRecoveryKeyDescription": {}, "storeInAndroidKeystore": "Сохранить в Android KeyStore", "@storeInAndroidKeystore": {}, "storeInAppleKeyChain": "Сохранить в Apple KeyChain", - "@storeInAppleKeyChain": {} + "@storeInAppleKeyChain": {}, + "countFiles": "{count} файлов", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "user": "Пользователь", + "@user": {}, + "confirmMatrixId": "Пожалуйста, подтвердите Matrix ID, чтобы удалить свою учётную запись.", + "@confirmMatrixId": {}, + "supposedMxid": "Это должно быть {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "dehydrateTor": "Пользователи TOR: Экспорт сеанса", + "@dehydrateTor": {}, + "indexedDbErrorLong": "К сожалению, по умолчанию хранилище сообщений не включено в приватном режиме.\nПожалуйста, посетите\n- about:config\n- установите для dom.indexedDB.privateBrowsing.enabled значение true\nВ противном случае запуск FluffyChat будет невозможен.", + "@indexedDbErrorLong": {}, + "custom": "Пользовательское", + "@custom": {}, + "hydrate": "Восстановить из файла резервной копии", + "@hydrate": {}, + "hydrateTor": "Пользователи TOR: Импорт экспорта сессии", + "@hydrateTor": {}, + "hydrateTorLong": "В прошлый раз вы экспортировали свою сессию в TOR? Быстро импортируйте его и продолжайте общение.", + "@hydrateTorLong": {}, + "dehydrateTorLong": "Для пользователей TOR рекомендуется экспортировать сессию перед закрытием окна.", + "@dehydrateTorLong": {}, + "dehydrate": "Экспорт сеанса и очистка устройства", + "@dehydrate": {}, + "dehydrateWarning": "Это действие не может быть отменено. Убедитесь, что вы безопасно сохранили файл резервной копии.", + "@dehydrateWarning": {}, + "indexedDbErrorTitle": "Проблемы с приватным режимом", + "@indexedDbErrorTitle": {}, + "otherCallingPermissions": "Микрофон, камера и другие разрешения FluffyChat", + "@otherCallingPermissions": {}, + "enterSpace": "Войти в пространство", + "@enterSpace": {}, + "screenSharingDetail": "Вы делитесь своим экраном в FuffyChat", + "@screenSharingDetail": {}, + "callingAccountDetails": "Позволяет FluffyChat использовать родное android приложение для звонков.", + "@callingAccountDetails": {}, + "newSpace": "Новое пространство", + "@newSpace": {}, + "appearOnTop": "Появляться сверху", + "@appearOnTop": {}, + "commandHint_markasdm": "Пометить как комнату личных сообщений", + "@commandHint_markasdm": {}, + "appearOnTopDetails": "Позволяет приложению отображаться сверху (не требуется, если у вас уже настроен Fluffychat как аккаунт для звонков)", + "@appearOnTopDetails": {}, + "foregroundServiceRunning": "Это уведомление появляется, когда запущена основная служба.", + "@foregroundServiceRunning": {}, + "newGroup": "Новая группа", + "@newGroup": {}, + "enterRoom": "Войти в комнату", + "@enterRoom": {}, + "allSpaces": "Все пространства", + "@allSpaces": {}, + "callingPermissions": "Разрешения на звонки", + "@callingPermissions": {}, + "callingAccount": "Аккаунт для звонков", + "@callingAccount": {}, + "commandHint_markasgroup": "Пометить как группу", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Почему это сообщение нечитаемо?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Это может произойти, если сообщение было отправлено до того, как вы вошли в свою учетную запись на данном устройстве.\n\nТакже возможно, что отправитель заблокировал ваше устройство или что-то пошло не так с интернет-соединением.\n\nВы можете прочитать сообщение на другой сессии? Тогда вы можете перенести сообщение с неё! Перейдите в Настройки > Устройства и убедитесь, что ваши устройства проверили друг друга. Когда вы откроете комнату в следующий раз и обе сессии будут открыты, ключи будут переданы автоматически.\n\nВы не хотите потерять ключи при выходе из системы или переключении устройств? Убедитесь, что вы включили резервное копирование чата в настройках.", + "@noKeyForThisMessage": {}, + "screenSharingTitle": "общий доступ к экрану", + "@screenSharingTitle": {}, + "numChats": "{number} чатов", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "fileIsTooBigForServer": "Отправка не удалась! Сервер поддерживает только вложения размером до {max}.", + "@fileIsTooBigForServer": {}, + "hideUnimportantStateEvents": "Скрыть необязательные события статуса", + "@hideUnimportantStateEvents": {}, + "sorryThatsNotPossible": "Извините... это невозможно", + "@sorryThatsNotPossible": {}, + "openLinkInBrowser": "Открыть ссылку в браузере", + "@openLinkInBrowser": {}, + "fileHasBeenSavedAt": "Файл сохранён в {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "commandHint_cuddle": "Отправить улыбку", + "@commandHint_cuddle": {}, + "readUpToHere": "Непрочитанное", + "@readUpToHere": {}, + "commandHint_hug": "Отправить обнимашки", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} улыбнулся(-ась) Вам", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} обнял(а) Вас", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "jump": "Перейти", + "@jump": {}, + "doNotShowAgain": "Не показывать снова", + "@doNotShowAgain": {}, + "newSpaceDescription": "Пространства позволяют объединять Ваши чаты и создавать частные или общедоступные сообщества.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "В целях безопасности Вы не можете отключить шифрование в чате, где оно было включено.", + "@disableEncryptionWarning": {}, + "deviceKeys": "Ключи устройств:", + "@deviceKeys": {}, + "noBackupWarning": "Внимание! Без резервного копиирования, Вы потеряете доступ к своим зашифрованным сообщениям. Крайне рекомендуется включить резервное копирование перед выходом.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Другие устройства не найдены", + "@noOtherDevicesFound": {}, + "reportErrorDescription": "😭 О, нет. Что-то пошло не так. При желании вы можете сообщить об этой ошибке разработчикам.", + "@reportErrorDescription": {}, + "report": "сообщить", + "@report": {}, + "allRooms": "Все группы", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "Начните Ваш первый чат", + "@startFirstChat": {}, + "jumpToLastReadMessage": "Последнее прочитанное сообщение", + "@jumpToLastReadMessage": {}, + "wasDirectChatDisplayName": "Пустой чат (был {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "encryptThisChat": "Зашифровать этот чат", + "@encryptThisChat": {}, + "reopenChat": "Открыть чат заново", + "@reopenChat": {}, + "commandHint_googly": "Отправить выпученные глаза", + "@commandHint_googly": {}, + "signInWith": "Войти с {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Это не картинка.", + "@notAnImage": {}, + "importNow": "Импортировать сейчас", + "@importNow": {}, + "importEmojis": "Импортировать эмодзи", + "@importEmojis": {}, + "importFromZipFile": "Импортировать из ZIP-файла", + "@importFromZipFile": {}, + "exportEmotePack": "Экспортировать набор эмодзи как ZIP", + "@exportEmotePack": {}, + "replace": "Заменить", + "@replace": {}, + "googlyEyesContent": "{senderName} выпучил глаза", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "signInWithPassword": "Войти с помощью пароля", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Повторите попытку позже или выберите другой сервер.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "sendTypingNotifications": "Отправлять уведомления о наборе текста", + "@sendTypingNotifications": {}, + "createGroup": "Создать группу", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Вы хотите пригласить {contact} в чат \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Повторите попытку", + "@tryAgain": {}, + "addChatDescription": "Добавить описание чата...", + "@addChatDescription": {}, + "chatPermissions": "Права в чате", + "@chatPermissions": {}, + "chatDescription": "Описание чата", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Описание чата изменено", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Описание чата не создано.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Недопустимое имя сервера", + "@invalidServerName": {}, + "optionalRedactReason": "(Необязательно) Причина редактирования...", + "@optionalRedactReason": {}, + "redactMessageDescription": "Сообщение будет отредактировано для всех участников. Это необратимо.", + "@redactMessageDescription": {}, + "messagesStyle": "Сообщения:", + "@messagesStyle": {}, + "shareInviteLink": "Поделиться приглашением", + "@shareInviteLink": {}, + "redactedBy": "{username} отредактировал это событие", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "Личный чат", + "@directChat": {}, + "profileNotFound": "Пользователь не найден на сервере. Это может быть проблемой подключения или пользователь не существует.", + "@profileNotFound": {}, + "setTheme": "Тема:", + "@setTheme": {}, + "redactedByBecause": "{username} отредактировал это событие. Причина: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "setChatDescription": "Установить описание чата", + "@setChatDescription": {}, + "setColorTheme": "Цветовая тема:", + "@setColorTheme": {}, + "invite": "Пригласить", + "@invite": {}, + "invitePrivateChat": "📨 Пригласить в приватный чат", + "@invitePrivateChat": {}, + "inviteGroupChat": "📨 Пригласить в групповой чат", + "@inviteGroupChat": {}, + "invalidInput": "Недопустимый ввод!", + "@invalidInput": {}, + "wrongPinEntered": "Введён неверный пин-код! Повторите попытку через {seconds} секунд...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "emoteKeyboardNoRecents": "Недавно использованные эмодзи появятся здесь...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "banUserDescription": "Заблокированные в чате пользователи не смогут перезайти в чат, пока они не будут разблокированны.", + "@banUserDescription": {}, + "removeDevicesDescription": "Вы выйдете с этого устройства и больше не будете получать сообщения.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Пользователь сможет при желании зайти в чат снова.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push-уведомления недоступны", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Как только вы назначите этого пользователя администратором, вы не сможете этого отменить, так как их права доступа и ваши будут одинаковы.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Чат переместится в архив. Другим пользователям будет видно, что вы вышли из чата.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} постучался", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Узнать больше", + "@learnMore": {}, + "roomUpgradeDescription": "Затем чат будет воссоздан с новой версией комнаты. Все участники будут уведомлены о необходимости перейти в новый чат. Вы можете узнать больше о версиях комнат на https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Пожалуйста введите число больше 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Пользователь будет изгнан из чата, но не будет заблокирован. В публичных чатах пользователь может перезайти когда угодно.", + "@kickUserDescription": {}, + "blockListDescription": "Вы можете заглушить тревожащих вас пользователей. Вы не будете получать сообщения или приглашения в комнату от пользователей из вашего личного чёрного списка.", + "@blockListDescription": {}, + "blockedUsers": "Заглушённые пользователи", + "@blockedUsers": {}, + "block": "Заглушить", + "@block": {}, + "blockUsername": "Игнорировать имя пользователя", + "@blockUsername": {}, + "createGroupAndInviteUsers": "Создать и начать приглашать", + "@createGroupAndInviteUsers": {}, + "startConversation": "Начать общение", + "@startConversation": {}, + "groupCanBeFoundViaSearch": "Группа может быть найдена поиском", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "К сожалению пользователей с именем \"{query}\" не найдено. Убедитесь, что вы не совершили опечатку.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "yourGlobalUserIdIs": "Ваш глобальный идентификатор - ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Отправить сырой json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Простите... судя по всему это неверный ключ восстановления.", + "@wrongRecoveryKey": {}, + "groupName": "Название группы", + "@groupName": {}, + "databaseMigrationTitle": "База данных оптимизированна", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Поиск #чатов, @людей...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Пожалуйста, подождите. Это может занять некоторое время.", + "@databaseMigrationBody": {}, + "publicSpaces": "Публичные пространства", + "@publicSpaces": {}, + "passwordIsWrong": "Вы ввели неверный пароль", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Пожалуйста, введите свой текущий пароль", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Публичная ссылка", + "@publicLink": {}, + "nothingFound": "Ничего не найдено...", + "@nothingFound": {}, + "newPassword": "Новый пароль", + "@newPassword": {}, + "passwordsDoNotMatch": "Пароли не совпадают", + "@passwordsDoNotMatch": {}, + "select": "Выбрать", + "@select": {}, + "pleaseChooseAStrongPassword": "Пожалуйста, подберите сильный пароль", + "@pleaseChooseAStrongPassword": {}, + "leaveEmptyToClearStatus": "Чтобы очистить статус, оставьте поле пустым.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Присоединиться к пространству", + "@joinSpace": {}, + "searchForUsers": "Поиск @пользователей...", + "@searchForUsers": {}, + "thisDevice": "Данное устройство:", + "@thisDevice": {}, + "decline": "Отклонить", + "@decline": {}, + "databaseBuildErrorBody": "Невозможно собрать базу данных SQlite. Приложение пытается использовать старую базу данных. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "Произошла ошибка при запуске приложения", + "@initAppError": {}, + "sessionLostBody": "Ваш сеанс утерян. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "Приложение пытается восстановить сеанс из резервной копии. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "subspace": "Субпространство", + "@subspace": {}, + "addChatOrSubSpace": "Добавить чат или субпространство", + "@addChatOrSubSpace": {}, + "youInvitedToBy": "📩 Вы были приглашены по ссылке на:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "sendReadReceipts": "Отправка квитанций о прочтении", + "@sendReadReceipts": {}, + "verifyOtherUser": "🔐 Подтвердить другого пользователя", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Подтвердить другое устройство", + "@verifyOtherDevice": {}, + "forwardMessageTo": "Переслать сообщение в {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceiptsDescription": "Другие участники чата могут видеть, когда вы прочитали сообщение.", + "@sendReadReceiptsDescription": {}, + "transparent": "Прозрачный", + "@transparent": {}, + "verifyOtherUserDescription": "Если вы подтвердите другого пользователя, то вы можете быть уверены зная, кому вы действительно пишете. 💪\n\nКогда вы начинаете подтверждение, вы и другой пользователь увидите всплывающее окно в приложении. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом.\n\nЛучший способ сделать это - встретиться в реальной жизни или по видео звонку. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "При подтверждении другого устройства эти устройства могут обмениваться ключами, повышая общую безопасность. 💪 При запуске подтверждения в приложении на обоих устройствах появится всплывающее окно. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом. Лучше иметь оба устройства под рукой перед началом проверки. 🤳", + "@verifyOtherDeviceDescription": {}, + "formattedMessagesDescription": "Отображать содержимое расширенных сообщений, такой как жирный текст, с помощью Markdown.", + "@formattedMessagesDescription": {}, + "acceptedKeyVerification": "{sender} принял(а) подтверждение ключей", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} отклонил(а) подтверждение ключей", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "sendTypingNotificationsDescription": "Другие участники чата могут видеть, когда вы набираете новое сообщение.", + "@sendTypingNotificationsDescription": {}, + "formattedMessages": "Форматированные сообщения", + "@formattedMessages": {}, + "startedKeyVerification": "{sender} начал(а) подтверждение ключей", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} готов(а) к подтверждению ключей", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} запросил(а) подтверждение ключей", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} завершил(а) подтверждение ключей", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "incomingMessages": "Входящие сообщения", + "@incomingMessages": {}, + "presencesToggle": "Показывать сообщения в статусах других пользователей", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "presenceStyle": "Представление:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "hidePresences": "Скрыть список статусов?", + "@hidePresences": {}, + "stickers": "Стикеры", + "@stickers": {}, + "discover": "Исследовать", + "@discover": {}, + "globalChatId": "ID глобального чата", + "@globalChatId": {}, + "customEmojisAndStickersBody": "Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.", + "@customEmojisAndStickersBody": {}, + "hideMemberChangesInPublicChatsBody": "Для улучшения читаемости не показывать на временной шкале входы и выходы из чата.", + "@hideMemberChangesInPublicChatsBody": {}, + "knocking": "Стучаться", + "@knocking": {}, + "accessAndVisibility": "Доступность и видимость", + "@accessAndVisibility": {}, + "publicChatAddresses": "Адресы публичного чата", + "@publicChatAddresses": {}, + "accessAndVisibilityDescription": "Кому разрешено войти в этот чат и как этот чат может быть обнаружен.", + "@accessAndVisibilityDescription": {}, + "userRole": "Роль пользователя", + "@userRole": {}, + "noDatabaseEncryption": "Шифрование базы данных не поддерживается на этой платформе", + "@noDatabaseEncryption": {}, + "appLockDescription": "Заблокировать приложение когда не используется пин код", + "@appLockDescription": {}, + "calls": "Звонки", + "@calls": {}, + "customEmojisAndStickers": "Пользовательские эмодзи и стикеры", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "Скрыть редактированные сообщения", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Скрыть неправильные или неизвестные форматы сообщения", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideRedactedMessagesBody": "Если кто-то редактирует сообщение, оно будет скрыто в чате.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Скрыть изменения участников в публичных чатах", + "@hideMemberChangesInPublicChats": {}, + "overview": "Обзор", + "@overview": {}, + "notifyMeFor": "Уведомлять меня о", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Настройки восстановления пароля", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} желает присоединиться к чату.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "knock": "Постучаться", + "@knock": {}, + "usersMustKnock": "Пользователи должны постучаться", + "@usersMustKnock": {}, + "noOneCanJoin": "Никто не может присоединиться", + "@noOneCanJoin": {}, + "noPublicLinkHasBeenCreatedYet": "Публичная ссылка еще не была создана", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Чат может быть обнаружен через поиск в {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "createNewAddress": "Создать новый адрес", + "@createNewAddress": {}, + "minimumPowerLevel": "{level} является минимальным уровнем.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "commandHint_ignore": "Игнорировать данный matrix ID", + "@commandHint_ignore": {}, + "commandHint_unignore": "Не игнорировать данный matrix ID", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} непрочитанные чаты", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "thereAreCountUsersBlocked": "Сейчас заблокировано {count} пользователей.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "restricted": "Запрещено", + "@restricted": {}, + "knockRestricted": "Стук запрещен", + "@knockRestricted": {}, + "searchIn": "Поиск в чате \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Найти еще...", + "@searchMore": {}, + "gallery": "Галерея", + "@gallery": {}, + "files": "Файлы", + "@files": {}, + "swipeRightToLeftToReply": "Для ответа проведите с права на лево", + "@swipeRightToLeftToReply": {}, + "userLevel": "{level} - Пользователь", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Модератор", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Администратор", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Изменить общие настройки чата", + "@changeGeneralChatSettings": {}, + "changeTheChatPermissions": "Изменить права доступа к чату", + "@changeTheChatPermissions": {}, + "changeTheDescriptionOfTheGroup": "Изменить описание чата", + "@changeTheDescriptionOfTheGroup": {}, + "inviteOtherUsers": "Пригласить других пользователей в этот чат", + "@inviteOtherUsers": {}, + "changeTheVisibilityOfChatHistory": "Изменить видимость истории чата", + "@changeTheVisibilityOfChatHistory": {}, + "countChatsAndCountParticipants": "{chats} чатов и {participants} участников", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "unread": "Непрочитанные", + "@unread": {}, + "space": "Пространство", + "@space": {}, + "spaces": "Пространства", + "@spaces": {}, + "markAsUnread": "Отметить как непрочитанное", + "@markAsUnread": {}, + "goToSpace": "Перейти к пространству: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "sendCanceled": "Отправка отменена", + "@sendCanceled": {}, + "noChatsFoundHere": "Не было найдено ни одного чата. Начать с кем-нибудь новый чат можно, нажав кнопку ниже. ⤵️", + "@noChatsFoundHere": {}, + "updateInstalled": "🎉 Обновление {version} успешно установлено!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Список изменений", + "@changelog": {}, + "invitedBy": "📩 Приглашен(а) {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "doesNotSeemToBeAValidHomeserver": "Этот домашний сервер выглядит несовместимым. Нет ли в ссылке опечаток?", + "@doesNotSeemToBeAValidHomeserver": {}, + "noMoreChatsFound": "Больше чатов не обнаружено...", + "@noMoreChatsFound": {}, + "alwaysUse24HourFormat": "нет", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "compressVideo": "Сжатие видео...", + "@compressVideo": {}, + "oneOfYourDevicesIsNotVerified": "Одно из ваших устройств не подтверждено", + "@oneOfYourDevicesIsNotVerified": {}, + "chatPermissionsDescription": "Задайте уровень власти, необходимый для совершения определённых действий в этом чате. Уровни власти 0, 50 и 100 обычно означают пользователей, модераторов и администраторов соответственно, но любая градация также возможна.", + "@chatPermissionsDescription": {}, + "prepareSendingAttachment": "Подготовка к отправке вложения...", + "@prepareSendingAttachment": {}, + "sendRoomNotifications": "Упоминать @room", + "@sendRoomNotifications": {}, + "calculatingFileSize": "Вычисление размера файла...", + "@calculatingFileSize": {}, + "sendingAttachment": "Отправка вложения...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Создание превью видео...", + "@generatingVideoThumbnail": {}, + "noticeChatBackupDeviceVerification": "Примечание: Если вы подключите все свои устройства к резервному копированию чатов, то они автоматически станут подтверждёнными.", + "@noticeChatBackupDeviceVerification": {}, + "changeTheCanonicalRoomAlias": "Изменить основной общедоступный адрес чата", + "@changeTheCanonicalRoomAlias": {}, + "loginWithMatrixId": "Войти через Matrix ID", + "@loginWithMatrixId": {}, + "whatIsAHomeserver": "Для чего нужен домашний сервер?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Все ваши данные хранятся на домашнем сервере, прямо как у вашего провайдера электронной почты. Вы можете выбрать, какому серверу вы их доверите, при этом сохраняя возможность общаться со всеми. Узнайте больше на https://matrix.org.", + "@homeserverDescription": {}, + "discoverHomeservers": "Список домашних серверов", + "@discoverHomeservers": {}, + "joinedChats": "Вступленные чаты", + "@joinedChats": {}, + "serverInformation": "Информация о сервере:", + "@serverInformation": {}, + "sendingAttachmentCountOfCount": "Отправляю... {index} {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "welcomeText": "Привет. Это FluffyChat. Вы можете подписаться на любой сервер, который совместим с https://matrix.org. А потом поболтать с кем нибудь. Это огромная децентрализованная сеть обмена сообщениями!", + "@welcomeText": {}, + "noContactInformationProvided": "Сервер не предоставляет никакой правдивой контактной информации", + "@noContactInformationProvided": {}, + "aboutHomeserver": "О сервере {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "boldText": "Жирный шрифт", + "@boldText": {}, + "strikeThrough": "Перечёркнутый", + "@strikeThrough": {}, + "pleaseFillOut": "Пожалуйста, заполните", + "@pleaseFillOut": {}, + "sendUncompressed": "Отправлять без зжатия", + "@sendUncompressed": {}, + "invalidUrl": "Не верный URL", + "@invalidUrl": {}, + "addLink": "Добавить ссылку", + "@addLink": {}, + "italicText": "Italic", + "@italicText": {}, + "unableToJoinChat": "Невозможно присоединиться к чату. Возможно, другая сторона уже закончила разговор.", + "@unableToJoinChat": {}, + "serverLimitReached": "Ограничения сервера. Ожидайте{seconds} секунд...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "continueText": "Продолжить", + "@continueText": {}, + "blur": "Размытие:", + "@blur": {}, + "opacity": "Прозрачность:", + "@opacity": {}, + "setWallpaper": "Установить обои", + "@setWallpaper": {}, + "manageAccount": "Управление аккаунтом", + "@manageAccount": {}, + "contactServerAdmin": "Админ сервера", + "@contactServerAdmin": {}, + "contactServerSecurity": "Безопасность контактов сервера", + "@contactServerSecurity": {}, + "supportPage": "Поддержка", + "@supportPage": {}, + "name": "Имя", + "@name": {}, + "version": "Версия", + "@version": {}, + "website": "Сайт", + "@website": {}, + "sendImages": "Отправить {count} изображений", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Сжатие", + "@compress": {} } diff --git a/assets/l10n/intl_si.arb b/assets/l10n/intl_si.arb deleted file mode 100644 index b473cd377a..0000000000 --- a/assets/l10n/intl_si.arb +++ /dev/null @@ -1,374 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.895217", - "about": "පිළිබඳව", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "පිළිගන්න", - "@accept": { - "type": "text", - "placeholders": {} - }, - "account": "ගිණුම", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "ගිණුමේ තොරතුරු", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "addEmail": "වි-තැපෑල එකතු කරන්න", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "admin": "පරිපාලක", - "@admin": { - "type": "text", - "placeholders": {} - }, - "allChats": "සියලුම සංවාද", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "දැනටමත් ගිණුමක් තිබේද?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "ඕනෑම කෙනෙකුට එක්විය හැකිය", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "සංරක්ෂිතය", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "සංරක්ෂිත කාමරය", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "ආගන්තුක පරිශීලකයින්ට එක්වීමට අවසර තිබේද", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "ඔබට විශ්වාසද?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "ඔබට නික්මීමට අවශ්‍ය බව විශ්වාසද?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "ධාවනය", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "උපාංගය අවහිර කරන්න", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "යතුරු නිහිතගතයි", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "අවලංගු කරන්න", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "උපාංගයේ නම වෙනස් කරන්න", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changePassword": "මුරපදය වෙනස් කරන්න", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "chat": "සංවාදය", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "සංවාද උපස්ථය", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "සංවාදයේ විස්තර", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "සංවාද", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "ශක්තිමත් මුරපදයක් තෝරන්න", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "පරිශීලක නාමයක් තෝරන්න", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "සංරක්ෂිතය හිස් කරන්න", - "@clearArchive": {}, - "close": "වසන්න", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_join": "දී ඇති කාමරයට එක්වන්න", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_leave": "මෙම කාමරය හැරයන්න", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandInvalid": "විධානය වලංගු නොවේ", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{{command} විධානයක් නොවේ.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "සසඳා බලා පහත දැක්වෙන ඉමොජි අනෙක් උපාංගයට නිසැකවම ගැලපෙන බවට වග බලා ගන්න:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "සංසන්දනය කර පහත දැක්වෙන අංක අනෙක් උපාංගට නිසැකව ගැලපෙන බවට වග බලා ගන්න:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "තහවුරු කරන්න", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "සබඳින්න", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "සබැඳීමේ උත්සාහය අසාර්ථකයි", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "සමූහය වෙත සබඳතාවයකට ආරාධනා කර ඇත", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "copy": "පිටපත්", - "@copy": { - "type": "text", - "placeholders": {} - }, - "create": "සාදන්න", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "දැන් ගිණුමක් සාදන්න", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "නව සමූහයක් සාදන්න", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "donate": "පරිත්‍යාග", - "@donate": { - "type": "text", - "placeholders": {} - }, - "encryption": "සංකේතාංකනය", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "සියල්ල සූදානම්!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "fontSize": "මුද්‍රණඅකුරේ ප්‍රමාණය", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "නව කාමරයට යන්න", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "කාමරයට එක්වන්න", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "යතුරු නිහිතගත යි", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "next": "ඊලඟ", - "@next": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "ප්‍රසිද්ධ කාමර හමු නොවිණි…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "people": "මිනිසුන්", - "@people": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "ප්‍රසිද්ධ සමූහ", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "removeDevice": "උපාංගය ඉවත්කරන්න", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "කාමරයේ අනුවාදය", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "ලෙස ගොනුව සුරකින්න {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "ගොනුව සුරකින්න", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "ගොනුව මෙම බහාලුමට සුරකින්න", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "securityKey": "ආරක්ෂක යතුර", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "ආරක්ෂක යතුර නැතිවුනාද?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "send": "යවන්න", - "@send": { - "type": "text", - "placeholders": {} - }, - "showPassword": "මුරපදය පෙන්වන්න", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "sunday": "ඉරිදා", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "username": "පරිශීලක නාමය", - "@username": { - "type": "text", - "placeholders": {} - }, - "videoCall": "දෘශ්‍ය ඇමතුම", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "බිතුපත", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "අවවාදයයි!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "wednesday": "බදාදා", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "පණිවිඩයක් ලියන්න…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "ඔව්", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "ඔබ", - "@you": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "ඔබට හිමි පරිශීලකනාමය", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "විශාලනය", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "කුඩාලනය", - "@zoomOut": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_sk.arb b/assets/l10n/intl_sk.arb index 51421c228b..4712b9b693 100644 --- a/assets/l10n/intl_sk.arb +++ b/assets/l10n/intl_sk.arb @@ -1,1792 +1,2117 @@ { - "@@locale": "sk", - "@@last_modified": "2021-08-14 12:41:09.879987", - "about": "O aplikácii", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Prijať", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} prijali pozvánku", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Účet", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informácie o účte", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktivovali koncové šifrovanie", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Pridať popis skupiny", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administrátor", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Máte už účet?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "Ktokoľvek sa môže pripojiť", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Archivovať", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archivovaná miestnosť", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Môžu sa pripojiť hostia", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ste si istí?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Prosím zadajte vašu prístupovu frázu k \"bezpečému úložisku\" alebo \"kľúč na obnovu\" pre uloženie kľúčov.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\".", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Prosím zadajte vašu prístupovú frázu k \"bezpečnému úložisku\" alebo \"kľúč na obnovu\" pre overenie vašej relácie.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Akcepovať žiadosť o verifikáciu od {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autentifikácia", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar bol zmenený", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Zabanovať z chatu", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Zabanovaný", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} zabanoval {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Zakázať zariadenie", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Klúče sa úspešne uložili", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Zrušiť", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} si zmenili svôj avatar", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} zmenili popis chatu na: „{description}“", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} zmenili meno chatu na: „{chatname}“", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} zmenili nastavenie oprávnení chatu", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} si zmenili prezývku na: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} zmenili prístupové práva pre hosťov", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} zmenili prístupové práva pro hosťov na: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} zmenili nastavenie viditelnosti histórie chatu", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} zmenili nastavenie viditelnosti histórie chatu na: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} zmenili nastavenie pravidiel pripojenia", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} zmenili nastavenie pravidiel pripojenia na: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} si zmenili profilový obrázok", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} zmenili nastavenie aliasov chatu", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} zmenili odkaz k pozvánke do miestnosti", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "História zmien", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Zmeniť použitý server", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Zmena štýlu", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Zmeniť názov skupiny", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Zmeniť server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Zmeniť pozadie", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Šifrovanie bolo poškodené", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Podrobnosti o chate", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Vyberte si silné heslo", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Vyberte si užívateľské meno", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Zavrieť", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Potvrdiť", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Pripojiť", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Pokus o pripojenie zlyhal", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt bol pozvaný do skupiny", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Prehliadač obsahu", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Skopírované do schránky", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopírovať", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nebolo možné dešifrovať správu: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Nepodarilo sa nastaviť avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nepodarilo sa nastaviť prezývku užívateľa", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} účastníkov", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Vytvoriť", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Vytvoriť účet teraz", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} založili chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Vytvoriť novú skupinu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Vzájomné overenie je vypnuté", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Vzájomné overenie je zapnuté", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Momentálne prítomní", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tmavá", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "delete": "Odstrániť", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Odstrániť správu", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Zamietnuť", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Zariadenie", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "Zariadenia", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Zahodiť obrázok", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Prezývka bola zmenená", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Prispejte", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Stiahnuť súbor", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Zmeniť prezývku", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Nastavenie inštancie Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotikon už existuje!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Nesprávné označenie emotikonu!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Nastavenie emotikonov", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Kód emotikonu", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Musíte zvoliť kód emotikonu a obrázok!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Prázdny chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Šifrovanie už nebude možné vypnúť. Ste si tým istí?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "Šifrovanie", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Šifrovací algoritmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Šifrovanie nie je aktívne", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Nastavenie koncového šifrovania", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Zadajte názov skupiny", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Zadajte uživateľské meno", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Zadajte svoj homeserver", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "Názov súboru", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Veľkosť súboru", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Preposlať", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Piatok", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Od pripojenia", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Od pozvania", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Skupina", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Popis skupiny", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Popis skupiny bol zmenený", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Skupina je verejná", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Skupina s {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Hostia sú zakázaní", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Hostia sa môžu pripojiť", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} vzal späť pozvánku pre {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Pomoc", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver nie je kompatibilný", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identita", - "@identity": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Nesprávna prístupová fráza alebo kľúč na obnovenie", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Pozvať kontakt", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Pozvať kontakt do {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Pozvanie", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} pozvali {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Len pozvaní používatelia", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Je nasledujúci kód zariadenia správny?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "píše…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} sa pripojili do chatu", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "keysCached": "Kľúče sú uložené", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Kľúče chýbaju", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} vyhodili {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} vyhodili a zabanovali {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Vyhodiť z chatu", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Naposledy prítomní: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Naposledy zaznamenaná IP adresa", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Videný veľmi dávno", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Opustiť", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Opustili chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licencia", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Svetlá", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Načítať ďalších {count} účastníkov", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Načítava sa… Čakajte prosím.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Načítať viac…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Prihlásiť sa", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Prihlásenie k {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Odhlásiť sa", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Pridať práva moderátora", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Pridať práva administrátora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Skontrolujte, či je identifikátor platný", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Správa bude odstránená pre všetkých účastníkov", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderátor", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Pondelok", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Stlmiť chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Prosím berte na vedomie, že na koncové šifrovanie zatiaľ potrebujete Pantalaimon.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nová správa v FluffyChate", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nová žiadosť o verifikáciu!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat v súčasnosti nepodporuje povolenie krížového podpisu. Prosím, povoľte ho z Riot.im.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nenašli sa žiadne emotikony. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Fluffychat v súčasnosti nepodporuje povolenie online zálohu klúčov. Prosím, povoľte ho z Riot.im.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Žiadne", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Chýba povolenie", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nenašli sa žiadne miestnosti…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nepodporované vo webovej verzii", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} označených správ", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "ok": "ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online záloha kľúčov je vypnutá", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online záloha kľúčov je zapnutá", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Och! Niečo sa pokazilo…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Na prečítanie správy otvorte aplikáciu", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Otvoriť fotoaparát", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Voliteľné) Názov skupiny", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Zúčastnené užívateľské zariadenia", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "prístupová fráza alebo kľúč na obnovenie", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Heslo", - "@password": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Vybrať obrázok", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "play": "Prehrať (fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Vyberte si používateľské meno", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Vyberte si matrix identifkátor.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Prosím zadajte svoje heslo", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Zadajte svoje používateľské meno", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Verejné miestnosti", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "Nahrávam", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} odstránili udalosť", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Odmietnuť", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} odmietli pozvánku", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Vrátiť sa", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Odstrániť", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Odstráňiť všetky ostatné zariadenia", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Odstánené užívateľom {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Odstráňiť zariadenie", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Odblokovať", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Odstrániť správu", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Zobraziť formátovaný obsah", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Odpovedať", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Vyžiadať si povolenie", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Žiadosť o prečítanie starších správ", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Zrušiť všetky povolenia", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Miestnosť bola upgradeovaná", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sobota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Vyhladať v chate", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Videné užívateľom {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Videné užívateľom {username} a {count} dalšími}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Videné užívateľmi {username} a {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Odoslať", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Odoslať správu", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Odoslať súbor", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Odoslať obrázok", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} poslali súbor", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} poslali zvukovú nahrávku", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} poslali obrázok", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} poslali nálepku", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} poslali video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sessionVerified": "Relácia je overená", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Nastaviť profilový obrázok", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Nastaviť popis skupiny", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Nastaviť odkaz pre pozvánku", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Nastaviť status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Nastavenia", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Zdieľať", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} zdieľa lokáciu", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Zaregistrovať sa", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Preskočiť", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Zdrojový kód", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Začnite svoj prvý chat hneď teraz! 🙂\n - Kliknite na tlačítko správy\n- Zabávajte sa chatovaním", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Ako sa dnes máte?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Odoslať", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Nedeľa", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Systémová farba", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Ťuknutím zobrazíte menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Sa nezhodujú", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Zhodujú sa", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Táto miestnosť bola archivovaná.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Štvrtok", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Skúsiť znova odoslať", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Utorok", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} odbanovali {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Odblokovať zariadenie", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Neznáme zariadenie", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Neznámy šifrovací algoritmus", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Neznáma udalosť „{type}“", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Neznáma relácia, prosím verifikujte ju", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Zrušiť stlmenie chatu", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} neprečítaných chatov}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} neprečítaných správ}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Použiť AMOLED kompatibilné farby?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} a {count} dalších píšu…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} a {username2} píšu…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} píše…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} opustili chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Užívateľské meno", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} poslali udalosť {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Úspešne overenie relácie!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Overiť", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifikovať manuálne", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Spustiť verifikáciu", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Verifikácia bola úspešná!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verifikujem protiľahlý účet", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifikovať používateľa", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videohovor", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Viditeľnosť histórie chatu", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Viditeľné pre všetkých účastníkov", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Viditeľné pre každého", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Hlasová správa", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Čaká sa, kým partner prijme požiadavku…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Čaká sa, kým partner prijme emotikon…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Čaká sa na to, kým partner prijme čísla…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Pozadie", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Konečné šifrovanie je momentálne v Beta verzii! Používajte na vlastné riziko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Streda", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Vítajte v najroztomilejšom instant messengeri v sieti matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kto môže vstúpiť do tejto skupiny", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Napísať správu…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Áno", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Vy", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Ste pozvaní do tohto chatu", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Už sa nezúčastňujete tohto chatu", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Nemôžete pozvať samých seba", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Máte zablokovaný prístup k tomuto chatu", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Vaša vlastná prezývka", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Budete pripojený na {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "publicGroups": "Verejné Skupiny", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "people": "Ľudia", - "@people": { - "type": "text", - "placeholders": {} - }, - "chats": "Čety", - "@chats": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Zmeniť heslo", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Zmeniť názov zariadenia", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Domovský server podporuje verzie špecifikácie:\n{serverVersions}\nAle táto aplikácie podporuje iba {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "answeredTheCall": "{senderName} prevzal hovor", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sendAudio": "Poslať zvuk", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterValidEmail": "Prosím zadajte správnu emailovú adresu.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Heslá niesú zhodné!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "Prosím zvoľte si aspoň {min} znakov.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "addEmail": "Pridať email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Pridať nového priateľa", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "appLock": "Uzamknutie aplikácie", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "security": "Bezpečnosť", - "@security": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Nahlásiť správu", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Poslať nálepku", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Zastaviť", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Bezpečnostný kľúč", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Verzia miestnosti", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Poslať správy", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Pripojiť sa k miestnosti", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Neplatný email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Nastaviť úroveň oprávnení", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "Nastaviť zálohy chatov", - "@setupChatBackup": {}, - "badServerLoginTypesException": "Server podporuje tieto typy prihlásenia:\n{serverVersions}\nAle táto aplikácia podporuje iba:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "changesHaveBeenSaved": "Zmeny boli uložené", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Záloha chatov", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Pridať do priestoru", - "@addToSpace": {}, - "cantOpenUri": "Nemožno otvoriť identifikátor prostriedku {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "yourChatBackupHasBeenSetUp": "Záloha vašich chatov bola nastavená.", - "@yourChatBackupHasBeenSetUp": {}, - "clearText": "Vymazať text", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "repeatPassword": "Zopakujte heslo", - "@repeatPassword": {}, - "all": "Všetky", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Všetky chaty", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Ste si istí, že sa chcete odhlásiť?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Spustiť", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Odoslať pri vstupe", - "@sendOnEnter": {}, - "yourUserId": "Vaše užívateľské ID:", - "@yourUserId": {}, - "ignoredUsers": "Ignorovaní užívatelia", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorovať", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "search": "Hľadať", - "@search": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Poslať ako text", - "@sendAsText": { - "type": "text" - }, - "sendOriginal": "Poslať originál", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Poslať video", - "@sendVideo": { - "type": "text", - "placeholders": {} - } -} + "@@locale": "sk", + "@@last_modified": "2021-08-14 12:41:09.879987", + "about": "O aplikácii", + "@about": { + "type": "text", + "placeholders": {} + }, + "accept": "Prijať", + "@accept": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} prijali pozvánku", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "account": "Účet", + "@account": { + "type": "text", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} aktivovali koncové šifrovanie", + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "admin": "Administrátor", + "@admin": { + "type": "text", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "text", + "placeholders": {} + }, + "anyoneCanJoin": "Ktokoľvek sa môže pripojiť", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "archive": "Archivovať", + "@archive": { + "type": "text", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Môžu sa pripojiť hostia", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "areYouSure": "Ste si istí?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "askSSSSSign": "Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\".", + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "askVerificationRequest": "Akcepovať žiadosť o verifikáciu od {username}?", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "banFromChat": "Zabanovať z chatu", + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "banned": "Zabanovaný", + "@banned": { + "type": "text", + "placeholders": {} + }, + "bannedUser": "{username} zabanoval {targetName}", + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "blockDevice": "Zakázať zariadenie", + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "cancel": "Zrušiť", + "@cancel": { + "type": "text", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} si zmenili svôj avatar", + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheChatDescriptionTo": "{username} zmenili popis chatu na: „{description}“", + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "changedTheChatNameTo": "{username} zmenili meno chatu na: „{chatname}“", + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "changedTheChatPermissions": "{username} zmenili nastavenie oprávnení chatu", + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheDisplaynameTo": "{username} si zmenili prezývku na: {displayname}", + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "changedTheGuestAccessRules": "{username} zmenili prístupové práva pre hosťov", + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheGuestAccessRulesTo": "{username} zmenili prístupové práva pro hosťov na: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheHistoryVisibility": "{username} zmenili nastavenie viditelnosti histórie chatu", + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheHistoryVisibilityTo": "{username} zmenili nastavenie viditelnosti histórie chatu na: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "changedTheJoinRules": "{username} zmenili nastavenie pravidiel pripojenia", + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheJoinRulesTo": "{username} zmenili nastavenie pravidiel pripojenia na: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "changedTheProfileAvatar": "{username} si zmenili profilový obrázok", + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheRoomAliases": "{username} zmenili nastavenie aliasov chatu", + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changedTheRoomInvitationLink": "{username} zmenili odkaz k pozvánke do miestnosti", + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "changeTheHomeserver": "Zmeniť použitý server", + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "changeTheme": "Zmena štýlu", + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Zmeniť názov skupiny", + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrovanie bolo poškodené", + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "Podrobnosti o chate", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "chooseAStrongPassword": "Vyberte si silné heslo", + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "close": "Zavrieť", + "@close": { + "type": "text", + "placeholders": {} + }, + "compareEmojiMatch": "Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:", + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "compareNumbersMatch": "Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:", + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "confirm": "Potvrdiť", + "@confirm": { + "type": "text", + "placeholders": {} + }, + "connect": "Pripojiť", + "@connect": { + "type": "text", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt bol pozvaný do skupiny", + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "copiedToClipboard": "Skopírované do schránky", + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "copy": "Kopírovať", + "@copy": { + "type": "text", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nebolo možné dešifrovať správu: {error}", + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "countParticipants": "{count} účastníkov", + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "create": "Vytvoriť", + "@create": { + "type": "text", + "placeholders": {} + }, + "createdTheChat": "{username} založili chat", + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "currentlyActive": "Momentálne prítomní", + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "darkTheme": "Tmavá", + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "delete": "Odstrániť", + "@delete": { + "type": "text", + "placeholders": {} + }, + "deleteMessage": "Odstrániť správu", + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "device": "Zariadenie", + "@device": { + "type": "text", + "placeholders": {} + }, + "devices": "Zariadenia", + "@devices": { + "type": "text", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prezývka bola zmenená", + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "downloadFile": "Stiahnuť súbor", + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "editDisplayname": "Zmeniť prezývku", + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "emoteExists": "Emotikon už existuje!", + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "emoteInvalid": "Nesprávné označenie emotikonu!", + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "emoteSettings": "Nastavenie emotikonov", + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "emoteShortcode": "Kód emotikonu", + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Musíte zvoliť kód emotikonu a obrázok!", + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "emptyChat": "Prázdny chat", + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifrovanie už nebude možné vypnúť. Ste si tým istí?", + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "encryption": "Šifrovanie", + "@encryption": { + "type": "text", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifrovanie nie je aktívne", + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "enterYourHomeserver": "Zadajte svoj homeserver", + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "fileName": "Názov súboru", + "@fileName": { + "type": "text", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "forward": "Preposlať", + "@forward": { + "type": "text", + "placeholders": {} + }, + "fromJoining": "Od pripojenia", + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "fromTheInvitation": "Od pozvania", + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "group": "Skupina", + "@group": { + "type": "text", + "placeholders": {} + }, + "groupIsPublic": "Skupina je verejná", + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "groupWith": "Skupina s {displayname}", + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "guestsAreForbidden": "Hostia sú zakázaní", + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "guestsCanJoin": "Hostia sa môžu pripojiť", + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} vzal späť pozvánku pre {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "help": "Pomoc", + "@help": { + "type": "text", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "text", + "placeholders": {} + }, + "identity": "Identita", + "@identity": { + "type": "text", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nesprávna prístupová fráza alebo kľúč na obnovenie", + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "inviteContact": "Pozvať kontakt", + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroup": "Pozvať kontakt do {groupName}", + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "invited": "Pozvanie", + "@invited": { + "type": "text", + "placeholders": {} + }, + "invitedUser": "{username} pozvali {targetName}", + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "invitedUsersOnly": "Len pozvaní používatelia", + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: {link}", + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "isTyping": "píše…", + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "joinedTheChat": "{username} sa pripojili do chatu", + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "kicked": "{username} vyhodili {targetName}", + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "kickedAndBanned": "{username} vyhodili a zabanovali {targetName}", + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "kickFromChat": "Vyhodiť z chatu", + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "lastActiveAgo": "Naposledy prítomní: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "leave": "Opustiť", + "@leave": { + "type": "text", + "placeholders": {} + }, + "leftTheChat": "Opustili chat", + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "license": "Licencia", + "@license": { + "type": "text", + "placeholders": {} + }, + "lightTheme": "Svetlá", + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "loadCountMoreParticipants": "Načítať ďalších {count} účastníkov", + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "loadingPleaseWait": "Načítava sa… Čakajte prosím.", + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "loadMore": "Načítať viac…", + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "login": "Prihlásiť sa", + "@login": { + "type": "text", + "placeholders": {} + }, + "logInTo": "Prihlásenie k {homeserver}", + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "logout": "Odhlásiť sa", + "@logout": { + "type": "text", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "text", + "placeholders": {} + }, + "muteChat": "Stlmiť chat", + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "needPantalaimonWarning": "Prosím berte na vedomie, že na koncové šifrovanie zatiaľ potrebujete Pantalaimon.", + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nová správa v FluffyChate", + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "newVerificationRequest": "Nová žiadosť o verifikáciu!", + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "noEmotesFound": "Nenašli sa žiadne emotikony. 😕", + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "noGoogleServicesWarning": "Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/.", + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "none": "Žiadne", + "@none": { + "type": "text", + "placeholders": {} + }, + "noPermission": "Chýba povolenie", + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "noRoomsFound": "Nenašli sa žiadne miestnosti…", + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "text", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online záloha kľúčov je zapnutá", + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Och! Niečo sa pokazilo…", + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "openAppToReadMessages": "Na prečítanie správy otvorte aplikáciu", + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "openCamera": "Otvoriť fotoaparát", + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "passphraseOrKey": "prístupová fráza alebo kľúč na obnovenie", + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "password": "Heslo", + "@password": { + "type": "text", + "placeholders": {} + }, + "pickImage": "Vybrať obrázok", + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "play": "Prehrať {fileName}", + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "pleaseEnterYourPassword": "Prosím zadajte svoje heslo", + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Zadajte svoje používateľské meno", + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "publicRooms": "Verejné miestnosti", + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "recording": "Nahrávam", + "@recording": { + "type": "text", + "placeholders": {} + }, + "redactedAnEvent": "{username} odstránili udalosť", + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "reject": "Odmietnuť", + "@reject": { + "type": "text", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} odmietli pozvánku", + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "rejoin": "Vrátiť sa", + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "remove": "Odstrániť", + "@remove": { + "type": "text", + "placeholders": {} + }, + "removeAllOtherDevices": "Odstráňiť všetky ostatné zariadenia", + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "removedBy": "Odstánené užívateľom {username}", + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "removeDevice": "Odstráňiť zariadenie", + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "unbanFromChat": "Odblokovať", + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "renderRichContent": "Zobraziť formátovaný obsah", + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "reply": "Odpovedať", + "@reply": { + "type": "text", + "placeholders": {} + }, + "requestPermission": "Vyžiadať si povolenie", + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Miestnosť bola upgradeovaná", + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "seenByUser": "Videné užívateľom {username}", + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "send": "Odoslať", + "@send": { + "type": "text", + "placeholders": {} + }, + "sendAMessage": "Odoslať správu", + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "sendFile": "Odoslať súbor", + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "sendImage": "Odoslať obrázok", + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "sentAFile": "{username} poslali súbor", + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAnAudio": "{username} poslali zvukovú nahrávku", + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAPicture": "{username} poslali obrázok", + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentASticker": "{username} poslali nálepku", + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "sentAVideo": "{username} poslali video", + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "setInvitationLink": "Nastaviť odkaz pre pozvánku", + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "setStatus": "Nastaviť status", + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "settings": "Nastavenia", + "@settings": { + "type": "text", + "placeholders": {} + }, + "share": "Zdieľať", + "@share": { + "type": "text", + "placeholders": {} + }, + "sharedTheLocation": "{username} zdieľa lokáciu", + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "skip": "Preskočiť", + "@skip": { + "type": "text", + "placeholders": {} + }, + "sourceCode": "Zdrojový kód", + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "statusExampleMessage": "Ako sa dnes máte?", + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "submit": "Odoslať", + "@submit": { + "type": "text", + "placeholders": {} + }, + "systemTheme": "Systémová farba", + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "theyDontMatch": "Sa nezhodujú", + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "theyMatch": "Zhodujú sa", + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "tryToSendAgain": "Skúsiť znova odoslať", + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "unbannedUser": "{username} odbanovali {targetName}", + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "unblockDevice": "Odblokovať zariadenie", + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "unknownDevice": "Neznáme zariadenie", + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Neznámy šifrovací algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "unknownEvent": "Neznáma udalosť „{type}“", + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "unmuteChat": "Zrušiť stlmenie chatu", + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} neprečítaných chatov}}", + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "userAndOthersAreTyping": "{username} a {count} dalších píšu…", + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "userAndUserAreTyping": "{username} a {username2} píšu…", + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "userIsTyping": "{username} píše…", + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "userLeftTheChat": "{username} opustili chat", + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "username": "Užívateľské meno", + "@username": { + "type": "text", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} poslali udalosť {type}", + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "verify": "Overiť", + "@verify": { + "type": "text", + "placeholders": {} + }, + "verifyStart": "Spustiť verifikáciu", + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "verifySuccess": "Verifikácia bola úspešná!", + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "verifyTitle": "Verifikujem protiľahlý účet", + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "videoCall": "Videohovor", + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Viditeľnosť histórie chatu", + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "visibleForAllParticipants": "Viditeľné pre všetkých účastníkov", + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "visibleForEveryone": "Viditeľné pre každého", + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "voiceMessage": "Hlasová správa", + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čaká sa, kým partner prijme požiadavku…", + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čaká sa, kým partner prijme emotikon…", + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čaká sa na to, kým partner prijme čísla…", + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "wallpaper": "Pozadie", + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kto môže vstúpiť do tejto skupiny", + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "writeAMessage": "Napísať správu…", + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "yes": "Áno", + "@yes": { + "type": "text", + "placeholders": {} + }, + "you": "Vy", + "@you": { + "type": "text", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Už sa nezúčastňujete tohto chatu", + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Máte zablokovaný prístup k tomuto chatu", + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "people": "Ľudia", + "@people": { + "type": "text", + "placeholders": {} + }, + "chats": "Čety", + "@chats": { + "type": "text", + "placeholders": {} + }, + "changePassword": "Zmeniť heslo", + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "changeDeviceName": "Zmeniť názov zariadenia", + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "badServerVersionsException": "Domovský server podporuje verzie špecifikácie:\n{serverVersions}\nAle táto aplikácie podporuje iba {supportedVersions}", + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "answeredTheCall": "{senderName} prevzal hovor", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "sendAudio": "Poslať zvuk", + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "addEmail": "Pridať email", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "appLock": "Uzamknutie aplikácie", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "security": "Bezpečnosť", + "@security": { + "type": "text", + "placeholders": {} + }, + "reportMessage": "Nahlásiť správu", + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "sendSticker": "Poslať nálepku", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "roomVersion": "Verzia miestnosti", + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "sendMessages": "Poslať správy", + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "joinRoom": "Pripojiť sa k miestnosti", + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "setPermissionsLevel": "Nastaviť úroveň oprávnení", + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "Server podporuje tieto typy prihlásenia:\n{serverVersions}\nAle táto aplikácia podporuje iba:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "chatBackup": "Záloha chatov", + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "addToSpace": "Pridať do priestoru", + "@addToSpace": {}, + "cantOpenUri": "Nemožno otvoriť identifikátor prostriedku {uri}", + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "yourChatBackupHasBeenSetUp": "Záloha vašich chatov bola nastavená.", + "@yourChatBackupHasBeenSetUp": {}, + "repeatPassword": "Zopakujte heslo", + "@repeatPassword": {}, + "all": "Všetky", + "@all": { + "type": "text", + "placeholders": {} + }, + "allChats": "Všetky chaty", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ste si istí, že sa chcete odhlásiť?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "sendOnEnter": "Odoslať pri vstupe", + "@sendOnEnter": {}, + "ignoredUsers": "Ignorovaní užívatelia", + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "ignore": "Ignorovať", + "@ignore": { + "type": "text", + "placeholders": {} + }, + "search": "Hľadať", + "@search": { + "type": "text", + "placeholders": {} + }, + "sendAsText": "Poslať ako text", + "@sendAsText": { + "type": "text" + }, + "sendOriginal": "Poslať originál", + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "sendVideo": "Poslať video", + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "importNow": "Importovať teraz", + "@importNow": {}, + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@widgetVideo": {}, + "@dismiss": {}, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@addAccount": {}, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@user": {}, + "@youAcceptedTheInvitation": {}, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@banUserDescription": {}, + "@widgetEtherpad": {}, + "@removeDevicesDescription": {}, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@unbanUserDescription": {}, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@saveKeyManuallyDescription": {}, + "@editBundlesForAccount": {}, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@setChatDescription": {}, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@noOtherDevicesFound": {}, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCallsBetaWarning": {}, + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@verified": { + "type": "text", + "placeholders": {} + }, + "@callingPermissions": {}, + "@readUpToHere": {}, + "@start": {}, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@optionalRedactReason": {}, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@notifications": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@experimentalVideoCalls": {}, + "@pleaseEnterRecoveryKeyDescription": {}, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@appearOnTopDetails": {}, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@reportUser": {}, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@confirmEventUnpin": {}, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@addChatDescription": {}, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@scanQrCode": {}, + "@pleaseEnterANumber": {}, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@messages": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@youJoinedTheChat": {}, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@widgetName": {}, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "text", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@pin": { + "type": "text", + "placeholders": {} + }, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@invite": {}, + "@enableMultiAccounts": {}, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@unsupportedAndroidVersionLong": {}, + "@storeSecurlyOnThisDevice": {}, + "@screenSharingDetail": {}, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@extremeOffensive": { + "type": "text", + "placeholders": {} + } +} \ No newline at end of file diff --git a/assets/l10n/intl_sl.arb b/assets/l10n/intl_sl.arb index d24d008b21..b55d8dc7d2 100644 --- a/assets/l10n/intl_sl.arb +++ b/assets/l10n/intl_sl.arb @@ -1,8 +1,4 @@ { - "passwordsDoNotMatch": "Geslo se ne ujema!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Vnesite veljaven elektronski naslov.", - "@pleaseEnterValidEmail": {}, "repeatPassword": "Ponovite geslo", "@repeatPassword": {}, "about": "O aplikaciji", @@ -20,11 +16,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Podatki o računu", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "Uporabnik {username} je aktiviral šifriranje od konca do konca", "@activatedEndToEndEncryption": { "type": "text", @@ -37,16 +28,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Dodajte opis skupine", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Dodaj novega prijatelja", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Dodajte v prostor", "@addToSpace": {}, "alias": "vzdevek", @@ -64,11 +45,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Že imate račun?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "Oseba {senderName} je odgovorila na klic", "@answeredTheCall": { "type": "text", @@ -86,21 +62,11 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arhivirana soba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Če želite podpisati drugo osebo, vnesite geslo za varno trgovino ali obnovitveni ključ.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Vnesite geslo za varno hrambo ali ključ za obnovitev, da preverite svojo sejo.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Ali želite sprejeti to zahtevo za preverjanje od {username}?", "@askVerificationRequest": { "type": "text", @@ -108,31 +74,11 @@ "username": {} } }, - "audioPlayerPause": "Pavza", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Predvajaj", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Preverjanje pristnosti", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Samodejno predvajajte animirane nalepke in čustva", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar spremenjen", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Domači strežnik podpira vrste prijave:\n{serverVersions}\nToda ta aplikacija podpira samo:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -176,11 +122,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Ključi so shranjeni", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Prekliči", "@cancel": { "type": "text", @@ -274,21 +215,11 @@ "username": {} } }, - "changelog": "Dnevnik sprememb", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Spremeni geslo", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Spremembe so shranjene", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Spremenite domači strežnik", "@changeTheHomeserver": { "type": "text", @@ -304,11 +235,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Spremenite strežnik", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Spremenite svoj avatar", "@changeYourAvatar": { "type": "text", @@ -319,12 +245,6 @@ "type": "text", "placeholders": {} }, - "yourUserId": "Vaš ID uporabnika:", - "@yourUserId": {}, - "setupChatBackup": "Nastavite varnostno kopiranje klepeta", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Zapisal sem ključ", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Varnostna kopija klepeta je nastavljena.", "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "Varnostno kopiranje klepeta", @@ -339,11 +259,6 @@ }, "chatHasBeenAddedToThisSpace": "Klepet je bil dodan v ta prostor", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Klepet je bil odstranjen iz tega prostora", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "Klepeti", "@chats": { "type": "text", @@ -354,18 +269,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Izberi uporabniško ime", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Počisti arhiv", "@clearArchive": {}, - "clearText": "Počisti besedilo", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Zapri", "@close": { "type": "text", @@ -458,11 +363,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Poskus povezave ni uspel", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "containsDisplayName": "Vsebuje prikazno ime", "@containsDisplayName": { "type": "text", @@ -473,18 +373,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Pregledovalnik vsebine", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAtLeastChars": "Izberite najmanj {min} znakov.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "archive": "Arhiv", "@archive": { "type": "text", @@ -546,11 +434,6 @@ "type": "text", "placeholders": {} }, - "changeWallpaper": "Spremeni ozadje", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changedTheHistoryVisibility": "{username} je spremenila vidnost zgodovine", "@changedTheHistoryVisibility": { "type": "text", @@ -563,8 +446,6 @@ "type": "text", "placeholders": {} }, - "setupChatBackupDescription": "Za zaščito vaših sporočil smo za vas ustvarili varnostni ključ.\nProsimo, da to shranite na varnem mestu, na primer v upravitelju gesel.", - "@setupChatBackupDescription": {}, "contentHasBeenReported": "Vsebina je bila prijavljena skrbnikom strežnika", "@contentHasBeenReported": { "type": "text", @@ -622,16 +503,6 @@ "error": {} } }, - "couldNotSetAvatar": "Avatarja ni bilo mogoče nastaviti", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Prikaznega imena ni bilo mogoče nastaviti", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} udeležencev", "@countParticipants": { "type": "text", @@ -644,31 +515,11 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Ustvarite račun zdaj", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "Ustvari novo skupino", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Nov prostor", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningEnabled": "Navzkrižno podpisovanje DA", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Navzkrižno podpisovanje NE", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Trenutno aktiven", "@currentlyActive": { "type": "text", diff --git a/assets/l10n/intl_sr.arb b/assets/l10n/intl_sr.arb index eab3d6944e..afebfa2dbe 100644 --- a/assets/l10n/intl_sr.arb +++ b/assets/l10n/intl_sr.arb @@ -22,11 +22,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Подаци о налогу", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} укључи шифровање с краја на крај", "@activatedEndToEndEncryption": { "type": "text", @@ -39,16 +34,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Додај опис групе", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Додај новог пријатеља", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "Админ", "@admin": { "type": "text", @@ -64,11 +49,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Већ имате налог?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} одговори на позив", "@answeredTheCall": { "type": "text", @@ -91,11 +71,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Архивирана соба", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Да ли је гостима дозвољен приступ", "@areGuestsAllowedToJoin": { "type": "text", @@ -111,21 +86,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Унесите своју безбедносну фразу или кључ за опоравак да кеширате кључеве.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Да бисте могли да пријавите другу особу, унесите своју безбедносну фразу или кључ опоравка.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Унесите своју безбедносну фразу или кључ за опоравак да бисте верификовали сесију.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Прихватате ли захтев за верификацију од корисника {username}?", "@askVerificationRequest": { "type": "text", @@ -133,26 +98,6 @@ "username": {} } }, - "audioPlayerPause": "Пауза", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Пуштање", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Аутентификација", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Аватар измењен", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Домаћи сервер подржава начине пријаве:\n{serverVersions}\nали ова апликација подржава само:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -202,11 +147,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Кључеви кеширани", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Откажи", "@cancel": { "type": "text", @@ -321,21 +261,11 @@ "username": {} } }, - "changelog": "Дневник измена", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Измени лозинку", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Измене су сачуване", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Промени домаћи сервер", "@changeTheHomeserver": { "type": "text", @@ -351,16 +281,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Промени сервер", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Измени тапет", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Измените свој аватар", "@changeYourAvatar": { "type": "text", @@ -401,18 +321,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Изаберите корисничко име", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Очисти архиву", "@clearArchive": {}, - "clearText": "Обриши текст", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Затвори", "@close": { "type": "text", @@ -508,11 +418,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Неуспео покушај повезивања", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Особа је позвана у групу", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -533,11 +438,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Прегледач садржаја", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Копирано у клипборд", "@copiedToClipboard": { "type": "text", @@ -560,16 +460,6 @@ "error": {} } }, - "couldNotSetAvatar": "Не могу да поставим аватар", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Не могу да поставим име за приказ", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "учесника: {count}", "@countParticipants": { "type": "text", @@ -582,11 +472,6 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Направи налог сада", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} направи ћаскање", "@createdTheChat": { "type": "text", @@ -594,21 +479,6 @@ "username": {} } }, - "createNewGroup": "Направи нову групу", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Међу-потписивање искључено", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Међу-потписивање укључено", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Тренутно активно", "@currentlyActive": { "type": "text", @@ -669,11 +539,6 @@ "type": "text", "placeholders": {} }, - "deny": "Одбиј", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Уређај", "@device": { "type": "text", @@ -689,41 +554,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Шифровање је безбедно само када су сви уређаји оверени.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Директна ћаскања", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Одбаци слику", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Истражи", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Истражи групе", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Име за приказ је измењено", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Донација", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Преузми фајл", "@downloadFile": { "type": "text", @@ -739,21 +579,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Уредите дозволе ћаскања", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Уреди име за приказ", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Уреди Џитси инстанцу", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Уреди алијасе собе", "@editRoomAliases": { "type": "text", @@ -824,21 +654,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Алгоритам шифровања", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Шифровање није укључено", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Поставке шифровања с краја на крај", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} заврши позив", "@endedTheCall": { "type": "text", @@ -846,21 +666,11 @@ "senderName": {} } }, - "enterAGroupName": "унесите назив групе", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Унесите адресу е-поште", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Унесите корисничко име", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Унесите свој домаћи сервер", "@enterYourHomeserver": { "type": "text", @@ -881,11 +691,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Величина фајла", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -901,16 +706,6 @@ "type": "text", "placeholders": {} }, - "friday": "петак", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Пријатељи", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "од приступања", "@fromJoining": { "type": "text", @@ -931,16 +726,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Опис групе", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Опис групе измењен", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Група је јавна", "@groupIsPublic": { "type": "text", @@ -991,11 +776,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Сервер није компатибилан", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Колико је увредљив овај садржај?", "@howOffensiveIsThisContent": { "type": "text", @@ -1021,16 +801,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Можете игнорисати кориснике који вас нервирају. Нећете примати никакве поруке нити позивнице од корисника са ваше листе за игнорисање.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Игнориши корисника", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Кликнуо сам на везу", "@iHaveClickedOnLink": { "type": "text", @@ -1046,11 +816,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Лоша е-адреса", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Позивање особа", "@inviteContact": { "type": "text", @@ -1094,11 +859,6 @@ "link": {} } }, - "isDeviceKeyCorrect": "Да ли је кључ уређаја исправан?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "куца…", "@isTyping": { "type": "text", @@ -1116,16 +876,6 @@ "type": "text", "placeholders": {} }, - "keysCached": "Кључеви су кеширани", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Кључеви недостају", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, "kicked": "{username} избаци корисника {targetName}", "@kicked": { "type": "text", @@ -1154,16 +904,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Последњи ИП", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "одавно није на мрежи", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Напусти", "@leave": { "type": "text", @@ -1213,33 +953,11 @@ "homeserver": {} } }, - "loginWith": "{brand} за пријаву", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Одјава", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Направи модератора", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Направи админа", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Проверите да је идентификатор исправан", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Измене чланова", "@memberChanges": { "type": "text", @@ -1255,21 +973,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Поруке ће бити уклоњене за све учеснике", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Модератор", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "понедељак", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Ућуткај ћаскање", "@muteChat": { "type": "text", @@ -1310,16 +1018,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat тренутно не подржава међу-потписивање. Укључите га из апликације „Елемент“.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Нема описа", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Нема емотија. 😕", "@noEmotesFound": { "type": "text", @@ -1335,11 +1033,6 @@ "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Прављење резерве кључева на мрежи укључите из Елемента.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ништа", "@none": { "type": "text", @@ -1355,21 +1048,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Нисам нашао јавне собе…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Нисам нашао собе…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "За сад нема стања.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Обавештења", "@notifications": { "type": "text", @@ -1380,18 +1063,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Није подржано на вебу", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "изабрано {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} корисника куца…", "@numUsersTyping": { "type": "text", @@ -1419,11 +1090,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Резерва кључева на мрежи је искључена", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Резерва кључева на мрежи је укључена", "@onlineKeyBackupEnabled": { "type": "text", @@ -1449,16 +1115,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(необавезно) ваша е-адреса", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(опционо) назив групе", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "или", "@or": { "type": "text", @@ -1469,11 +1125,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Уређаји који учествују", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "фраза или кључ опоравка", "@passphraseOrKey": { "type": "text", @@ -1531,11 +1182,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Изаберите корисничко име", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Кликните на везу у примљеној е-пошти па наставите.", "@pleaseClickOnLink": { "type": "text", @@ -1546,16 +1192,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Унесите ИД са Матрикса.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Унесите свој сигурносни кључ:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Унесите своју лозинку", "@pleaseEnterYourPassword": { "type": "text", @@ -1581,16 +1217,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Јавне групе", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Јавни кључ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Јавне собе", "@publicRooms": { "type": "text", @@ -1672,11 +1298,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Уклони поруку", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Уклоните свој аватар", "@removeYourAvatar": { "type": "text", @@ -1707,16 +1328,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Затражи читање старијих порука", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Повуци све дозволе", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Соба је надограђена", "@roomHasBeenUpgraded": { "type": "text", @@ -1727,36 +1338,16 @@ "type": "text", "placeholders": {} }, - "saturday": "субота", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "Претражи", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "претражи ћаскања", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Безбедност", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "Сигурносни кључ", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Изгубљен сигурносни кључ?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "{username} прегледа", "@seenByUser": { "type": "text", @@ -1764,22 +1355,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{{username} прегледа и {count} осталих}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Прегледали {username} и {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Пошаљи", "@send": { "type": "text", @@ -1795,11 +1370,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Дозволи слање извештаја о грешци помоћу sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Пошаљи фајл", "@sendFile": { "type": "text", @@ -1867,21 +1437,6 @@ "senderName": {} } }, - "sentryInfo": "Информације о вашој приватности: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Сесија је верификована", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Постави слику профила", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Постави као главни алијас", "@setAsCanonicalAlias": { "type": "text", @@ -1892,11 +1447,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Постави опис групе", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Поставља везу позивнице", "@setInvitationLink": { "type": "text", @@ -1934,11 +1484,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Регистрација", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Јединствена пријава", "@singlesignon": { "type": "text", @@ -1949,11 +1494,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Звук, вибрација и ЛЕД боје", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Изворни код", "@sourceCode": { "type": "text", @@ -1966,11 +1506,6 @@ "senderName": {} } }, - "startYourFirstChat": "Покрените своје прво ћаскање! 🙂\n- Тапните на дугме поруке\n- Унесите корисничко име пријатеља\n- Уживајте у ћаскању", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Стање", "@status": { "type": "text", @@ -1986,26 +1521,11 @@ "type": "text", "placeholders": {} }, - "sunday": "недеља", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "системски", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Тапните уређај да оверите", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Тапните за мени", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Не поклапају се", "@theyDontMatch": { "type": "text", @@ -2016,26 +1536,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Ова соба је архивирана.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "четвртак", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2072,11 +1572,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "уторак", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Недоступно", "@unavailable": { "type": "text", @@ -2112,16 +1607,6 @@ "type": {} } }, - "unknownSessionVerify": "Непозната сесија. Верификујте је", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Откључај резерву ћаскања", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Врати обавештења", "@unmuteChat": { "type": "text", @@ -2139,18 +1624,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, other{непрочитаних порука: {unreadEvents}}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Користити боје за АМОЛЕД?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} и {count} корисника куцају…", "@userAndOthersAreTyping": { "type": "text", @@ -2186,11 +1659,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Корисник није оверен", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} посла {type} догађај", "@userSentUnknownEvent": { "type": "text", @@ -2199,36 +1667,16 @@ "type": {} } }, - "userUnknownVerification": "Стање овере није познато", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Корисник је оверен", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Оверен", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Успешно верификована сесија!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Верификуј", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Верификуј ручно", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Покрени верификацију", "@verifyStart": { "type": "text", @@ -2244,11 +1692,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Верификуј корисника", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Видео позив", "@videoCall": { "type": "text", @@ -2299,21 +1742,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Шифровање с краја на крај је тренутно у бета фази! Користите на сопствени ризик!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "среда", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Добродошли у најслађи брзи гласник на Матрикс мрежи.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Послали смо вам е-пошту", "@weSentYouAnEmail": { "type": "text", @@ -2359,51 +1787,19 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Позвани сте у ово ћаскање", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Више не учествујете у овом ћаскању", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Не можете позвати себе", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Забрањено вам је ово ћаскање", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Ваше корисничко име", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Ваш јавни кључ", "@yourPublicKey": { "type": "text", "placeholders": {} - }, - "youWillBeConnectedTo": "Бићете повезани на {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Увећај", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Умањи", - "@zoomOut": { - "type": "text", - "placeholders": {} } } diff --git a/assets/l10n/intl_sv.arb b/assets/l10n/intl_sv.arb index 0eed3660c7..c9b3f22328 100644 --- a/assets/l10n/intl_sv.arb +++ b/assets/l10n/intl_sv.arb @@ -10,7 +10,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} accepterade inbjudan", + "acceptedTheInvitation": "👍 {username} accepterade inbjudan", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -22,23 +22,13 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Information om kontot", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktiverade ändpunktskryptering", + "activatedEndToEndEncryption": "🔐 {username} aktiverade ändpunktskryptering", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "addGroupDescription": "Lägg till en gruppbeskrivning", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Admin", "@admin": { "type": "text", @@ -54,11 +44,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Har du redan ett konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} besvarade samtalet", "@answeredTheCall": { "type": "text", @@ -81,11 +66,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arkiverat Rum", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Får gästanvändare gå med", "@areGuestsAllowedToJoin": { "type": "text", @@ -101,21 +81,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Vänligen ange din lösenfras eller återställningsnyckel för säker lagring för att lagra nycklarna.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Vänligen ange din lösenfras eller återställningsnyckel för säker lagring för att verifiera din session.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Acceptera denna verifikationsförfrågan från {username}?", "@askVerificationRequest": { "type": "text", @@ -123,16 +93,6 @@ "username": {} } }, - "authentication": "Autentisering", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar har ändrats", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerVersionsException": "Hemservern stöjder Spec-versionen:\n{serverVersions}\nMen denna app stödjer enbart {supportedVersions}", "@badServerVersionsException": { "type": "text", @@ -169,11 +129,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Cachade nycklar", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Avbryt", "@cancel": { "type": "text", @@ -288,21 +243,11 @@ "username": {} } }, - "changelog": "Förändringslogg", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Ändra lösenord", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Ändringarna har blivit sparade", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Ändra hemserver", "@changeTheHomeserver": { "type": "text", @@ -318,16 +263,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Ändra server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Ändra bakgrund", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "Krypteringen har blivit korrupt", "@channelCorruptedDecryptError": { "type": "text", @@ -348,22 +283,17 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Välj ett användarnamn", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "close": "Stäng", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Jämför och se till att följande emoji matchar den andra enheten:", + "compareEmojiMatch": "Vänligen jämför uttryckssymbolerna", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Jämför och se till att följande nummer matchar den andra enheten:", + "compareNumbersMatch": "Vänligen jämför siffrorna", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -383,11 +313,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Anslutning misslyckades", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -408,11 +333,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "Innehållsvisare", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Kopierat till urklipp", "@copiedToClipboard": { "type": "text", @@ -430,16 +350,6 @@ "error": {} } }, - "couldNotSetAvatar": "Kunde ej sätta avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kunde ej sätta visningsnamn", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} deltagare", "@countParticipants": { "type": "text", @@ -452,33 +362,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Skapa konto nu", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} skapade chatten", + "createdTheChat": "💬 {username} skapade chatten", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Skapa ny grupp", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Korssignering av", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Korssignering på", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "För närvarande aktiv", "@currentlyActive": { "type": "text", @@ -539,11 +429,6 @@ "type": "text", "placeholders": {} }, - "deny": "Neka", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Enhet", "@device": { "type": "text", @@ -559,36 +444,16 @@ "type": "text", "placeholders": {} }, - "directChats": "Direkt Chatt", + "directChats": "Direkt chatt", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Ta bort bilden", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Utforska", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Utforska grupper", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Visningsnamn har ändrats", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Donera", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Ladda ner fil", "@downloadFile": { "type": "text", @@ -604,21 +469,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Ändra chatt-rättigheter", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Ändra visningsnamn", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Ändra Jitsi-instans", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "redigera rumsavatar", "@editRoomAvatar": { "type": "text", @@ -684,21 +539,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Krypteringsalgoritm", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Kryptering är ej aktiverad", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Inställningar för ändpunktskryptering", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} avslutade samtalet", "@endedTheCall": { "type": "text", @@ -706,21 +551,11 @@ "senderName": {} } }, - "enterAGroupName": "Ange ett gruppnamn", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Ange en e-postaddress", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "Ange ett användarnamn", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Ange din hemserver", "@enterYourHomeserver": { "type": "text", @@ -736,11 +571,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Filstorlek", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -751,11 +581,6 @@ "type": "text", "placeholders": {} }, - "friday": "Fredag", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Från att gå med", "@fromJoining": { "type": "text", @@ -771,16 +596,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Gruppbeskrivning", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Gruppbeskrivningen ändrad", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Gruppen är publik", "@groupIsPublic": { "type": "text", @@ -831,11 +646,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Hemservern är inte kompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Hur stötande är detta innehåll?", "@howOffensiveIsThisContent": { "type": "text", @@ -861,16 +671,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Du kan ignorera användare som stör dig. Du kommer inte att ha möjlighet att få några meddelanden eller rums-inbjudningar från användare på din personliga ignoreringslista.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorera användarnamn", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Jag har klickat på länken", "@iHaveClickedOnLink": { "type": "text", @@ -903,7 +703,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} bjöd in {targetName}", + "invitedUser": "📩 {username} bjöd in {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -921,7 +721,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} bjöd in dig till FluffyChat. \n1. Installera FluffyChat: https://fluffychat.im \n2. Registrera dig eller logga in \n3. Öppna inbjudningslänk: {link}", + "inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -929,17 +729,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Är föjande enhetsnyckel riktig?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "skriver…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} anslöt till chatten", + "joinedTheChat": "👋 {username} anslöt till chatten", "@joinedTheChat": { "type": "text", "placeholders": { @@ -951,17 +746,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Nycklarna är cachade", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Nyckarna saknas", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} sparkade {targetName}", + "kicked": "👞 {username} sparkade ut {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -969,7 +754,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} sparkade och bannade {targetName}", + "kickedAndBanned": "🙅 {username} sparkade och bannade {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -989,16 +774,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Senast visade IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Sågs för längesedan", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Lämna", "@leave": { "type": "text", @@ -1053,21 +828,6 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Skapa en moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Skapa en admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Se till att identifieraren är giltig", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Medlemsändringar", "@memberChanges": { "type": "text", @@ -1083,21 +843,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Meddelandet kommer tas bort för alla deltagare", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderator", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Måndag", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Tysta chatt", "@muteChat": { "type": "text", @@ -1113,7 +863,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Nya meddelanden i FluffyChat", + "newMessageInFluffyChat": "💬 Nya meddelanden i FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1138,31 +888,16 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat stödjer ej aktiverad korssignering för tillfället. Vänligen aktivera detta inifrån Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Ingen beskrivning", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Hittade inga dekaler. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få push notifikationer i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", + "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få aviseringar i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Vänligen slå på online-nyckelbackup inifrån Element istället.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Ingen", "@none": { "type": "text", @@ -1178,43 +913,21 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Hittade inga publika rum…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Hittade inga rum…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Inga statusar hittade än sålänge.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Aviseringar", "@notifications": { "type": "text", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notifikationer är påslaget för detta konto", + "notificationsEnabledForThisAccount": "Aviseringar är påslaget för detta konto", "@notificationsEnabledForThisAccount": { "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Stöds inte på webben", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} vald", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} användare skriver…", "@numUsersTyping": { "type": "text", @@ -1242,17 +955,12 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Online Nyckel-backup är inaktiverad", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Online Nyckel-backup är aktiverad", "@onlineKeyBackupEnabled": { "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "Oops, någonting gick fel…", + "oopsSomethingWentWrong": "Hoppsan, något gick fel…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1267,21 +975,11 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Optional) Gruppnamn", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "participant": "Deltagare", "@participant": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "Deltagande användarenheter", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "lösenord eller återställningsnyckel", "@passphraseOrKey": { "type": "text", @@ -1329,11 +1027,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Välj ett användarnamn", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Klicka på länken i e-postmeddelandet för att sedan fortsätta.", "@pleaseClickOnLink": { "type": "text", @@ -1344,11 +1037,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Ange ditt Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Ange ditt lösenord", "@pleaseEnterYourPassword": { "type": "text", @@ -1369,17 +1057,12 @@ "type": "text", "placeholders": {} }, - "publicKey": "Publik Nyckel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Publika Rum", "@publicRooms": { "type": "text", "placeholders": {} }, - "pushRules": "Push regler", + "pushRules": "Regler", "@pushRules": { "type": "text", "placeholders": {} @@ -1450,11 +1133,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Ta bort meddelande", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Återge innehåll med rikt meddelande", "@renderRichContent": { "type": "text", @@ -1480,36 +1158,16 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Begär att läsa äldre meddelanden", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Återkalla alla behörigheter", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Rummet har blivit uppgraderat", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "Lördag", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "Sök", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "Sök efter en chatt", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "Säkerhet", "@security": { "type": "text", @@ -1522,22 +1180,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{Sedd av {username} och {count} andra}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Sedd av {username} och {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Skicka", "@send": { "type": "text", @@ -1553,11 +1195,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Tillåt att skicka buggrapporter med sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Skicka fil", "@sendFile": { "type": "text", @@ -1583,35 +1220,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} skickade en fil", + "sentAFile": "📁 {username} skickade en fil", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} skickade ett ljudklipp", + "sentAnAudio": "🎤 {username} skickade ett ljudklipp", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} skickade ett ljudklipp", + "sentAPicture": "🖼️ {username} skickade en bild", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} skickade en sticker", + "sentASticker": "😊 {username} skickade ett klistermärke", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} skickade en video", + "sentAVideo": "🎥 {username} skickade en video", "@sentAVideo": { "type": "text", "placeholders": { @@ -1625,31 +1262,11 @@ "senderName": {} } }, - "sentryInfo": "Information om din intigritet: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessionen är verifierad", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Ställ in en profilbild", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setCustomEmotes": "Ställ in anpassade dekaler", "@setCustomEmotes": { "type": "text", "placeholders": {} }, - "setGroupDescription": "Ställ in gruppbeskrivning", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Ställ in inbjudningslänk", "@setInvitationLink": { "type": "text", @@ -1682,21 +1299,11 @@ "username": {} } }, - "signUp": "Registrera", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Hoppa över", "@skip": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Ljud, vibrations-LED-färg", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Källkod", "@sourceCode": { "type": "text", @@ -1709,11 +1316,6 @@ "senderName": {} } }, - "startYourFirstChat": "Starta din första chatt nu! 🙂\n- tryck på \"ny chatt\"\n- Skanna en väns QR-kod\n- Ha så kul med chattandet", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Status", "@status": { "type": "text", @@ -1729,21 +1331,11 @@ "type": "text", "placeholders": {} }, - "sunday": "Söndag", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "System", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "Tryck för att visa menyn", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Dom Matchar Inte", "@theyDontMatch": { "type": "text", @@ -1754,26 +1346,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Detta rummet har blivit arkiverat.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Torsdag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1805,11 +1377,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Tisdag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Upptagen", "@unavailable": { "type": "text", @@ -1845,11 +1412,6 @@ "type": {} } }, - "unknownSessionVerify": "Okänd session, vänligen verifiera", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Slå på ljudet för chatten", "@unmuteChat": { "type": "text", @@ -1867,18 +1429,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{ett oläst meddelande} other{{unreadEvents} olästa meddelanden}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Använd AMOLED kompatibla färger?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} och {count} andra skriver…", "@userAndOthersAreTyping": { "type": "text", @@ -1902,7 +1452,7 @@ "username": {} } }, - "userLeftTheChat": "{username} lämnade chatten", + "userLeftTheChat": "🚪 {username} lämnade chatten", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -1922,21 +1472,11 @@ "type": {} } }, - "verifiedSession": "Bekräftad session!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Verifiera", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Verifiera Manuellt", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Starta verifiering", "@verifyStart": { "type": "text", @@ -1952,11 +1492,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Verifiera Användare", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Videosamtal", "@videoCall": { "type": "text", @@ -1997,7 +1532,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Bakgrund", + "wallpaper": "Bakgrund:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2007,21 +1542,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Ändpunktskryptering är för närvarande i Beta! Använd på egen risk!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Onsdag", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Välkommen till den sötaste messenger-klienten i Matrix nätverket.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Vi skickade dig ett e-postmeddelande", "@weSentYouAnEmail": { "type": "text", @@ -2062,43 +1582,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Du är inbjuden till denna chatt", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Du deltar inte längre i denna chatt", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Du kan inte bjuda in dig själv", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Du har blivit bannad från denna chatt", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Ditt egna användarnamn", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Din publika nyckel", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Du kommer att anslutas till {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "commandHint_html": "Skicka HTML-formatted text", "@commandHint_html": { "type": "text", @@ -2109,11 +1607,6 @@ "type": "text", "description": "Usage hint for the command /ban" }, - "clearText": "Rensa text", - "@clearText": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Rensa arkiv", "@clearArchive": {}, "chats": "Chatter", @@ -2121,11 +1614,6 @@ "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "Chatt har tagits bort från detta utrymme", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Chatt har lagts till i detta utrymme", "@chatHasBeenAddedToThisSpace": {}, "chatBackup": "Chatt backup", @@ -2163,16 +1651,6 @@ "type": "text", "placeholder": {} }, - "audioPlayerPlay": "Spela", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Paus", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, "allChats": "Alla chattar", "@allChats": { "type": "text", @@ -2180,11 +1658,6 @@ }, "addToSpace": "Lägg till i utrymme", "@addToSpace": {}, - "addNewFriend": "Lägg till ny vän", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addEmail": "Lägg till e-post", "@addEmail": { "type": "text", @@ -2230,22 +1703,12 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Felaktigt e-post", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "goToTheNewRoom": "Gå till det nya rummet", "@goToTheNewRoom": { "type": "text", "placeholders": {} }, - "friends": "Vänner", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Teckensnitt storlek", + "fontSize": "Textstorlek", "@fontSize": { "type": "text", "placeholders": {} @@ -2262,28 +1725,11 @@ "error": {} } }, - "enterASpacepName": "Ange utrymmets namn", - "@enterASpacepName": {}, - "enableChatBackup": "Aktivera chatt backup för att inte förlora åtkomst till dina chattar.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Redigera rum alias", "@editRoomAliases": { "type": "text", "placeholders": {} }, - "dontAskAgain": "Avbryt och fråga inte igen", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Kryptering är enbart säker när samtliga enheter har verifierats.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Nytt utrymme", "@createNewSpace": { "type": "text", @@ -2341,13 +1787,6 @@ "type": "text", "placeholders": {} }, - "loginWith": "Logga in med {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "noMatrixServer": "{server1} är inte en matrix server, använd {server2} istället?", "@noMatrixServer": { "type": "text", @@ -2361,11 +1800,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "Var god ange din säkerhets nyckel:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseChoose": "Var god välj", "@pleaseChoose": { "type": "text", @@ -2381,17 +1815,12 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "( Frivilligt) Din e-postadress", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, "openInMaps": "Öppna i karta", "@openInMaps": { "type": "text", "placeholders": {} }, - "oopsPushError": "Oj! Tyvärr uppstod ett fel vid upprättande av push notiser.", + "oopsPushError": "Oj! Tyvärr gick inte aviseringar att slå på.", "@oopsPushError": { "type": "text", "placeholders": {} @@ -2435,33 +1864,11 @@ "@sendAsText": { "type": "text" }, - "securityKeyLost": "Borttappad säkerhets nyckel?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Säkerhets nyckel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Spara fil i denna mapp", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "saveFile": "Spara fil", "@saveFile": { "type": "text", "placeholders": {} }, - "savedFileAs": "Sparad som {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "roomVersion": "Rum version", "@roomVersion": { "type": "text", @@ -2477,27 +1884,12 @@ "type": "text", "placeholders": {} }, - "publicSpace": "Publika utrymmen", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Publika grupper", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPin": "Ange din pin-kod", "@pleaseEnterYourPin": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Dina chattar synkroniseras…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Radera din chatt-backup för att skapa en ny säkerhetsnyckel?", + "wipeChatBackup": "Radera din chatt-backup för att skapa en ny återställningsnyckel?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2507,67 +1899,16 @@ "type": "text", "placeholders": {} }, - "userVerified": "Användaren är verifierad", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Användare har en okänd verifikationsstatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Användaren är inte verifierad", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Lås upp chatt backup", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "transferFromAnotherDevice": "Överför till annan enhet", "@transferFromAnotherDevice": { "type": "text", "placeholders": {} }, - "tapToShowImage": "Tryck för att visa bild", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tryck på en enhet för att verifiera", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Zooma ut", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Zooma in", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "shareYourInviteLink": "Dela din inbjudan", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Skana QR koden eller dela inbjudan länken om ni ej är i närheten av varandra.", - "@createNewChatExplaination": {}, - "chatBackupDescription": "Din chatt backup är skyddad av en säkerhets nyckel. Se till att du inte förlorar den.", + "chatBackupDescription": "Din chatt backup är skyddad av en säkerhetsnyckel. Se till att du inte förlorar den.", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "moreEvents": "{count,plural, other{{count} mer events}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "commandHint_create": "Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering", "@commandHint_create": { "type": "text", @@ -2618,48 +1959,17 @@ "@addToSpaceDescription": {}, "start": "Starta", "@start": {}, - "pleaseEnterSecurityKeyDescription": "För att låsa upp din chatt-backup, vänligen ange säkerhetsnyckeln som skapats i en tidigare session. Säkerhetsnyckeln är INTE densamma som ditt lösenord.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Spara säkerhetsnyckeln nu", - "@saveTheSecurityKeyNow": {}, - "iUnderstand": "Jag förstår", - "@iUnderstand": {}, - "yourStory": "Din berättelse", - "@yourStory": {}, "openGallery": "Öppna galleri", "@openGallery": {}, - "storyFrom": "Berättelse från {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "passwordsDoNotMatch": "Lösenorden stämmer inte överens!", - "@passwordsDoNotMatch": {}, "repeatPassword": "Upprepa lösenord", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Vänligen ange minst {min} tecken.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "markAsRead": "Markera som läst", "@markAsRead": {}, - "setupChatBackup": "Konfigurera chatt-backup", - "@setupChatBackup": {}, - "setupChatBackupDescription": "För att skydda dina meddelanden så det skapats en säkerhetsnyckel.\nFörvara nyckeln på ett säkert ställe, t ex med en lösenordshanterare.", - "@setupChatBackupDescription": {}, "commandHint_clearcache": "Rensa cache", "@commandHint_clearcache": { "type": "text", "description": "Usage hint for the command /clearcache" }, - "newUsernameDescription": "Ditt användar-ID kommer att ha formatet @användarnamn:servernamn", - "@newUsernameDescription": {}, "openVideoCamera": "Aktivera kamera för video", "@openVideoCamera": { "type": "text", @@ -2669,10 +1979,6 @@ "@link": {}, "publish": "Publicera", "@publish": {}, - "unsubscribeStories": "Avprenumerera berättelser", - "@unsubscribeStories": {}, - "replyHasBeenSent": "Svar har skickats", - "@replyHasBeenSent": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2680,56 +1986,21 @@ "size": {} } }, - "whatIsGoingOn": "Vad händer?", - "@whatIsGoingOn": {}, - "addDescription": "Lägg till beskrivning", - "@addDescription": {}, "reportUser": "Rapportera användare", "@reportUser": {}, "openChat": "Öppna Chatt", "@openChat": {}, - "yourUserId": "Ditt användar-ID:", - "@yourUserId": {}, "sendOnEnter": "Skicka med Enter", "@sendOnEnter": {}, - "iWroteDownTheKey": "Jag har antecknat nyckeln", - "@iWroteDownTheKey": {}, - "addToStory": "Addera till berättelse", - "@addToStory": {}, - "pleaseEnterValidEmail": "Vänligen ange en giltig e-postadress.", - "@pleaseEnterValidEmail": {}, "scanQrCode": "Skanna QR-kod", "@scanQrCode": {}, - "bubbleSize": "Storlek på bubbla", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, "yourChatBackupHasBeenSetUp": "Din chatt-backup har konfigurerats.", "@yourChatBackupHasBeenSetUp": {}, - "loginWithOneClick": "Logga in med ett klick", - "@loginWithOneClick": {}, - "typeInInviteLinkManually": "Skriv in länk med inbjudan manuellt...", - "@typeInInviteLinkManually": {}, - "newPasswordDescription": "För att kunna återställa ditt lösenord så bör du vid tillfälle lägga till en e-postadress till ditt konto.", - "@newPasswordDescription": {}, "removeFromBundle": "Ta bort från paket", "@removeFromBundle": {}, "enableMultiAccounts": "(BETA) Aktivera multi-konton på denna enhet", "@enableMultiAccounts": {}, - "removeFromSpaceDescription": "Detta raderar chatten från det nuvarande utrymmet. Chatten är fortfarande synlig under \"Alla chattar\".", - "@removeFromSpaceDescription": {}, - "whoCanSeeMyStories": "Vem kan se mina berättelser?", - "@whoCanSeeMyStories": {}, - "setupChatBackupNow": "Konfigurera din chatt-backup nu", - "@setupChatBackupNow": {}, - "whoCanSeeMyStoriesDesc": "Notera att användare kan se och kontakta varandra i din berättelse.", - "@whoCanSeeMyStoriesDesc": {}, - "thisUserHasNotPostedAnythingYet": "Den här användaren har inte lagt till något till deras berättelse än", - "@thisUserHasNotPostedAnythingYet": {}, - "storyPrivacyWarning": "Notera att användare kan se och kontakta varandra i din berättelse. Din berättelse är synlig i 24 timmar, men det finns ingen garanti för att berättelser raderas från alla enheter och servrar.", - "@storyPrivacyWarning": {}, - "emojis": "Emojis", + "emojis": "Uttryckssymboler", "@emojis": {}, "placeCall": "Ring", "@placeCall": {}, @@ -2743,12 +2014,6 @@ "@unsupportedAndroidVersionLong": {}, "dismiss": "Avfärda", "@dismiss": {}, - "matrixWidgets": "Matrix widgetar", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Det går inte att redigera widgetar och integrationer ännu.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Redigera widgetar och integrationer", - "@editIntegrations": {}, "reactedWith": "{sender} reagerade med {reaction}", "@reactedWith": { "type": "text", @@ -2759,8 +2024,6 @@ }, "pinMessage": "Fäst i rum", "@pinMessage": {}, - "pinnedEventsError": "Ett fel uppstod när fastnålade meddelanden skulle hämtas", - "@pinnedEventsError": {}, "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", "@confirmEventUnpin": {}, "experimentalVideoCalls": "Experimentella videosamtal", @@ -2792,10 +2055,553 @@ "@widgetUrlError": {}, "errorAddingWidget": "Ett fel uppstod när widgeten skulle läggas till.", "@errorAddingWidget": {}, - "editWidgets": "Redigera widgetar", - "@editWidgets": {}, - "widgetJitsi": "Jitsi Meet", + "widgetJitsi": "Jitsi-möte", "@widgetJitsi": {}, "widgetNameError": "Vänligen ange ett visningsnamn.", - "@widgetNameError": {} + "@widgetNameError": {}, + "storeSecurlyOnThisDevice": "Lagra säkert på denna enhet", + "@storeSecurlyOnThisDevice": {}, + "youJoinedTheChat": "Du gick med i chatten", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Du accepterade inbjudan", + "@youAcceptedTheInvitation": {}, + "youKicked": "👞 Du sparkade ut {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "hugContent": "{senderName} kramar dig", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_markasgroup": "Märk som grupp", + "@commandHint_markasgroup": {}, + "recoveryKeyLost": "Borttappad återställningsnyckel?", + "@recoveryKeyLost": {}, + "indexedDbErrorTitle": "Problem med privat läge", + "@indexedDbErrorTitle": {}, + "youHaveWithdrawnTheInvitationFor": "Du har återkallat inbjudan till {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "Du återkallade förbudet för {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "unlockOldMessages": "Lås upp äldre meddelanden", + "@unlockOldMessages": {}, + "newSpace": "Nytt utrymme", + "@newSpace": {}, + "googlyEyesContent": "{senderName} skickar dig googly ögon", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "dehydrate": "Exportera sessionen och rensa enheten", + "@dehydrate": {}, + "dehydrateWarning": "Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR-användare: Exportera session", + "@dehydrateTor": {}, + "hydrateTor": "TOR-användare: Importera session från tidigare export", + "@hydrateTor": {}, + "hydrateTorLong": "Exporterade du sessionen när du senast använde TOR? Importera den enkelt och fortsätt chatta.", + "@hydrateTorLong": {}, + "recoveryKey": "Återställningsnyckel", + "@recoveryKey": {}, + "separateChatTypes": "Separata direktchattar och grupper", + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "startFirstChat": "Starta din första chatt", + "@startFirstChat": {}, + "pleaseEnterRecoveryKeyDescription": "Ange din återställningsnyckel från en tidigare session för att låsa upp äldre meddelanden. Din återställningsnyckel är INTE ditt lösenord.", + "@pleaseEnterRecoveryKeyDescription": {}, + "encryptThisChat": "Kryptera denna chatt", + "@encryptThisChat": {}, + "dehydrateTorLong": "TOR-användare rekommenderas att exportera sessionen innan fönstret stängs.", + "@dehydrateTorLong": {}, + "noBackupWarning": "Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Inga andra enheter hittades", + "@noOtherDevicesFound": {}, + "disableEncryptionWarning": "Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Det där är inte möjligt", + "@sorryThatsNotPossible": {}, + "confirmMatrixId": "Bekräfta ditt Matrix-ID för att radera ditt konto.", + "@confirmMatrixId": {}, + "supposedMxid": "Detta bör vara {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "pleaseEnterRecoveryKey": "Ange din återställningsnyckel:", + "@pleaseEnterRecoveryKey": {}, + "commandHint_markasdm": "Märk som rum för direktmeddelanden för det givante Matrix ID", + "@commandHint_markasdm": {}, + "user": "Användare", + "@user": {}, + "indexedDbErrorLong": "Meddelandelagring är tyvärr inte aktiverat i privat läge som standard.\nGå till\n - about:config\n - sätt dom.indexedDB.privateBrowsing.enabled till true\nAnnars går det inte att använda FluffyChat.", + "@indexedDbErrorLong": {}, + "storeInSecureStorageDescription": "Lagra återställningsnyckeln på säker plats på denna enhet.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Lagra i Apples nyckelkedja (KeyChain)", + "@storeInAppleKeyChain": {}, + "foregroundServiceRunning": "Denna avisering visas när förgrundstjänsten körs.", + "@foregroundServiceRunning": {}, + "custom": "Anpassad", + "@custom": {}, + "countFiles": "{count} filer", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "screenSharingTitle": "skärmdelning", + "@screenSharingTitle": {}, + "noKeyForThisMessage": "Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.", + "@noKeyForThisMessage": {}, + "fileIsTooBigForServer": "Servern informerar om att filen är för stor för att skickas.", + "@fileIsTooBigForServer": {}, + "deviceKeys": "Enhetsnycklar:", + "@deviceKeys": {}, + "enterSpace": "Gå till utrymme", + "@enterSpace": {}, + "commandHint_googly": "Skicka några googly ögon", + "@commandHint_googly": {}, + "commandHint_cuddle": "Skicka en omfamning", + "@commandHint_cuddle": {}, + "commandHint_hug": "Skicka en kram", + "@commandHint_hug": {}, + "users": "Användare", + "@users": {}, + "cuddleContent": "{senderName} omfamnar dig", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hydrate": "Återställ från säkerhetskopia", + "@hydrate": {}, + "screenSharingDetail": "Du delar din skärm i FluffyChat", + "@screenSharingDetail": {}, + "youRejectedTheInvitation": "Du avvisade inbjudan", + "@youRejectedTheInvitation": {}, + "youBannedUser": "Du förbjöd {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 Du har blivit inbjuden av {user}", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youInvitedUser": "📩 Du bjöd in {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "youKickedAndBanned": "🙅 Du sparkade ut och förbjöd {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "saveKeyManuallyDescription": "Spara nyckeln manuellt genom att aktivera dela-funktionen eller urklippshanteraren på enheten.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Lagra i Androids nyckellagring (KeyStore)", + "@storeInAndroidKeystore": {}, + "callingPermissions": "Samtalsbehörighet", + "@callingPermissions": {}, + "callingAccount": "Samtalskonto", + "@callingAccount": {}, + "callingAccountDetails": "Tillåt FluffyChat att använda Androids ring-app.", + "@callingAccountDetails": {}, + "appearOnTop": "Visa ovanpå", + "@appearOnTop": {}, + "appearOnTopDetails": "Tillåt att appen visas ovanpå (behövs inte om du redan har FluffyChat konfigurerat som ett samtalskonto)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Mikrofon, kamera och andra behörigheter för FluffyChat", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Varför kan inte detta meddelande läsas?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Ny grupp", + "@newGroup": {}, + "enterRoom": "Gå till rummet", + "@enterRoom": {}, + "allSpaces": "Alla utrymmen", + "@allSpaces": {}, + "numChats": "{number} chattar", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Göm oviktiga tillståndshändelser", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Visa inte igen", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Tom chatt (var {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "newSpaceDescription": "Utrymmen möjliggör konsolidering av chattar och att bygga privata eller offentliga gemenskaper.", + "@newSpaceDescription": {}, + "reopenChat": "Återöppna chatt", + "@reopenChat": {}, + "jumpToLastReadMessage": "Hoppa till det senast lästa meddelandet", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Läs upp till hit", + "@readUpToHere": {}, + "fileHasBeenSavedAt": "Filen har sparats i {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "allRooms": "Alla gruppchattar", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.", + "@reportErrorDescription": {}, + "setColorTheme": "Välj färgtema:", + "@setColorTheme": {}, + "banUserDescription": "Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.", + "@banUserDescription": {}, + "removeDevicesDescription": "Du kommer att bli utloggad från den här enheten och kommer inte längre kunna få meddelanden.", + "@removeDevicesDescription": {}, + "tryAgain": "Försök igen", + "@tryAgain": {}, + "unbanUserDescription": "Användaren kommer kunna gå med i chatten igen om den försöker.", + "@unbanUserDescription": {}, + "messagesStyle": "Meddelanden:", + "@messagesStyle": {}, + "chatDescription": "Chattbeskrivning", + "@chatDescription": {}, + "pushNotificationsNotAvailable": "Aviseringar är inte tillgängligt", + "@pushNotificationsNotAvailable": {}, + "invalidServerName": "Ogiltigt servernamn", + "@invalidServerName": {}, + "chatPermissions": "Chatt-behörigheter", + "@chatPermissions": {}, + "signInWithPassword": "Logga in med lösenord", + "@signInWithPassword": {}, + "makeAdminDescription": "När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.", + "@makeAdminDescription": {}, + "setChatDescription": "Ändra chattens beskrivning", + "@setChatDescription": {}, + "importFromZipFile": "Importera från .zip-fil", + "@importFromZipFile": {}, + "redactedBy": "Borttaget av {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "signInWith": "Logga in med {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "optionalRedactReason": "(Frivilligt) Anledning till att ta bort det här meddelandet…", + "@optionalRedactReason": {}, + "archiveRoomDescription": "Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Exportera Emote-pack som .zip", + "@exportEmotePack": {}, + "inviteContactToGroupQuestion": "Vill du bjuda in {contact} till chatten ”{groupName}”?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Borttaget av {username} på grund av: ”{reason}”", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "redactMessageDescription": "Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.", + "@redactMessageDescription": {}, + "invalidInput": "Ogiltig input!", + "@invalidInput": {}, + "report": "rapportera", + "@report": {}, + "addChatDescription": "Lägg till en chattbeskrivning…", + "@addChatDescription": {}, + "hasKnocked": "{user} har knackat", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "openLinkInBrowser": "Öppna länk i webbläsare", + "@openLinkInBrowser": {}, + "directChat": "Direktchatt", + "@directChat": {}, + "wrongPinEntered": "Fel pin-kod inslagen! Försök igen om {seconds} sekunder…", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "sendTypingNotifications": "Skicka skrivnotifikationer", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Bjud in gruppchatt", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Bjud in privat chatt", + "@invitePrivateChat": {}, + "importEmojis": "Importera emojier", + "@importEmojis": {}, + "noChatDescriptionYet": "Ingen chatt-beskrivning än.", + "@noChatDescriptionYet": {}, + "learnMore": "Lär dig mer", + "@learnMore": {}, + "notAnImage": "Inte en bildfil.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "Chattbeskrivningen ändrades", + "@chatDescriptionHasBeenChanged": {}, + "roomUpgradeDescription": "Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Vänligen ange ett nummer större än 0", + "@pleaseEnterANumber": {}, + "profileNotFound": "Användaren kunde onte hittas på servern. Kanske är det ett anslutningsproblem eller så finns inte användaren.", + "@profileNotFound": {}, + "jump": "Hoppa", + "@jump": {}, + "shareInviteLink": "Dela inbjudningslänk", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Nyligen använda emotes kommer dyka upp här…", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "setTheme": "Välj tema:", + "@setTheme": {}, + "replace": "Ersätt", + "@replace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Vänligen försök igen eller välj en annan server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Skapa grupp", + "@createGroup": {}, + "kickUserDescription": "Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.", + "@kickUserDescription": {}, + "importNow": "Importera nu", + "@importNow": {}, + "invite": "Bjud in", + "@invite": {}, + "databaseBuildErrorBody": "Kan inte bygga SQlite-databasen. Appen försöker använda den gamla databasen för nu. Vänligen rapportera problemet till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "blockListDescription": "Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Skapa en grupp och bjud in användare", + "@createGroupAndInviteUsers": {}, + "initAppError": "Ett problem skedde när appen initierades", + "@initAppError": {}, + "thisDevice": "Denna enhet:", + "@thisDevice": {}, + "startConversation": "Starta konversation", + "@startConversation": {}, + "publicSpaces": "Offentliga utrymmen", + "@publicSpaces": {}, + "blockedUsers": "Blockerade användare", + "@blockedUsers": {}, + "passwordIsWrong": "Det angivna lösenordet är fel", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Vänligen skriv ditt nuvarande lösenord", + "@pleaseEnterYourCurrentPassword": {}, + "groupCanBeFoundViaSearch": "Gruppen kan hittas genom sökning", + "@groupCanBeFoundViaSearch": {}, + "publicLink": "Offentlig länk", + "@publicLink": {}, + "noUsersFoundWithQuery": "Tyvärr kunde ingen användare hittas med ”{query}”. Vänligen kontrollera om du gjort ett stavfel.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "blockera", + "@block": {}, + "nothingFound": "Inget hittades…", + "@nothingFound": {}, + "yourGlobalUserIdIs": "Ditt globala användar-ID är: ", + "@yourGlobalUserIdIs": {}, + "decline": "Neka", + "@decline": {}, + "newPassword": "Nytt lösenord", + "@newPassword": {}, + "passwordsDoNotMatch": "Lösenorden passar inte", + "@passwordsDoNotMatch": {}, + "commandHint_sendraw": "Skicka rå json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.", + "@wrongRecoveryKey": {}, + "subspace": "Underutrymme", + "@subspace": {}, + "select": "Ange val", + "@select": {}, + "sessionLostBody": "Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "pleaseChooseAStrongPassword": "Vänligen välj ett starkt lösenord", + "@pleaseChooseAStrongPassword": {}, + "blockUsername": "Ignorera användarnamn", + "@blockUsername": {}, + "addChatOrSubSpace": "Lägg till chatt eller underutrymme", + "@addChatOrSubSpace": {}, + "groupName": "Gruppnamn", + "@groupName": {}, + "leaveEmptyToClearStatus": "Lämna tom för att ta bort din status.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Gå med i utrymme", + "@joinSpace": {}, + "searchForUsers": "Sök efter @användare…", + "@searchForUsers": {}, + "restoreSessionBody": "Appen försöker nu få tillbaks din session från backupen. Vänligen rapportera detta problem till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "databaseMigrationTitle": "Databasen är optimerad", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Sök efter #chattar, @användare…", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "📩 Du har blivit inbjuden via länk till:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verifiera användaren", + "@verifyOtherUser": {}, + "formattedMessages": "Formaterade meddelanden", + "@formattedMessages": {}, + "canceledKeyVerification": "{sender} avbröt nyckelverifieringen", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} fullbordade nyckelverifieringen", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} begärde nyckelverifiering", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Transparent", + "@transparent": {}, + "startedKeyVerification": "{sender} påbörjade nyckelverifiering", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presenceStyle": "Närvaro:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Visa statusmeddelanden från andra användare", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "hidePresences": "Dölj statuslista?", + "@hidePresences": {}, + "sendReadReceipts": "Skicka läskvitton", + "@sendReadReceipts": {}, + "verifyOtherDevice": "🔐 Verifiera enhet", + "@verifyOtherDevice": {}, + "acceptedKeyVerification": "{sender} accepterade nyckelverifieringen", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "incomingMessages": "Inkommande meddelanden", + "@incomingMessages": {}, + "forwardMessageTo": "Vidarebefordra meddelandet till {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳", + "@verifyOtherDeviceDescription": {}, + "isReadyForKeyVerification": "{sender} är redo för nyckelverifiering", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "sendReadReceiptsDescription": "Andra deltagare i en diskussion kan se när du läst ett meddelande.", + "@sendReadReceiptsDescription": {}, + "stickers": "Klistermärken", + "@stickers": {}, + "discover": "Upptäck", + "@discover": {} } diff --git a/assets/l10n/intl_ta.arb b/assets/l10n/intl_ta.arb index 8d75972a1e..92d8973767 100644 --- a/assets/l10n/intl_ta.arb +++ b/assets/l10n/intl_ta.arb @@ -1,20 +1,1884 @@ { - "@@last_modified": "2021-08-14 12:41:09.826673", - "acceptedTheInvitation": "{username} அழைப்பை ஏற்றுக்கொண்டார்", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} + "@@last_modified": "2021-08-14 12:41:09.826673", + "acceptedTheInvitation": "{username} அழைப்பை ஏற்றுக்கொண்டார்", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "accept": "ஏற்றுக்கொள்", + "@accept": { + "type": "text", + "placeholders": {} + }, + "about": "பற்றி", + "@about": { + "type": "text", + "placeholders": {} + }, + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@admin": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@addAccount": {}, + "@close": { + "type": "text", + "placeholders": {} + }, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "text", + "placeholders": {} + }, + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "text", + "placeholders": {} + }, + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@encryption": { + "type": "text", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@password": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "@remove": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@alias": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "text", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "text", + "placeholders": {} + }, + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@copy": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "text", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@username": { + "type": "text", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "text", + "placeholders": {} + }, + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "@verified": { + "type": "text", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "text", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "text", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@ignore": { + "type": "text", + "placeholders": {} + }, + "@recording": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@moderator": { + "type": "text", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@send": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "@banned": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "@account": { + "type": "text", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@notifications": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@chat": { + "type": "text", + "placeholders": {} + }, + "@group": { + "type": "text", + "placeholders": {} + }, + "@leave": { + "type": "text", + "placeholders": {} + }, + "@skip": { + "type": "text", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@allChats": { + "type": "text", + "placeholders": {} + }, + "@reportUser": {}, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@license": { + "type": "text", + "placeholders": {} + }, + "@addToSpace": {}, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@forward": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "text", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "text", + "placeholders": {} + }, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "text", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@you": { + "type": "text", + "placeholders": {} + }, + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "text", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@messages": { + "type": "text", + "placeholders": {} + }, + "@login": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@settings": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@security": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "text", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@archive": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "@devices": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@share": { + "type": "text", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "text", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "@verify": { + "type": "text", + "placeholders": {} + }, + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@pin": { + "type": "text", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@unsupportedAndroidVersionLong": {}, + "@storeSecurlyOnThisDevice": {}, + "@ok": { + "type": "text", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@screenSharingDetail": {}, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@placeCall": {}, + "@extremeOffensive": { + "type": "text", + "placeholders": {} } - }, - "accept": "ஏற்றுக்கொள்", - "@accept": { - "type": "text", - "placeholders": {} - }, - "about": "பற்றி", - "@about": { - "type": "text", - "placeholders": {} - } -} +} \ No newline at end of file diff --git a/assets/l10n/intl_th.arb b/assets/l10n/intl_th.arb new file mode 100644 index 0000000000..8eac432521 --- /dev/null +++ b/assets/l10n/intl_th.arb @@ -0,0 +1,1930 @@ +{ + "hugContent": "{senderName} กอดคุณ", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_cuddle": "ส่งเคล้าเคลียให้", + "@commandHint_cuddle": {}, + "admin": "แอดมิน", + "@admin": { + "type": "text", + "placeholders": {} + }, + "supposedMxid": "อันนี้ควรเป็น {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "askSSSSSign": "เพื่อให้สามารถลงนามบุคคลอื่นได้ โปรดป้อนรหัสผ่านร้านค้าที่ปลอดภัยหรือรหัสกู้คืนของคุณ", + "@askSSSSSign": { + "type": "text", + "placeholders": {} + }, + "remove": "ลบออก", + "@remove": { + "type": "text", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "ผู้ใช้ทั่วไปได้รับอนุญาตให้เข้าร่วมหรือไม่", + "@areGuestsAllowedToJoin": { + "type": "text", + "placeholders": {} + }, + "sendOnEnter": "ส่งเมื่อกด enter", + "@sendOnEnter": {}, + "answeredTheCall": "{senderName} รับสายแล้ว", + "@answeredTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "alias": "นามแฝง", + "@alias": { + "type": "text", + "placeholders": {} + }, + "all": "ทั้งหมด", + "@all": { + "type": "text", + "placeholders": {} + }, + "badServerLoginTypesException": "โฮมเซิร์ฟเวอร์รองรับประเภทการเข้าสู่ระบบ:\n{serverVersions}\nแต่แอปนี้รองรับเฉพาะ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "edit": "แก้ไข", + "@edit": { + "type": "text", + "placeholders": {} + }, + "copy": "คัดลอก", + "@copy": { + "type": "text", + "placeholders": {} + }, + "importFromZipFile": "นำเข้าจากไฟล์ .zip", + "@importFromZipFile": {}, + "autoplayImages": "เล่นสติ๊กเกอร์และอิโมจิแบบเคลื่อนไหวโดยอัตโนมัติ", + "@autoplayImages": { + "type": "text", + "placeholder": {} + }, + "help": "ช่วยเหลือ", + "@help": { + "type": "text", + "placeholders": {} + }, + "chatDetails": "รายละเอียดแชท", + "@chatDetails": { + "type": "text", + "placeholders": {} + }, + "repeatPassword": "ใส่รหัสผ่านอีกรอบ", + "@repeatPassword": {}, + "delete": "ลบออก", + "@delete": { + "type": "text", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ได้รับการชวนแล้ว", + "@acceptedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "send": "ส่ง", + "@send": { + "type": "text", + "placeholders": {} + }, + "exportEmotePack": "ส่งอิโมจิแพ็คออกเป็นไฟล์ .zip", + "@exportEmotePack": {}, + "account": "บัญชี", + "@account": { + "type": "text", + "placeholders": {} + }, + "chat": "แชท", + "@chat": { + "type": "text", + "placeholders": {} + }, + "areYouSure": "คุณแน่ใจไหม?", + "@areYouSure": { + "type": "text", + "placeholders": {} + }, + "allChats": "แชททั้งหมด", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "addToSpace": "เพิ่มไปที่ space", + "@addToSpace": {}, + "about": "เกี่ยวกับ", + "@about": { + "type": "text", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} เปิดใช้งาน end to end encryption", + "@activatedEndToEndEncryption": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "text", + "placeholders": {} + }, + "googlyEyesContent": "{senderName} ส่งตากวนๆให้คุณ", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "addChatDescription": "เพิ่มคำอธิบายการแชท", + "@addChatDescription": {}, + "appLock": "ล็อคแอป", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "sendTypingNotifications": "ส่งการแจ้งเตือนการพิมพ์", + "@sendTypingNotifications": {}, + "importEmojis": "นำเข้าอ๊โมจิ", + "@importEmojis": {}, + "confirmMatrixId": "กรุณายืนยัน Matrix ID ของคุณเพื่อลบบัญชีของคุณ", + "@confirmMatrixId": {}, + "notAnImage": "ไม่ใช่ไฟล์รูปภาพ", + "@notAnImage": {}, + "areYouSureYouWantToLogout": "คุณแน่ใจว่าคุณต้องการที่จะออกจากระบบ?", + "@areYouSureYouWantToLogout": { + "type": "text", + "placeholders": {} + }, + "cuddleContent": "{senderName} เคล้าเคลียคุณ", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "askVerificationRequest": "ยอมรับคำขอยืนยันนี้จาก {username} หรือไม่", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "addEmail": "เพิ่มอีเมล", + "@addEmail": { + "type": "text", + "placeholders": {} + }, + "commandHint_hug": "ส่งกอดให้", + "@commandHint_hug": {}, + "replace": "แทนที่", + "@replace": {}, + "archive": "คลังเก็บ", + "@archive": { + "type": "text", + "placeholders": {} + }, + "accept": "ยอมรับ", + "@accept": { + "type": "text", + "placeholders": {} + }, + "commandHint_googly": "ส่งสายตากวนๆ มาให้หน่อย", + "@commandHint_googly": {}, + "pin": "ปักหมุด", + "@pin": { + "type": "text", + "placeholders": {} + }, + "importNow": "นำเข้าเลย", + "@importNow": {}, + "anyoneCanJoin": "ใครๆ ก็สามารถเข้าร่วมได้", + "@anyoneCanJoin": { + "type": "text", + "placeholders": {} + }, + "@showPassword": { + "type": "text", + "placeholders": {} + }, + "@darkTheme": { + "type": "text", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "text", + "placeholders": {} + }, + "@theyMatch": { + "type": "text", + "placeholders": {} + }, + "@connect": { + "type": "text", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "@chats": { + "type": "text", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "text", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "text", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "text", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "text", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "text", + "placeholders": { + "groupName": {} + } + }, + "@addAccount": {}, + "@close": { + "type": "text", + "placeholders": {} + }, + "@configureChat": { + "type": "text", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "text", + "placeholders": {} + }, + "@currentlyActive": { + "type": "text", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "text", + "placeholders": {} + }, + "@blockDevice": { + "type": "text", + "placeholders": {} + }, + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "text", + "placeholders": {} + }, + "@encryption": { + "type": "text", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "text", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@title": { + "description": "Title for the application", + "type": "text", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@verifySuccess": { + "type": "text", + "placeholders": {} + }, + "@sendFile": { + "type": "text", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "text", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "text", + "placeholders": {} + }, + "@sentAPicture": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@invited": { + "type": "text", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "text", + "placeholders": { + "username": {}, + "displayname": {} + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "text", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "@warning": { + "type": "text", + "placeholders": {} + }, + "@password": { + "type": "text", + "placeholders": {} + }, + "@allSpaces": {}, + "@editDisplayname": { + "type": "text", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "text", + "placeholders": {} + }, + "@sentAFile": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@videoCall": { + "type": "text", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "text", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "@userAndOthersAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "count": {} + } + }, + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "@userIsTyping": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@openAppToReadMessages": { + "type": "text", + "placeholders": {} + }, + "@sentAVideo": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "text", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "text", + "placeholders": {} + }, + "@writeAMessage": { + "type": "text", + "placeholders": {} + }, + "@changeTheme": { + "type": "text", + "placeholders": {} + }, + "@id": { + "type": "text", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "text", + "placeholders": { + "username": {}, + "description": {} + } + }, + "@countParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@separateChatTypes": { + "type": "text", + "placeholders": {} + }, + "@tryAgain": {}, + "@blocked": { + "type": "text", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "@dateWithoutYear": { + "type": "text", + "placeholders": { + "month": {}, + "day": {} + } + }, + "@removeDevice": { + "type": "text", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "text", + "placeholders": { + "username": {}, + "username2": {} + } + }, + "@pleaseClickOnLink": { + "type": "text", + "placeholders": {} + }, + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "@pickImage": { + "type": "text", + "placeholders": {} + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@invitedUsersOnly": { + "type": "text", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "text", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "text", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@dateWithYear": { + "type": "text", + "placeholders": { + "year": {}, + "month": {}, + "day": {} + } + }, + "@editRoomAliases": { + "type": "text", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "text", + "placeholders": {} + }, + "@unavailable": { + "type": "text", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "text", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "text", + "placeholders": {} + }, + "@sendMessages": { + "type": "text", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "text", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "text", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "text", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "text", + "placeholders": {} + }, + "@no": { + "type": "text", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "text", + "placeholders": {} + }, + "@unpin": { + "type": "text", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "text", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "@addWidget": {}, + "@removeAllOtherDevices": { + "type": "text", + "placeholders": {} + }, + "@unblockDevice": { + "type": "text", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "text", + "placeholders": {} + }, + "@inviteText": { + "type": "text", + "placeholders": { + "username": {}, + "link": {} + } + }, + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "@reason": { + "type": "text", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "text", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "text", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "text", + "placeholders": {} + }, + "@wipeChatBackup": { + "type": "text", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "text", + "placeholders": { + "uri": {} + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "text", + "placeholders": {} + }, + "@online": { + "type": "text", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "text", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "text", + "placeholders": { + "localizedTimeShort": {} + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@weSentYouAnEmail": { + "type": "text", + "placeholders": {} + }, + "@offensive": { + "type": "text", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "text", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@loadMore": { + "type": "text", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "text", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "text", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@pushRules": { + "type": "text", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "text", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "text", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "text", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "text", + "placeholders": {} + }, + "@enableEncryption": { + "type": "text", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "text", + "placeholders": { + "unreadCount": {} + } + }, + "@rejectedTheInvitation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "@toggleUnread": { + "type": "text", + "placeholders": {} + }, + "@or": { + "type": "text", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "text", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "text", + "placeholders": {} + }, + "@emptyChat": { + "type": "text", + "placeholders": {} + }, + "@seenByUser": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "text", + "placeholders": {} + }, + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@submit": { + "type": "text", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "text", + "placeholders": {} + }, + "@createdTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@redactedAnEvent": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@compareEmojiMatch": { + "type": "text", + "placeholders": {} + }, + "@participant": { + "type": "text", + "placeholders": {} + }, + "@logInTo": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "@yes": { + "type": "text", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "text", + "placeholders": {} + }, + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "@username": { + "type": "text", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@people": { + "type": "text", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "text", + "placeholders": { + "username": {}, + "rules": {} + } + }, + "@leftTheChat": { + "type": "text", + "placeholders": {} + }, + "@verified": { + "type": "text", + "placeholders": {} + }, + "@setStatus": { + "type": "text", + "placeholders": {} + }, + "@groupWith": { + "type": "text", + "placeholders": { + "displayname": {} + } + }, + "@callingPermissions": {}, + "@newMessageInFluffyChat": { + "type": "text", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "text", + "placeholders": {} + }, + "@deviceId": { + "type": "text", + "placeholders": {} + }, + "@register": { + "type": "text", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "text", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@changedTheJoinRulesTo": { + "type": "text", + "placeholders": { + "username": {}, + "joinRules": {} + } + }, + "@ignore": { + "type": "text", + "placeholders": {} + }, + "@recording": { + "type": "text", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@moderator": { + "type": "text", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "text", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "text", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "text", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "text", + "placeholders": {} + }, + "@ok": { + "type": "text", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "text", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@visibleForAllParticipants": { + "type": "text", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "text", + "placeholders": {} + }, + "@banned": { + "type": "text", + "placeholders": {} + }, + "@sendAsText": { + "type": "text" + }, + "@inviteForMe": { + "type": "text", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@changedTheChatNameTo": { + "type": "text", + "placeholders": { + "username": {}, + "chatname": {} + } + }, + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "@commandInvalid": { + "type": "text" + }, + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "text", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@changedTheRoomInvitationLink": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@newChat": { + "type": "text", + "placeholders": {} + }, + "@notifications": { + "type": "text", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "text", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "text", + "placeholders": {} + }, + "@mention": { + "type": "text", + "placeholders": {} + }, + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "text", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "@isTyping": { + "type": "text", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "@group": { + "type": "text", + "placeholders": {} + }, + "@leave": { + "type": "text", + "placeholders": {} + }, + "@skip": { + "type": "text", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "text", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "text", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "text", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "text", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "text", + "placeholders": {} + }, + "@unbannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "text", + "placeholders": { + "serverVersions": {}, + "supportedVersions": {} + } + }, + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "@kickedAndBanned": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@noConnectionToTheServer": { + "type": "text", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "@license": { + "type": "text", + "placeholders": {} + }, + "@unbanFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "text", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "text", + "placeholders": {} + }, + "@forward": { + "type": "text", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "text", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "text", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "text", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "text", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "text", + "placeholders": {} + }, + "@invitedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@kickFromChat": { + "type": "text", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "text", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "text", + "placeholders": {} + }, + "@noPermission": { + "type": "text", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@report": {}, + "@status": { + "type": "text", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "text", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "text", + "placeholders": {} + }, + "@verifyStart": { + "type": "text", + "placeholders": {} + }, + "@memberChanges": { + "type": "text", + "placeholders": {} + }, + "@joinRoom": { + "type": "text", + "placeholders": {} + }, + "@unverified": {}, + "@howOffensiveIsThisContent": { + "type": "text", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@addToSpaceDescription": {}, + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "@theyDontMatch": { + "type": "text", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "text", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "text", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@editRoomAvatar": { + "type": "text", + "placeholders": {} + }, + "@encrypted": { + "type": "text", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "text", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "text", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "text", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "text", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "text", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "@lightTheme": { + "type": "text", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "text", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "text", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "text", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "text", + "placeholders": {} + }, + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "text", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "text", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "text", + "description": "Usage hint for the command /ban" + }, + "@confirm": { + "type": "text", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "text", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@fontSize": { + "type": "text", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "text", + "placeholders": {} + }, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "text", + "placeholders": {} + }, + "@you": { + "type": "text", + "placeholders": {} + }, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "text", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "text", + "placeholders": { + "date": {}, + "timeOfDay": {} + } + }, + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "text", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "text", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "text", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "text", + "placeholders": { + "username": {}, + "type": {} + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "text", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "@changedTheJoinRules": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "text", + "placeholders": {} + }, + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "@bannedUser": { + "type": "text", + "placeholders": { + "username": {}, + "targetName": {} + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "@oopsSomethingWentWrong": { + "type": "text", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@containsUserName": { + "type": "text", + "placeholders": {} + }, + "@messages": { + "type": "text", + "placeholders": {} + }, + "@login": { + "type": "text", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "text", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "text", + "placeholders": {} + }, + "@everythingReady": { + "type": "text", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "text", + "placeholders": {} + }, + "@startedACall": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "@emoteInvalid": { + "type": "text", + "placeholders": {} + }, + "@systemTheme": { + "type": "text", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "text", + "placeholders": {} + }, + "@deleteMessage": { + "type": "text", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "text", + "placeholders": {} + }, + "@settings": { + "type": "text", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "text", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "text", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "@play": { + "type": "text", + "placeholders": { + "fileName": {} + } + }, + "@chatBackupDescription": { + "type": "text", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "text", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "text", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "text", + "placeholders": {} + }, + "@security": { + "type": "text", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "text", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "text", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "text", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "text", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "text", + "placeholders": {} + }, + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "@deactivateAccountWarning": { + "type": "text", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "@visibleForEveryone": { + "type": "text", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "text", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "text", + "placeholders": {} + }, + "@devices": { + "type": "text", + "placeholders": {} + }, + "@unknownEvent": { + "type": "text", + "placeholders": { + "type": {} + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "@share": { + "type": "text", + "placeholders": {} + }, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "text", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "@sendImage": { + "type": "text", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "text", + "placeholders": {} + }, + "@botMessages": { + "type": "text", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "text", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "text", + "placeholders": {} + }, + "@verify": { + "type": "text", + "placeholders": {} + }, + "@sendVideo": { + "type": "text", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "text", + "placeholders": {} + }, + "@deleteAccount": { + "type": "text", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "text", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "text", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@emotePacks": { + "type": "text", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "text", + "placeholders": { + "senderName": {} + } + } +} \ No newline at end of file diff --git a/assets/l10n/intl_tr.arb b/assets/l10n/intl_tr.arb index c5ca4975b9..ccafdf7a53 100644 --- a/assets/l10n/intl_tr.arb +++ b/assets/l10n/intl_tr.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} katılma davetini kabul etti", + "acceptedTheInvitation": "👍 {username} katılma davetini kabul etti", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Hesap bilgileri", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} uçtan uca şifrelemeyi etkinleştirdi", + "activatedEndToEndEncryption": "🔐 {username} uçtan uca şifrelemeyi etkinleştirdi", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "Grup açıklaması ekle", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Yeni arkadaş ekle", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Alana ekle", "@addToSpace": {}, "admin": "Yönetici", @@ -72,11 +57,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Hesabınız var mı?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} aramayı yanıtladı", "@answeredTheCall": { "type": "text", @@ -99,11 +79,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Arşivlenmiş Oda", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Misafir kullanıcıların katılmasına izin veriliyor mu", "@areGuestsAllowedToJoin": { "type": "text", @@ -119,21 +94,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Anahtarları önbelleğe almak için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Diğer kişiyi imzalayabilmek için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Lütfen oturumunuzu doğrulamak için güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "{username} kişisinden gelen bu doğrulama isteği kabul edilsin mi?", "@askVerificationRequest": { "type": "text", @@ -141,31 +106,11 @@ "username": {} } }, - "audioPlayerPause": "Duraklat", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Oynat", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Doğrulama", - "@authentication": { - "type": "text", - "placeholders": {} - }, "autoplayImages": "Canlandırmalı çıkartmaları ve ifadeleri otomatik olarak oynat", "@autoplayImages": { "type": "text", "placeholder": {} }, - "avatarHasBeenChanged": "Avatar değiştirildi", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "Ana sunucu aşağıdaki oturum açma türlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca aşağıdakileri destekliyor:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -215,11 +160,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Önbelleğe alınan anahtarlar", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "İptal", "@cancel": { "type": "text", @@ -341,21 +281,11 @@ "username": {} } }, - "changelog": "Değişiklikler", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "Parolayı değiştir", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "Değişiklikler kaydedildi", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Ana sunucuyu değiştir", "@changeTheHomeserver": { "type": "text", @@ -371,16 +301,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Sunucuyu değiştir", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Duvar kağıdını değiştir", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "changeYourAvatar": "Avatarınızı değiştirin", "@changeYourAvatar": { "type": "text", @@ -413,11 +333,6 @@ }, "chatHasBeenAddedToThisSpace": "Sohbet bu alana eklendi", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Sohbet bu alandan kaldırıldı", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chats": "Sohbetler", "@chats": { "type": "text", @@ -428,18 +343,8 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Bir kullanıcı adı seçin", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "Arşivi temizle", "@clearArchive": {}, - "clearText": "Metni temizle", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "Kapat", "@close": { "type": "text", @@ -527,12 +432,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Karşılaştırın ve aşağıdaki emojilerin diğer aygıttaki emojilerle eşleştiğinden emin olun:", + "compareEmojiMatch": "Lütfen emojileri karşılaştırın", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Karşılaştırın ve aşağıdaki numaraların diğer aygıttaki numaralarla eşleştiğinden emin olun:", + "compareNumbersMatch": "Lütfen sayıları karşılaştırın", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -552,11 +457,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Bağlantı denemesi başarısız oldu", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kişi gruba davet edildi", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -577,11 +477,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "İçerik görüntüleyici", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Panoya kopyalandı", "@copiedToClipboard": { "type": "text", @@ -604,16 +499,6 @@ "error": {} } }, - "couldNotSetAvatar": "Avatar ayarlanamadı", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Görünen ad ayarlanamadı", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} katılımcı", "@countParticipants": { "type": "text", @@ -626,38 +511,18 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Şimdi hesap oluştur", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} sohbeti oluşturdu", + "createdTheChat": "💬 {username} sohbeti oluşturdu", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Yeni grup oluştur", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "Yeni alan", "@createNewSpace": { "type": "text", "placeholders": {} }, - "crossSigningDisabled": "Çapraz imzalama kapalı", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Çapraz imzalama açık", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Şu anda etkin", "@currentlyActive": { "type": "text", @@ -698,7 +563,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Öntanımlı izin seviyesi", + "defaultPermissionLevel": "Yeni kullanıcılar içi öntanımlı izin seviyesi", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -718,11 +583,6 @@ "type": "text", "placeholders": {} }, - "deny": "Reddet", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Aygıt", "@device": { "type": "text", @@ -738,46 +598,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Şifreleme yalnızca tüm aygıtlar doğrulandığında güvenlidir.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "Doğrudan Sohbetler", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "Resmi at", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Keşfet", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Grupları keşfet", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Görünen ad değiştirildi", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Bağış", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "İptal et ve bir daha sorma", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Dosyayı indir", "@downloadFile": { "type": "text", @@ -793,21 +623,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Sohbet izinlerini düzenle", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "Görünen adı düzenle", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "Jitsi örneğini düzenle", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "Oda takma adlarını düzenle", "@editRoomAliases": { "type": "text", @@ -853,11 +673,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "Sohbetlerinize erişimi asla kaybetmemek için sohbet yedeklemeyi etkinleştirin.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "İfade paketini küresel olarak etkinleştir", "@enableEmotesGlobally": { "type": "text", @@ -883,21 +698,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Şifreleme algoritması", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Şifreleme etkinleştirilmedi", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Uçtan uca şifreleme ayarları", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} aramayı sonlandırdı", "@endedTheCall": { "type": "text", @@ -905,23 +710,11 @@ "senderName": {} } }, - "enterAGroupName": "Bir grup adı girin", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "Bir e-posta adresi girin", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterASpacepName": "Bir alan adı girin", - "@enterASpacepName": {}, - "enterAUsername": "Bir kullanıcı adı girin", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Ana sunucunuzu girin", "@enterYourHomeserver": { "type": "text", @@ -949,11 +742,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Dosya boyutu", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -969,16 +757,6 @@ "type": "text", "placeholders": {} }, - "friday": "Cuma", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Arkadaşlar", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "Katılmadan", "@fromJoining": { "type": "text", @@ -999,16 +777,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Grup açıklaması", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Grup açıklaması değiştirildi", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Grup herkese açık", "@groupIsPublic": { "type": "text", @@ -1059,11 +827,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Ana sunucu uyumlu değil", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "Bu içerik ne kadar rahatsız edici?", "@howOffensiveIsThisContent": { "type": "text", @@ -1089,16 +852,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "Sizi rahatsız eden kullanıcıları yok sayabilirsiniz. Kişisel yok sayma listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamayacaksınız.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Kullanıcıyı yok say", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Bağlantıya tıkladım", "@iHaveClickedOnLink": { "type": "text", @@ -1114,11 +867,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "Geçersiz e-posta", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "Kişi davet et", "@inviteContact": { "type": "text", @@ -1136,7 +884,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username}, {targetName} kişisini davet etti", + "invitedUser": "📩 {username}, {targetName} kişisini davet etti", "@invitedUser": { "type": "text", "placeholders": { @@ -1154,7 +902,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} sizi FluffyChat'e davet etti. \n1. FluffyChat kurun: https://fluffychat.im \n2. Kaydolun veya giriş yapın \n3. Davet bağlantısını açın: {link}", + "inviteText": "{username} sizi FluffyChat'e davet etti.\n1. fluffychat.im adresini ziyaret edin ve uygulamayı kurun \n2. Kaydolun veya oturum açın \n3. Davet bağlantısını açın: \n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1162,17 +910,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "Aşağıdaki aygıt anahtarı doğru mu?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "yazıyor…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} sohbete katıldı", + "joinedTheChat": "👋 {username} sohbete katıldı", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1184,17 +927,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "Anahtarlar önbelleğe alındı", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Anahtarlar eksik", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}, {targetName} kişisini attı", + "kicked": "👞 {username}, {targetName} kişisini attı", "@kicked": { "type": "text", "placeholders": { @@ -1202,7 +935,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username}, {targetName} kişisini attı ve engelledi", + "kickedAndBanned": "🙅 {username}, {targetName} kişisini attı ve engelledi", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1222,16 +955,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Son görülen IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Uzun zaman önce görüldü", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Ayrıl", "@leave": { "type": "text", @@ -1291,33 +1014,11 @@ "homeserver": {} } }, - "loginWith": "{brand} ile oturum aç", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "Oturumu kapat", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "Moderatör yap", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Yönetici yap", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Tanımlayıcının geçerli olduğundan emin olun", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "Üye değişiklikleri", "@memberChanges": { "type": "text", @@ -1333,28 +1034,11 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "Mesaj tüm katılımcılar için kaldırılacak", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Moderatör", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Pazartesi", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 etkinlik daha} other{{count} etkinlik daha}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "Sohbeti sessize al", "@muteChat": { "type": "text", @@ -1370,7 +1054,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "FluffyChat'te yeni mesaj", + "newMessageInFluffyChat": "💬 FluffyChat'te yeni mesaj", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1395,16 +1079,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat şu anda çapraz imzalamanın etkinleştirilmesini desteklemiyor. Lütfen bunu Element içinden etkinleştirin.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Açıklama yok", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "İfade bulunamadı. 😕", "@noEmotesFound": { "type": "text", @@ -1415,7 +1089,7 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Görünüşe göre telefonunuzda Google hizmetleri yok. Bu, gizliliğiniz için iyi bir karar! FluffyChat'te anlık bildirimler almak için https://microg.org/ veya https://unifiedpush.org/ kullanmanızı tavsiye ediyoruz.", + "noGoogleServicesWarning": "Görünüşe göre cihazınızda Firebase Cloud Messaging yok. Buna rağmen bildirim almaya devam etmek için ntfy yüklemenizi öneriyoruz. ntfy veya başka bir Unified Push sağlayıcısı ile anlık bildirimlerinizi güvenli bir şekilde alabilirsiniz. ntfy'ı PlayStore veya F-Droid'den indirebilirsiniz.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} @@ -1428,11 +1102,6 @@ "server2": {} } }, - "noMegolmBootstrap": "Lütfen bunun yerine Element içinden çevrim içi anahtar yedeklemeyi açın.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Yok", "@none": { "type": "text", @@ -1448,21 +1117,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "Herkese açık oda bulunamadı…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "Oda bulunamadı…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "Şimdiye kadar hiçbir durum bulunamadı.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "Bildirimler", "@notifications": { "type": "text", @@ -1473,18 +1132,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Web'de desteklenmiyor", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seçildi", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} kullanıcı yazıyor…", "@numUsersTyping": { "type": "text", @@ -1517,11 +1164,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Çevrim içi anahtar yedekleme devre dışı bırakıldı", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Çevrim içi anahtar yedekleme etkinleştirildi", "@onlineKeyBackupEnabled": { "type": "text", @@ -1552,16 +1194,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(İsteğe bağlı) E-posta adresiniz", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(İsteğe bağlı) Grup adı", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "Veya", "@or": { "type": "text", @@ -1572,11 +1204,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "Katılan kullanıcı aygıtları", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "parola veya kurtarma anahtarı", "@passphraseOrKey": { "type": "text", @@ -1634,11 +1261,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "Lütfen bir kullanıcı adı seçin", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "Lütfen e-postadaki bağlantıya tıklayın ve devam edin.", "@pleaseClickOnLink": { "type": "text", @@ -1649,16 +1271,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "Lütfen bir Matrix kimliği girin.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Lütfen güvenlik anahtarınızı girin:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Lütfen parolanızı girin", "@pleaseEnterYourPassword": { "type": "text", @@ -1684,26 +1296,11 @@ "type": "text", "placeholders": {} }, - "publicGroups": "Herkese Açık Gruplar", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Ortak Anahtar", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "Herkese Açık Odalar", "@publicRooms": { "type": "text", "placeholders": {} }, - "publicSpace": "Herkese açık alan", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "pushRules": "Gönderme kuralları", "@pushRules": { "type": "text", @@ -1780,11 +1377,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Mesajı kaldır", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "removeYourAvatar": "Avatarınızı kaldırın", "@removeYourAvatar": { "type": "text", @@ -1815,16 +1407,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Eski mesajları okumayı iste", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Tüm izinleri iptal et", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Oda yükseltildi", "@roomHasBeenUpgraded": { "type": "text", @@ -1835,35 +1417,13 @@ "type": "text", "placeholders": {} }, - "saturday": "Cumartesi", - "@saturday": { + "saveFile": "Dosyayı kaydet", + "@saveFile": { "type": "text", "placeholders": {} }, - "savedFileAs": "Dosya {filename} olarak kaydedildi", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Dosyayı kaydet", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Dosyayı bu klasöre kaydet", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Ara", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Sohbet ara", - "@searchForAChat": { + "search": "Ara", + "@search": { "type": "text", "placeholders": {} }, @@ -1872,16 +1432,6 @@ "type": "text", "placeholders": {} }, - "securityKey": "Güvenlik anahtarı", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Güvenlik anahtarı kayıp mı?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "{username} tarafından görüldü", "@seenByUser": { "type": "text", @@ -1889,22 +1439,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{{username} ve {count} diğerleri tarafından görüldü}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username} ve {username2} tarafından görüldü", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Gönder", "@send": { "type": "text", @@ -1924,11 +1458,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "sentry.io ile hata raporları göndermeye izin ver", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "Dosya gönder", "@sendFile": { "type": "text", @@ -1939,7 +1468,7 @@ "type": "text", "placeholders": {} }, - "sendMessages": "Mesaj gönder", + "sendMessages": "Mesajları gönder", "@sendMessages": { "type": "text", "placeholders": {} @@ -1959,35 +1488,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} bir dosya gönderdi", + "sentAFile": "📁 {username} bir dosya gönderdi", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} bir ses gönderdi", + "sentAnAudio": "🎤 {username} bir ses gönderdi", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} bir resim gönderdi", + "sentAPicture": "🖼️ {username} bir resim gönderdi", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} bir çıkartma gönderdi", + "sentASticker": "😊 {username} bir çıkartma gönderdi", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} bir video gönderdi", + "sentAVideo": "🎥 {username} bir video gönderdi", "@sentAVideo": { "type": "text", "placeholders": { @@ -2001,21 +1530,6 @@ "senderName": {} } }, - "sentryInfo": "Gizliliğiniz hakkında bilgiler: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Oturum doğrulandı", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Profil fotoğrafı ayarla", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "Ana takma ad olarak ayarla", "@setAsCanonicalAlias": { "type": "text", @@ -2026,11 +1540,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "Grup açıklaması ayarla", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Davet bağlantısı ayarla", "@setInvitationLink": { "type": "text", @@ -2073,11 +1582,6 @@ "type": "text", "placeholders": {} }, - "signUp": "Hesap oluştur", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "Tek oturum açma", "@singlesignon": { "type": "text", @@ -2088,11 +1592,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Ses, titreşim, LED rengi", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "Kaynak kodları", "@sourceCode": { "type": "text", @@ -2115,11 +1614,6 @@ "senderName": {} } }, - "startYourFirstChat": "Hemen ilk sohbetinize başlayın! 🙂\n- 'Yeni sohbet' düğmesine dokunun\n- Bir arkadaşınızın QR kodunu tarayın\n- Eğlenceli bir şekilde sohbet edin", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "Durum", "@status": { "type": "text", @@ -2135,11 +1629,6 @@ "type": "text", "placeholders": {} }, - "sunday": "Pazar", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "Eşzamanlanıyor… Lütfen bekleyin.", "@synchronizingPleaseWait": { "type": "text", @@ -2150,21 +1639,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Doğrulamak için bir aygıta dokunun", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Resmi göstermek için dokunun", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Menüyü göstermek için dokunun", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Eşleşmediler", "@theyDontMatch": { "type": "text", @@ -2175,26 +1649,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Bu oda arşivlendi.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Perşembe", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2231,11 +1685,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Salı", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "Yok", "@unavailable": { "type": "text", @@ -2271,16 +1720,6 @@ "type": {} } }, - "unknownSessionVerify": "Bilinmeyen oturum, lütfen doğrulayın", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Sohbet yedeklemesinin kilidini aç", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Sohbeti sessizden çıkar", "@unmuteChat": { "type": "text", @@ -2298,18 +1737,6 @@ "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 okunmamış mesaj} other{{unreadEvents} okunmamış mesaj}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED ile uyumlu renkler kullanılsın mı?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} ve {count} diğer kişi yazıyor…", "@userAndOthersAreTyping": { "type": "text", @@ -2333,7 +1760,7 @@ "username": {} } }, - "userLeftTheChat": "{username} sohbetten ayrıldı", + "userLeftTheChat": "🚪 {username} sohbetten ayrıldı", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2345,11 +1772,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Kullanıcı doğrulanmadı", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} bir {type} etkinliği gönderdi", "@userSentUnknownEvent": { "type": "text", @@ -2358,36 +1780,16 @@ "type": {} } }, - "userUnknownVerification": "Kullanıcının bilinmeyen bir doğrulama durumu var", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Kullanıcı doğrulandı", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "Doğrulandı", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "Oturum başarıyla doğrulandı!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Doğrula", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Manuel Olarak Doğrula", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Doğrulamayı Başlat", "@verifyStart": { "type": "text", @@ -2403,11 +1805,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Kullanıcıyı Doğrula", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Görüntülü arama", "@videoCall": { "type": "text", @@ -2448,7 +1845,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Duvar kağıdı", + "wallpaper": "Duvar kağıdı:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2458,21 +1855,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Uçtan uca şifreleme şimdilik Beta aşamasında! Risk alarak kullanın!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Çarşamba", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Matrix ağındaki en şirin anlık mesajlaşma uygulamasına hoş geldiniz.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Size bir e-posta gönderdik", "@weSentYouAnEmail": { "type": "text", @@ -2518,76 +1900,29 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Sohbete davet edildiniz", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Artık bu sohbette katılımcı değilsiniz", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Kendinizi davet edemezsiniz", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Bu sohbetten engellendiniz", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "Sohbetleriniz eşzamanlanıyor…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Kullanıcı adınız", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "Ortak anahtarınız", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "{homeserver} sunucusuna bağlanacaksınız", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Yakınlaştır", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Uzaklaştır", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, "scanQrCode": "QR kodunu tarayın", "@scanQrCode": {}, - "typeInInviteLinkManually": "Davet bağlantısını el ile yazın...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Davet bağlantınızı paylaşın", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Sadece QR kodunu tarayın veya yan yana değilseniz davet bağlantınızı paylaşın.", - "@createNewChatExplaination": {}, "sendOnEnter": "Enter tuşu ile gönder", "@sendOnEnter": {}, "homeserver": "Ana sunucu", "@homeserver": {}, "serverRequiresEmail": "Bu sunucunun kayıt için e-posta adresinizi doğrulaması gerekiyor.", "@serverRequiresEmail": {}, - "newUsernameDescription": "Kullanıcı kimliğiniz @kullanıcıadı:sunucuadı biçiminde olacaktır.", - "@newUsernameDescription": {}, - "newPasswordDescription": "Parolanızı kurtarabilmek için daha sonra hesabınıza bir e-posta adresi eklemelisiniz.", - "@newPasswordDescription": {}, "enableMultiAccounts": "(BETA) Bu aygıtta çoklu hesapları etkinleştir", "@enableMultiAccounts": {}, "bundleName": "Paket adı", @@ -2604,31 +1939,12 @@ "@oneClientLoggedOut": {}, "link": "Bağlantı", "@link": {}, - "setupChatBackup": "Sohbet yedeklemeyi ayarla", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Anahtarı yazdım", - "@iWroteDownTheKey": {}, "yourChatBackupHasBeenSetUp": "Sohbet yedeklemeniz ayarlandı.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Mesajlarınızı korumak için sizin için bir kurtarma anahtarı oluşturduk.\nLütfen bunu parola yöneticisi gibi güvenli bir yerde saklayın.", - "@setupChatBackupDescription": {}, "unverified": "Doğrulanmadı", "@unverified": {}, - "yourUserId": "Kullanıcı kimliğiniz:", - "@yourUserId": {}, "repeatPassword": "Parolayı tekrarlayın", "@repeatPassword": {}, - "passwordsDoNotMatch": "Parolalar eşleşmiyor!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Lütfen geçerli bir e-posta adresi girin.", - "@pleaseEnterValidEmail": {}, - "pleaseChooseAtLeastChars": "Lütfen en az {min} karakter seçin.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageInfo": "Mesaj bilgileri", "@messageInfo": {}, "time": "Zaman", @@ -2643,18 +1959,8 @@ "@removeFromSpace": {}, "addToSpaceDescription": "Bu sohbeti eklemek için bir alan seçin.", "@addToSpaceDescription": {}, - "removeFromSpaceDescription": "Bu, sohbeti geçerli alandan kaldırır. Daha sonra \"Tüm sohbetler\" altında görünmeye devam edecektir.", - "@removeFromSpaceDescription": {}, - "loginWithOneClick": "Tek tıklamayla oturum aç", - "@loginWithOneClick": {}, "start": "Başla", "@start": {}, - "setupChatBackupNow": "Sohbet yedeklemenizi şimdi ayarlayın", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Sohbet yedeklemenizin kilidini açmak için lütfen önceki bir oturumda oluşturulan güvenlik anahtarınızı girin. Güvenlik anahtarınız parolanız DEĞİLDİR.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Güvenlik anahtarını şimdi kaydet", - "@saveTheSecurityKeyNow": {}, "commandHint_clearcache": "Önbelleği temizleyin", "@commandHint_clearcache": { "type": "text", @@ -2680,20 +1986,8 @@ "type": "text", "placeholders": {} }, - "addToStory": "Hikayeye ekle", - "@addToStory": {}, "publish": "Yayınla", "@publish": {}, - "whoCanSeeMyStories": "Hikayelerimi kimler görebilir?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Hikayelerin aboneliğini iptal et", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Bu kullanıcı henüz hikayesinde hiçbir şey yayınlamadı", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Senin hikayen", - "@yourStory": {}, - "replyHasBeenSent": "Yanıt gönderildi", - "@replyHasBeenSent": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "text", @@ -2701,29 +1995,6 @@ "size": {} } }, - "storyFrom": "{date} tarihinden hikaye: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "İnsanların hikayenizde birbirlerini görebileceğini ve iletişim kurabileceğini lütfen unutmayın.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Ne oluyor?", - "@whatIsGoingOn": {}, - "addDescription": "Açıklama ekle", - "@addDescription": {}, - "bubbleSize": "Baloncuk boyutu", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Anladım", - "@iUnderstand": {}, - "storyPrivacyWarning": "İnsanların hikayenizde birbirlerini görebileceğini ve iletişim kurabileceğini lütfen unutmayın. Hikayeleriniz 24 saat boyunca görünür olacaktır ancak tüm aygıtlardan ve sunuculardan silineceklerinin garantisi yoktur.", - "@storyPrivacyWarning": {}, "dismiss": "Kapat", "@dismiss": {}, "markAsRead": "Okundu olarak işaretle", @@ -2732,12 +2003,6 @@ "@reportUser": {}, "openChat": "Sohbeti Aç", "@openChat": {}, - "matrixWidgets": "Matrix Widget'ları", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Widget'lar ve bütünleşmeler henüz düzenlenemiyor.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Widget'ları ve bütünleşmeleri düzenle", - "@editIntegrations": {}, "reactedWith": "{sender}, {reaction} ile tepki verdi", "@reactedWith": { "type": "text", @@ -2758,8 +2023,6 @@ "@unsupportedAndroidVersionLong": {}, "pinMessage": "Odaya sabitle", "@pinMessage": {}, - "pinnedEventsError": "Sabitlenmiş mesajlar yüklenirken hata oluştu", - "@pinnedEventsError": {}, "confirmEventUnpin": "Etkinliğin sabitlemesini kalıcı olarak kaldırmak istediğinizden emin misiniz?", "@confirmEventUnpin": {}, "videoCallsBetaWarning": "Görüntülü aramaların şu anda beta aşamasında olduğunu lütfen unutmayın. Tüm platformlarda beklendiği gibi veya hiç çalışmayabilirler.", @@ -2789,8 +2052,6 @@ "@widgetNameError": {}, "errorAddingWidget": "Widget eklenirken hata oluştu.", "@errorAddingWidget": {}, - "editWidgets": "Widget'ları düzenle", - "@editWidgets": {}, "widgetVideo": "Video", "@widgetVideo": {}, "addWidget": "Widget ekle", @@ -2799,21 +2060,16 @@ "@widgetEtherpad": {}, "widgetName": "Ad", "@widgetName": {}, - "separateChatTypes": "Doğrudan Sohbetleri, Grupları ve Alanları Ayır", + "separateChatTypes": "Doğrudan Sohbetleri ve Grupları Ayır", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Alanlarda ilgili Doğrudan Sohbetleri göster", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "youJoinedTheChat": "Sohbete katıldınız", "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Daveti kabul ettiniz", + "youAcceptedTheInvitation": "👍 Daveti kabul ettiniz", "@youAcceptedTheInvitation": {}, - "youKickedAndBanned": "{user} kullanıcısını attınız ve yasakladınız", + "youKickedAndBanned": "🙅 {user} kullanıcısını attınız ve yasakladınız", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2825,7 +2081,7 @@ "user": {} } }, - "youKicked": "{user} kullanıcısını attınız", + "youKicked": "👞 {user} kullanıcısını attınız", "@youKicked": { "placeholders": { "user": {} @@ -2839,13 +2095,13 @@ "user": {} } }, - "youInvitedBy": "{user} tarafından davet edildiniz", + "youInvitedBy": "📩 {user} tarafından davet edildiniz", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "{user} kullanıcısını davet ettiniz", + "youInvitedUser": "📩 {user} kullanıcısını davet ettiniz", "@youInvitedUser": { "placeholders": { "user": {} @@ -2857,10 +2113,6 @@ "user": {} } }, - "showSpaces": "Alanlar listesini göster", - "@showSpaces": {}, - "noEmailWarning": "Lütfen geçerli bir e-posta adresi girin. Aksi takdirde parolanızı sıfırlayamazsınız. İstemiyorsanız, devam etmek için düğmeye tekrar dokunun.", - "@noEmailWarning": {}, "storeInAppleKeyChain": "Apple KeyChain'de sakla", "@storeInAppleKeyChain": {}, "pleaseEnterRecoveryKey": "Lütfen kurtarma anahtarınızı girin:", @@ -2873,14 +2125,8 @@ "@users": {}, "storeInSecureStorageDescription": "Kurtarma anahtarını bu aygıtın güvenli deposunda saklayın.", "@storeInSecureStorageDescription": {}, - "enableAutoBackups": "Otomatik yedeklemeleri etkinleştir", - "@enableAutoBackups": {}, "recoveryKey": "Kurtarma anahtarı", "@recoveryKey": {}, - "saveTheRecoveryKeyNow": "Kurtarma anahtarını şimdi kaydet", - "@saveTheRecoveryKeyNow": {}, - "stories": "Hikayeler", - "@stories": {}, "storeInAndroidKeystore": "Android KeyStore'da sakla", "@storeInAndroidKeystore": {}, "unlockOldMessages": "Eski mesajların kilidini aç", @@ -2888,5 +2134,703 @@ "saveKeyManuallyDescription": "Sistem paylaşımı iletişim kutusunu veya panoyu tetikleyerek bu anahtarı elle kaydedin.", "@saveKeyManuallyDescription": {}, "storeSecurlyOnThisDevice": "Bu aygıtta güvenli bir şekilde sakla", - "@storeSecurlyOnThisDevice": {} + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} dosya", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "dehydrate": "Oturumu dışa aktar ve aygıtı sil", + "@dehydrate": {}, + "dehydrateTorLong": "TOR kullanıcıları için, pencereyi kapatmadan önce oturumu dışa aktarmaları tavsiye edilir.", + "@dehydrateTorLong": {}, + "dehydrateTor": "TOR Kullanıcıları: Oturumu dışa aktar", + "@dehydrateTor": {}, + "hydrateTor": "TOR Kullanıcıları: Dışa aktarılan oturumu içe aktar", + "@hydrateTor": {}, + "hydrate": "Yedekleme dosyasından geri yükle", + "@hydrate": {}, + "indexedDbErrorTitle": "Gizli mod sorunları", + "@indexedDbErrorTitle": {}, + "dehydrateWarning": "Bu eylem geri alınamaz. Yedekleme dosyasını güvenli bir şekilde sakladığınızdan emin olun.", + "@dehydrateWarning": {}, + "hydrateTorLong": "TOR'da en son oturumunuzu dışa aktardınız mı? Hızlıca içe aktarın ve sohbete devam edin.", + "@hydrateTorLong": {}, + "indexedDbErrorLong": "Mesaj saklama özelliği ne yazık ki öntanımlı olarak gizli modda etkin değildir.\nLütfen\n - about:config sayfasına gidin ve\n - dom.indexedDB.privateBrowsing.enabled seçeneğini true olarak ayarlayın\nAksi takdirde FluffyChat çalıştırılamaz.", + "@indexedDbErrorLong": {}, + "user": "Kullanıcı", + "@user": {}, + "custom": "Özel", + "@custom": {}, + "confirmMatrixId": "Hesabınızı silmek için lütfen Matrix kimliğinizi doğrulayın.", + "@confirmMatrixId": {}, + "supposedMxid": "Bu {mxid} olmalıdır", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasgroup": "Grup olarak işaretle", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "Verilen Matrix kimliği için doğrudan mesaj odası olarak işaretle", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "Bu mesaj neden okunamıyor?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Bu durum, mesaj siz bu aygıtta hesabınızda oturum açmadan önce gönderildiyse meydana gelebilir.\n\nGönderenin aygıtınızı engellemiş olması veya internet bağlantısında bir sorun olması da mümkündür.\n\nMesajı başka bir oturumda okuyabiliyor musunuz? O zaman mesajı oradan aktarabilirsiniz! Ayarlar > Aygıtlar bölümüne gidin ve aygıtlarınızın birbirini doğruladığından emin olun. Odayı bir sonraki sefer açtığınızda ve her iki oturum da ön planda olduğunda, anahtarlar otomatik olarak iletilecektir.\n\nOturumu kapatırken veya aygıt değiştirirken anahtarları kaybetmek istemiyor musunuz? Ayarlarda sohbet yedeklemesini etkinleştirdiğinizden emin olun.", + "@noKeyForThisMessage": {}, + "screenSharingTitle": "ekran paylaşımı", + "@screenSharingTitle": {}, + "callingPermissions": "Arama izinleri", + "@callingPermissions": {}, + "callingAccountDetails": "FluffyChat'in yerel android telefon uygulamasını kullanmasına izin verir.", + "@callingAccountDetails": {}, + "appearOnTop": "Üstte görün", + "@appearOnTop": {}, + "enterSpace": "Alana gir", + "@enterSpace": {}, + "enterRoom": "Odaya gir", + "@enterRoom": {}, + "allSpaces": "Tüm alanlar", + "@allSpaces": {}, + "otherCallingPermissions": "Mikrofon, kamera ve diğer FluffyChat izinleri", + "@otherCallingPermissions": {}, + "foregroundServiceRunning": "Bu bildirim, ön plan hizmeti çalışırken görünür.", + "@foregroundServiceRunning": {}, + "callingAccount": "Arama hesabı", + "@callingAccount": {}, + "appearOnTopDetails": "Uygulamanın üstte görünmesine izin verir (Fluffychat'ı zaten bir arama hesabı olarak ayarladıysanız gerekli değildir)", + "@appearOnTopDetails": {}, + "newGroup": "Yeni grup", + "@newGroup": {}, + "newSpace": "Yeni alan", + "@newSpace": {}, + "screenSharingDetail": "Ekranınızı FuffyChat'te paylaşıyorsunuz", + "@screenSharingDetail": {}, + "numChats": "{number} sohbet", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Önemsiz durum etkinliklerini gizle", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Tekrar gösterme", + "@doNotShowAgain": {}, + "googlyEyesContent": "{senderName} size şaşkın gözler gönderiyor", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_cuddle": "Kucaklama gönder", + "@commandHint_cuddle": {}, + "commandHint_googly": "Şaşkın gözler gönder", + "@commandHint_googly": {}, + "commandHint_hug": "Sarılma gönder", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} sizi kucaklıyor", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} size sarılıyor", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "wasDirectChatDisplayName": "Boş sohbet ({oldDisplayName} idi)", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "startFirstChat": "İlk sohbetinizi başlatın", + "@startFirstChat": {}, + "newSpaceDescription": "Alanlar, sohbetlerinizi birleştirmenize ve özel veya genel topluluklar oluşturmanıza olanak tanır.", + "@newSpaceDescription": {}, + "encryptThisChat": "Bu sohbeti şifrele", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Güvenlik nedeniyle, daha önce etkinleştirildiği bir sohbette şifrelemeyi devre dışı bırakamazsınız.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Üzgünüm... bu mümkün değil", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Aygıt anahtarları:", + "@deviceKeys": {}, + "reopenChat": "Sohbeti yeniden aç", + "@reopenChat": {}, + "noBackupWarning": "Uyarı! Sohbet yedeklemesini etkinleştirmezseniz, şifrelenen mesajlarınıza erişiminizi kaybedersiniz. Oturumu kapatmadan önce sohbet yedeklemesini etkinleştirmeniz önemle tavsiye edilir.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Başka aygıt bulunamadı", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Gönderilemiyor! Sunucu yalnızca {max} değerine kadar olan ekleri destekliyor.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Dosya {path} konumuna kaydedildi", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Son okunan mesaja atla", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Buraya kadar oku", + "@readUpToHere": {}, + "jump": "Atla", + "@jump": {}, + "openLinkInBrowser": "Bağlantıyı tarayıcıda aç", + "@openLinkInBrowser": {}, + "allRooms": "Tüm Grup Sohbetleri", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "😭 Olamaz. Bir şeyler yanlış gitti. İsterseniz bu hatayı geliştiricilere bildirebilirsiniz.", + "@reportErrorDescription": {}, + "report": "bildir", + "@report": {}, + "signInWithPassword": "Parola ile oturum aç", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Lütfen daha sonra tekrar deneyin veya farklı bir sunucu seçin.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "{provider} ile oturum aç", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Bir resim dosyası değil.", + "@notAnImage": {}, + "importNow": "Şimdi içe aktar", + "@importNow": {}, + "importEmojis": "İfadeleri İçe Aktar", + "@importEmojis": {}, + "importFromZipFile": ".zip dosyasından içe aktar", + "@importFromZipFile": {}, + "exportEmotePack": "İfade paketini .zip olarak dışa aktar", + "@exportEmotePack": {}, + "replace": "Değiştir", + "@replace": {}, + "sendTypingNotifications": "Yazma bildirimleri gönder", + "@sendTypingNotifications": {}, + "messagesStyle": "Mesajlar:", + "@messagesStyle": {}, + "createGroup": "Grup oluştur", + "@createGroup": {}, + "shareInviteLink": "Davet bağlantısını paylaş", + "@shareInviteLink": {}, + "profileNotFound": "Kullanıcı sunucuda bulunamadı. Belki bir bağlantı sorunu vardır veya kullanıcı mevcut değildir.", + "@profileNotFound": {}, + "setTheme": "Temayı ayarla:", + "@setTheme": {}, + "setColorTheme": "Renk temasını ayarla:", + "@setColorTheme": {}, + "inviteContactToGroupQuestion": "{contact} kişisini \"{groupName}\" sohbetine davet etmek istiyor musunuz?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Tekrar deneyin", + "@tryAgain": {}, + "redactMessageDescription": "Bu mesaj bu görüşmedeki herkes için düzenlenecek. Bu işlem geri alınamaz.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(İsteğe bağlı) Bu mesajı düzenleme nedeni…", + "@optionalRedactReason": {}, + "invite": "Davet et", + "@invite": {}, + "addChatDescription": "Sohbet açıklaması ekle...", + "@addChatDescription": {}, + "chatPermissions": "Sohbet izinleri", + "@chatPermissions": {}, + "chatDescription": "Sohbet açıklaması", + "@chatDescription": {}, + "noChatDescriptionYet": "Daha sohbet açıklaması oluşturulmadı.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Geçersiz sunucu adı", + "@invalidServerName": {}, + "redactedBy": "{username} tarafından düzenlendi", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "redactedByBecause": "{username} tarafından \"{reason}\" nedeniyle düzenlendi", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "setChatDescription": "Sohbet açıklamasını ayarla", + "@setChatDescription": {}, + "chatDescriptionHasBeenChanged": "Sohbet açıklaması değişti", + "@chatDescriptionHasBeenChanged": {}, + "directChat": "Doğrudan sohbet", + "@directChat": {}, + "inviteGroupChat": "📨 Grup sohbetine davet et", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Gizli sohbete davet et", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Son kullanılan ifadeler burada görünecek...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "Geçersiz giriş!", + "@invalidInput": {}, + "wrongPinEntered": "Yanlış PIN girildi! {seconds} saniye sonra tekrar deneyin...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "banUserDescription": "Kullanıcı sohbetten yasaklanacak ve yasağı kaldırılana kadar sohbete tekrar giremeyecek.", + "@banUserDescription": {}, + "removeDevicesDescription": "Bu aygıttan çıkış yapacaksınız ve artık mesaj alamayacaksınız.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Kullanıcı denerse sohbete tekrar girebilecektir.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Anlık bildirimler kullanılamıyor", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Bu kullanıcıyı yönetici yaptıktan sonra, sizinle aynı izinlere sahip olacağı için bunu geri alamayabilirsiniz.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Sohbet arşive taşınacak. Diğer kullanıcıları sohbeti terk ettiğinizi görebilecek.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} tıklattı", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Daha fazla bilgi", + "@learnMore": {}, + "roomUpgradeDescription": "Sohbet daha sonra yeni oda sürümüyle yeniden oluşturulacaktır. Tüm katılımcılara yeni sohbete geçmeleri gerektiği bildirilecektir. Oda sürümleri hakkında daha fazla bilgiyi https://spec.matrix.org/latest/rooms/ adresinde bulabilirsiniz.", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Lütfen 0'dan büyük bir sayı girin", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Kullanıcı sohbetten atılır ancak yasaklanmaz. Herkese açık sohbetlerde kullanıcı istediği zaman yeniden katılabilir.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "Bir grup oluşturun ve kullanıcıları davet edin", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Grup, arama ile bulunabilir", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Ne yazık ki \"{query}\" ile kullanıcı bulunamadı. Lütfen bir yazım hatası yapıp yapmadığınızı kontrol edin.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "yourGlobalUserIdIs": "Genel kullanıcı kimliğiniz: ", + "@yourGlobalUserIdIs": {}, + "groupName": "Grup ismi", + "@groupName": {}, + "searchChatsRooms": "#sohbetler, @kullanıcılar... için arama yapın", + "@searchChatsRooms": {}, + "blockListDescription": "Sizi rahatsız eden kullanıcıları engelleyebilirsiniz. Kişisel engelleme listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamazsınız.", + "@blockListDescription": {}, + "startConversation": "Görüşme başlat", + "@startConversation": {}, + "blockedUsers": "Engellenen kullanıcılar", + "@blockedUsers": {}, + "block": "Engelle", + "@block": {}, + "commandHint_sendraw": "Ham JSON gönder", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Üzgünüm... bu doğru kurtarma anahtarı gibi görünmüyor.", + "@wrongRecoveryKey": {}, + "blockUsername": "Kullanıcı adını görmezden gel", + "@blockUsername": {}, + "databaseMigrationTitle": "Veri tabanı iyileştirildi", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Lütfen bekleyin. Bu biraz zaman alabilir.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "📩 Bağlantı aracılığıyla davet edildiniz:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "pleaseEnterYourCurrentPassword": "Lütfen geçerli parolanızı girin", + "@pleaseEnterYourCurrentPassword": {}, + "pleaseChooseAStrongPassword": "Lütfen güçlü bir parola seçin", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Sohbet veya alt alan ekle", + "@addChatOrSubSpace": {}, + "canceledKeyVerification": "{sender} anahtar doğrulamayı iptal etti", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "publicLink": "Herkese açık bağlantı", + "@publicLink": {}, + "joinSpace": "Alana katıl", + "@joinSpace": {}, + "newPassword": "Yeni parola", + "@newPassword": {}, + "databaseBuildErrorBody": "SQlite veri tabanı oluşturulamadı. Uygulama şimdilik eski veri tabanını kullanmaya çalışıyor. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sessionLostBody": "Oturumunuz kayboldu. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "subspace": "Alt alan", + "@subspace": {}, + "thisDevice": "Bu aygıt:", + "@thisDevice": {}, + "formattedMessagesDescription": "Markdown kullanarak kalın metin gibi zengin mesaj içeriğini görüntüle.", + "@formattedMessagesDescription": {}, + "verifyOtherDevice": "🔐 Diğer aygıtı doğrula", + "@verifyOtherDevice": {}, + "presencesToggle": "Diğer kullanıcıların durum mesajlarını göster", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "presenceStyle": "Bulunma:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "searchForUsers": "@kullanıcıları ara...", + "@searchForUsers": {}, + "commandHint_ignore": "Verilen matrix kimliğini görmezden gel", + "@commandHint_ignore": {}, + "commandHint_unignore": "Verilen matrix kimliğini görmezden gelmeyi iptal et", + "@commandHint_unignore": {}, + "appLockDescription": "Kullanılmadığında PIN kodu ile uygulamayı kilitle", + "@appLockDescription": {}, + "globalChatId": "Genel sohbet kimliği", + "@globalChatId": {}, + "accessAndVisibility": "Erişim ve görünürlük", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Bu sohbete kimlerin katılmasına izin verilir ve sohbet nasıl keşfedilebilir.", + "@accessAndVisibilityDescription": {}, + "calls": "Aramalar", + "@calls": {}, + "customEmojisAndStickers": "Özel emojiler ve çıkartmalar", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Herhangi bir sohbette kullanılabilecek özel emojiler veya çıkartmalar ekleyin veya paylaşın.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Düzenlenen mesajları gizle", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Birisi bir mesajı düzenlerse, bu mesaj artık sohbette görünmeyecektir.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Herkese açık sohbetlerde üye değişikliklerini gizle", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Okunabilirliği artırmak için birisi herkese açık bir sohbete katıldığında veya sohbetten ayrıldığında sohbet zaman çizelgesinde gösterme.", + "@hideMemberChangesInPublicChatsBody": {}, + "passwordRecoverySettings": "Parola kurtarma ayarları", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} sohbete katılmak istiyor.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Henüz herkese açık bir bağlantı oluşturulmadı", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Tıklat", + "@knock": {}, + "knocking": "Tıklat", + "@knocking": {}, + "usersMustKnock": "Kullanıcılar tıklatmalı", + "@usersMustKnock": {}, + "noOneCanJoin": "Kimse katılamaz", + "@noOneCanJoin": {}, + "nothingFound": "Hiçbir şey bulunamadı...", + "@nothingFound": {}, + "sendReadReceiptsDescription": "Sohbetteki diğer katılımcılar bir mesajı okuduğunuzu görebilir.", + "@sendReadReceiptsDescription": {}, + "verifyOtherDeviceDescription": "Başka bir aygıtı doğruladığınızda, bu aygıtlar anahtarları değiş tokuş ederek genel güvenliğinizi artırır. 💪 Bir doğrulama başlattığınızda, her iki aygıttaki uygulamada bir açılır pencere görünecektir. Orada birbirleriyle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz. Doğrulamaya başlamadan önce her iki aygıtın da elinizin altında olması en iyisidir. 🤳", + "@verifyOtherDeviceDescription": {}, + "noDatabaseEncryption": "Veri tabanı şifrelemesi bu platformda desteklenmiyor", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Şu anda {count} engellenen kullanıcı var.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "publicSpaces": "Herkese açık alanlar", + "@publicSpaces": {}, + "initAppError": "Uygulama başlatılırken bir hata oluştu", + "@initAppError": {}, + "userRole": "Kullanıcı rolü", + "@userRole": {}, + "hideInvalidOrUnknownMessageFormats": "Geçersiz veya bilinmeyen mesaj biçimlerini gizle", + "@hideInvalidOrUnknownMessageFormats": {}, + "hidePresences": "Durum listesi gizlensin mi?", + "@hidePresences": {}, + "overview": "Genel görünüm", + "@overview": {}, + "decline": "Reddet", + "@decline": {}, + "notifyMeFor": "Beni bilgilendir", + "@notifyMeFor": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Sohbet {server} üzerinde aranarak keşfedilebilir", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "leaveEmptyToClearStatus": "Durumunuzu temizlemek için boş bırakın.", + "@leaveEmptyToClearStatus": {}, + "select": "Seç", + "@select": {}, + "minimumPowerLevel": "{level} en düşük güç seviyesidir.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "passwordsDoNotMatch": "Parolalar eşleşmiyor", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Girdiğiniz parola yanlış", + "@passwordIsWrong": {}, + "publicChatAddresses": "Herkese açık sohbet adresleri", + "@publicChatAddresses": {}, + "createNewAddress": "Yeni adres oluştur", + "@createNewAddress": {}, + "forwardMessageTo": "Mesajlar {roomName} kişisine iletilsin mi?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "acceptedKeyVerification": "{sender} anahtar doğrulamayı kabul etti", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "restoreSessionBody": "Uygulama şimdi oturumunuzu yedekten geri yüklemeye çalışıyor. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendReadReceipts": "Okundu bilgisi gönder", + "@sendReadReceipts": {}, + "completedKeyVerification": "{sender} anahtar doğrulamayı tamamladı", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "sendTypingNotificationsDescription": "Sohbetteki diğer katılımcılar yeni bir mesaj yazdığınızı görebilir.", + "@sendTypingNotificationsDescription": {}, + "isReadyForKeyVerification": "{sender} anahtar doğrulama için hazır", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "formattedMessages": "Biçimlendirilen mesajlar", + "@formattedMessages": {}, + "requestedKeyVerification": "{sender} anahtar doğrulama istedi", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "verifyOtherUser": "🔐 Diğer kullanıcıyı doğrula", + "@verifyOtherUser": {}, + "startedKeyVerification": "{sender} anahtar doğrulama başlattı", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Şeffaf", + "@transparent": {}, + "discover": "Keşfet", + "@discover": {}, + "incomingMessages": "Gelen mesajlar", + "@incomingMessages": {}, + "verifyOtherUserDescription": "Başka bir kullanıcıyı doğrularsanız, gerçekten kime yazdığınızı bildiğinizden emin olabilirsiniz. 💪\n\nBir doğrulama başlattığınızda, siz ve diğer kullanıcı uygulamada bir açılır pencere görecektir. Orada birbirinizle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz.\n\nBunu yapmanın en iyi yolu buluşmak veya bir görüntülü arama başlatmaktır. 👭", + "@verifyOtherUserDescription": {}, + "stickers": "Çıkartmalar", + "@stickers": {}, + "unreadChatsInApp": "{appname}: {unread} okunmayan sohbet", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "searchIn": "\"{chat}\" sohbeti içinde ara...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "Daha fazla ara...", + "@searchMore": {}, + "gallery": "Galeri", + "@gallery": {}, + "files": "Dosyalar", + "@files": {}, + "knockRestricted": "Tıklatma kısıtlı", + "@knockRestricted": {}, + "restricted": "Kısıtlı", + "@restricted": {}, + "swipeRightToLeftToReply": "Yanıtlamak için sağdan sola kaydır", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "countChatsAndCountParticipants": "{chats} sohbet ve {participants} katılımcı", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Başka sohbet bulunamadı...", + "@noMoreChatsFound": {}, + "goToSpace": "Alana git: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "joinedChats": "Katılınan sohbetler", + "@joinedChats": {}, + "unread": "Okunmadı", + "@unread": {}, + "markAsUnread": "Okunmadı olarak işaretle", + "@markAsUnread": {}, + "space": "Alan", + "@space": {}, + "spaces": "Alanlar", + "@spaces": {}, + "inviteOtherUsers": "Diğer kullanıcıları bu sohbete davet et", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Sohbet izinlerini değiştir", + "@changeTheChatPermissions": {}, + "changeTheCanonicalRoomAlias": "Ana herkese açık sohbet adresini değiştir", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "@oda bildirimleri gönder", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Sohbetin açıklamasını değiştir", + "@changeTheDescriptionOfTheGroup": {}, + "userLevel": "{level} - Kullanıcı", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - Moderatör", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Yönetici", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Genel sohbet ayarlarını değiştir", + "@changeGeneralChatSettings": {}, + "changeTheVisibilityOfChatHistory": "Sohbet geçmişinin görünürlüğünü değiştir", + "@changeTheVisibilityOfChatHistory": {}, + "invitedBy": "📩 {user} davet etti", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "chatPermissionsDescription": "Bu sohbette belirli eylemler için hangi güç düzeyinin gerekli olduğunu tanımlayın. 0, 50 ve 100 güç düzeyleri genellikle kullanıcıları, moderatörleri ve yöneticileri temsil eder, ancak herhangi bir derecelendirme mümkündür.", + "@chatPermissionsDescription": {}, + "changelog": "Değişiklik günlüğü", + "@changelog": {}, + "updateInstalled": "🎉 Güncelleme {version} kuruldu!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "sendCanceled": "Gönderme iptal edildi", + "@sendCanceled": {}, + "noChatsFoundHere": "Burada henüz sohbet bulunamadı. Aşağıdaki düğmeyi kullanarak biriyle yeni bir sohbet başlatın. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "Matrix kimliği ile oturum aç", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Ana sunucuları keşfet", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Ana sunucu nedir?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Tüm verileriniz tıpkı bir e-posta sağlayıcısı gibi ana sunucuda saklanır. Hangi ana sunucuyu kullanmak istediğinizi seçebilir ve herkesle iletişim kurmaya devam edebilirsiniz. https://matrix.org adresinden daha fazla bilgi edinin.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Uyumlu bir ana sunucu gibi görünmüyor. Yanlış URL mi?", + "@doesNotSeemToBeAValidHomeserver": {}, + "prepareSendingAttachment": "Ek gönderilmeye hazırlanıyor...", + "@prepareSendingAttachment": {}, + "serverLimitReached": "Sunucu sınırına ulaşıldı! {seconds} saniye bekleniyor...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "calculatingFileSize": "Dosya boyutu hesaplanıyor...", + "@calculatingFileSize": {}, + "sendingAttachmentCountOfCount": "Ek {index} / {length} gönderiliyor...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "sendingAttachment": "Ek gönderiliyor...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Video küçük resmi oluşturuluyor...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Video sıkıştırılıyor...", + "@compressVideo": {}, + "oneOfYourDevicesIsNotVerified": "Aygıtlarınızdan biri doğrulanmadı", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Not: Tüm aygıtlarınızı sohbet yedeklemesine bağladığınızda, otomatik olarak doğrulanırlar.", + "@noticeChatBackupDeviceVerification": {} } diff --git a/assets/l10n/intl_uk.arb b/assets/l10n/intl_uk.arb index 35b53f8104..23720d2635 100644 --- a/assets/l10n/intl_uk.arb +++ b/assets/l10n/intl_uk.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} приймає запрошення", + "acceptedTheInvitation": "👍 {username} приймає запрошення", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,23 +23,13 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Інформація про обліковий запис", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} активує наскрізне шифрування", + "activatedEndToEndEncryption": "🔐 {username} активує наскрізне шифрування", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { "username": {} } }, - "addGroupDescription": "Додати опис групи", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Адміністратор", "@admin": { "type": "text", @@ -50,11 +40,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Уже маєте обліковий запис?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} відповідає на виклик", "@answeredTheCall": { "type": "text", @@ -72,11 +57,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Заархівована кімната", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Чи дозволено гостям приєднуватись", "@areGuestsAllowedToJoin": { "type": "text", @@ -87,21 +67,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Введіть свою парольну фразу або ключ відновлення для кешування ключів.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "Для підпису ключа іншого користувача введіть свою парольну фразу або ключ відновлення.", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "Введіть свою парольну фразу або ключ відновлення для підтвердження сеансу.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, "askVerificationRequest": "Прийняти цей запит на підтвердження від {username}?", "@askVerificationRequest": { "type": "text", @@ -109,16 +79,6 @@ "username": {} } }, - "authentication": "Автентифікація", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Аватар змінено", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "banFromChat": "Заблокувати в бесіді", "@banFromChat": { "type": "text", @@ -142,11 +102,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Ключі кешовано", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "Скасувати", "@cancel": { "type": "text", @@ -256,11 +211,6 @@ "username": {} } }, - "changelog": "Журнал змін", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "Змінити домашній сервер", "@changeTheHomeserver": { "type": "text", @@ -276,16 +226,6 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "Змінити сервер", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Змінити тло", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "Шифрування було пошкоджено", "@channelCorruptedDecryptError": { "type": "text", @@ -306,22 +246,17 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Виберіть ім'я користувача", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "close": "Закрити", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "Порівняйте і переконайтесь, що показані емодзі збігаються емодзі на іншому пристрої:", + "compareEmojiMatch": "Порівняйте емодзі", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "Порівняйте і переконайтесь, що вказані числа збігаються з числами на іншому пристрої:", + "compareNumbersMatch": "Порівняйте цифри", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -336,21 +271,11 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Не вдалося під'єднатися", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Контакт був запрошений в групу", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "contentViewer": "Переглядач вмісту", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "Скопійовано в буфер обміну", "@copiedToClipboard": { "type": "text", @@ -368,16 +293,6 @@ "error": {} } }, - "couldNotSetAvatar": "Помилка встановлення аватара", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Помилка встановлення показуваного імені", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "Учасників: {count}", "@countParticipants": { "type": "text", @@ -390,33 +305,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "Створити обліковий запис зараз", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} створює бесіду", + "createdTheChat": "💬 {username} створює бесіду", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "Створити нову групу", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Перехресне підписування вимкнено", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Перехресне підписування увімкнено", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "Зараз у мережі", "@currentlyActive": { "type": "text", @@ -462,11 +357,6 @@ "type": "text", "placeholders": {} }, - "deny": "Відхилити", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "Пристрій", "@device": { "type": "text", @@ -477,21 +367,11 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Видалити зображення", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "Показуване ім'я було змінено", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "Підтримати", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "Завантажити файл", "@downloadFile": { "type": "text", @@ -502,11 +382,6 @@ "type": "text", "placeholders": {} }, - "editJitsiInstance": "Редагувати сервер Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "emoteExists": "Емодзі вже існує!", "@emoteExists": { "type": "text", @@ -547,21 +422,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "Алгоритм шифрування", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "Шифрування вимкнено", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "Налаштування наскрізного шифрування", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} завершує виклик", "@endedTheCall": { "type": "text", @@ -569,16 +434,6 @@ "senderName": {} } }, - "enterAGroupName": "Введіть назву групи", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Введіть ім'я користувача", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "Введіть адресу домашнього сервера", "@enterYourHomeserver": { "type": "text", @@ -589,11 +444,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "Розмір файлу", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -604,11 +454,6 @@ "type": "text", "placeholders": {} }, - "friday": "П'ятниця", - "@friday": { - "type": "text", - "placeholders": {} - }, "fromJoining": "З моменту приєднання", "@fromJoining": { "type": "text", @@ -624,16 +469,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "Опис групи", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Опис групи було змінено", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "Загальнодоступна група", "@groupIsPublic": { "type": "text", @@ -669,11 +504,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "Домашній сервер не сумісний", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "id": "ID", "@id": { "type": "text", @@ -706,7 +536,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} запрошує {targetName}", + "invitedUser": "📩 {username} запрошує {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -719,7 +549,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username} запрошує вас у FluffyChat. \n1. Установіть FluffyChat: http://fluffychat.im \n2. Зареєструйтесь або увійдіть \n3. Відкрийте запрошувальне посилання: {link}", + "inviteText": "{username} запрошує вас у FluffyChat. \n1. Перейдіть на fluffychat.im й установіть застосунок \n2. Зареєструйтесь або ввійдіть \n3. Відкрийте запрошувальне посилання:\n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -727,34 +557,19 @@ "link": {} } }, - "isDeviceKeyCorrect": "Чи правильний цей ключ пристрою?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "пише…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} приєднується до бесіди", + "joinedTheChat": "👋 {username} приєднується до бесіди", "@joinedTheChat": { "type": "text", "placeholders": { "username": {} } }, - "keysCached": "Ключі кешовано", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Немає ключів", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} вилучає {targetName}", + "kicked": "👞 {username} вилучає {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -762,7 +577,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} вилучає та блокує {targetName}", + "kickedAndBanned": "🙅 {username} вилучає та блокує {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -782,16 +597,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "Остання IP-адреса входу", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Давно не було в мережі", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "Вийти", "@leave": { "type": "text", @@ -846,36 +651,11 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "Призначити модератором", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Призначити адміністратором", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Переконайтеся, що ідентифікатор дійсний", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Повідомлення буде вилучено для всіх учасників", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "Модератор", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "Понеділок", - "@monday": { - "type": "text", - "placeholders": {} - }, "muteChat": "Вимкнути сповіщення", "@muteChat": { "type": "text", @@ -886,7 +666,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "Нове повідомлення у FluffyChat", + "newMessageInFluffyChat": "💬 Нове повідомлення у FluffyChat", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -896,26 +676,16 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat зараз не підтримує увімкнення перехресного підписування. Увімкніть його з Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "Емоджі не знайдено. 😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "Схоже, на вашому телефоні немає служб Google. Це гарне рішення для вашої приватності! Щоб отримувати push-сповіщення у FluffyChat, ми радимо використовувати https://microg.org/ або https://unifiedpush.org/.", + "noGoogleServicesWarning": "Схоже, Firebase Cloud Messaging недоступна на вашому пристрої. Щоб отримувати push-сповіщення, радимо встановити ntfy. За допомогою ntfy або іншого постачальника Unified Push ви можете отримувати push-сповіщення у безпечний спосіб. Ви можете завантажити ntfy з PlayStore або з F-Droid.", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "Замість цього увімкніть резервне копіювання онлайн-ключів з Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "Нічого", "@none": { "type": "text", @@ -931,28 +701,11 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "Не підтримується вебверсією", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "Вибрано {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "ok": "Гаразд", "@ok": { "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "Резервне онлайн-копіювання ключів вимкнено", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "Резервне онлайн-копіювання ключів увімкнено", "@onlineKeyBackupEnabled": { "type": "text", @@ -973,16 +726,6 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(Необов’язково) Назва групи", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Пристрої користувачів-учасників", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "парольна фраза або ключ відновлення", "@passphraseOrKey": { "type": "text", @@ -1005,16 +748,6 @@ "fileName": {} } }, - "pleaseChooseAUsername": "Виберіть ім'я користувача", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Введіть Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "Введіть свій пароль", "@pleaseEnterYourPassword": { "type": "text", @@ -1086,11 +819,6 @@ "type": "text", "placeholders": {} }, - "removeMessage": "Вилучити повідомлення", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "Показувати форматований вміст повідомлення", "@renderRichContent": { "type": "text", @@ -1106,31 +834,11 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "Запит на читання давніших повідомлень", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Відкликати всі дозволи", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "Кімнату було оновлено", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "Субота", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Пошук бесіди", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "seenByUser": "Переглянуто {username}", "@seenByUser": { "type": "text", @@ -1138,14 +846,6 @@ "username": {} } }, - "seenByUserAndUser": "Переглянули {username} і {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "Надіслати", "@send": { "type": "text", @@ -1166,56 +866,41 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} надсилає файл", + "sentAFile": "📁 {username} надсилає файл", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} надсилає аудіо", + "sentAnAudio": "🎤 {username} надсилає аудіо", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} надсилає зображення", + "sentAPicture": "🖼️ {username} надсилає зображення", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} надсилає наліпку", + "sentASticker": "😊 {username} надсилає наліпку", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} надсилає відео", + "sentAVideo": "🎥 {username} надсилає відео", "@sentAVideo": { "type": "text", "placeholders": { "username": {} } }, - "sessionVerified": "Сеанс звірено", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Додати зображення профілю", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Додати опис групи", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "Указати посилання для запрошення", "@setInvitationLink": { "type": "text", @@ -1243,11 +928,6 @@ "username": {} } }, - "signUp": "Зареєструватися", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "Пропустити", "@skip": { "type": "text", @@ -1258,11 +938,6 @@ "type": "text", "placeholders": {} }, - "startYourFirstChat": "Почніть свою першу бесіду просто зараз! 🙂\n- Торкніться «Нова бесіда»\n- Скануйте QR-код друга\n- Отримуйте задоволення від спілкування", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "statusExampleMessage": "Як справи сьогодні?", "@statusExampleMessage": { "type": "text", @@ -1273,21 +948,11 @@ "type": "text", "placeholders": {} }, - "sunday": "Неділя", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "Системна", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapToShowMenu": "Торкніться, щоб відкрити меню", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "Вони відрізняються", "@theyDontMatch": { "type": "text", @@ -1298,26 +963,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "Цю кімнату було заархівовано.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Четвер", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1329,11 +974,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "Вівторок", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unbannedUser": "{username} розблоковує {targetName}", "@unbannedUser": { "type": "text", @@ -1364,21 +1004,11 @@ "type": {} } }, - "unknownSessionVerify": "Невідомий сеанс, будь ласка, перевірте", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "Увімкнути сповіщення", "@unmuteChat": { "type": "text", "placeholders": {} }, - "useAmoledTheme": "Використовувати сумісні з AMOLED кольори?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} та {count} інших пишуть…", "@userAndOthersAreTyping": { "type": "text", @@ -1402,7 +1032,7 @@ "username": {} } }, - "userLeftTheChat": "{username} виходить з бесіди", + "userLeftTheChat": "🚪 {username} виходить з бесіди", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -1422,21 +1052,11 @@ "type": {} } }, - "verifiedSession": "Сеанс успішно перевірено!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "Перевірити", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "Перевірити вручну", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "Почати перевірку", "@verifyStart": { "type": "text", @@ -1452,11 +1072,6 @@ "type": "text", "placeholders": {} }, - "verifyUser": "Перевірити користувача", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "Відеовиклик", "@videoCall": { "type": "text", @@ -1497,26 +1112,11 @@ "type": "text", "placeholders": {} }, - "wallpaper": "Тло", + "wallpaper": "Шпалери:", "@wallpaper": { "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "Наскрізне шифрування наразі в бета-версії! Користуйтеся на свій страх і ризик!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Середа", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Ласкаво просимо до найсимпатичнішого месенджера в мережі Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "Кому дозволено приєднуватися до цієї групи", "@whoIsAllowedToJoinThisGroup": { "type": "text", @@ -1537,31 +1137,16 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "Вас запрошують до цієї бесіди", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "Ви більше не берете участь у цій бесіді", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "Ви не можете запросити себе", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "Ви були заблоковані у цій бесіді", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "Ваше власне ім'я користувача", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "pushRules": "Правила сповіщень", "@pushRules": { "type": "text", @@ -1727,18 +1312,6 @@ "type": "text", "placeholders": {} }, - "enterASpacepName": "Введіть назву простору", - "@enterASpacepName": {}, - "ignoreListDescription": "Ви можете нехтувати користувачів, які вас турбують. Ви не зможете отримувати повідомлення або запрошення в кімнату від користувачів у вашому особистому списку нехтування.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Неприпустима е-пошта", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "joinRoom": "Приєднатися до кімнати", "@joinRoom": { "type": "text", @@ -1759,12 +1332,6 @@ "type": "text", "placeholders": {} }, - "shareYourInviteLink": "Поділіться своїм посиланням запрошення", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Просто зіскануйте QR-код або поділіться посиланням на запрошення, якщо ви не поруч один з одним.", - "@createNewChatExplaination": {}, - "typeInInviteLinkManually": "Введіть посилання запрошення власноруч...", - "@typeInInviteLinkManually": {}, "scanQrCode": "Сканувати QR-код", "@scanQrCode": {}, "noPasswordRecoveryDescription": "Ви ще не додали спосіб відновлення пароля.", @@ -1819,11 +1386,6 @@ "type": "text", "placeholders": {} }, - "securityKey": "Ключ безпеки", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "replaceRoomWithNewerVersion": "Замінити кімнату новішою версією", "@replaceRoomWithNewerVersion": { "type": "text", @@ -1839,16 +1401,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Торкніться пристрою, щоб перевірити", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Користувач має невідомий стан перевірки", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "Ми надіслали вам електронний лист", "@weSentYouAnEmail": { "type": "text", @@ -1859,11 +1411,6 @@ "type": "text", "placeholders": {} }, - "zoomIn": "Збільшити", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, "addToSpace": "Додати простір", "@addToSpace": {}, "roomVersion": "Версія кімнати", @@ -1871,31 +1418,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "Редагувати дозволи бесіди", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "Мною виконано перехід за посиланням", "@iHaveClickedOnLink": { "type": "text", "placeholders": {} }, - "sentryInfo": "Відомості про вашу приватність: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Зміни збережено", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Огляд груп", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "startedACall": "{senderName} розпочинає виклик", "@startedACall": { "type": "text", @@ -1908,11 +1435,6 @@ "type": "text", "placeholders": {} }, - "dontAskAgain": "Скасувати та не запитувати знову", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "commandInvalid": "Неприпустима команда", "@commandInvalid": { "type": "text" @@ -1947,16 +1469,6 @@ "type": "text", "placeholders": {} }, - "clearText": "Очистити текст", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Додати нового друга", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "badServerVersionsException": "Домашній сервер підтримує такі версії специфікацій:\n{serverVersions}\nАле цей застосунок підтримує лише {supportedVersions}", "@badServerVersionsException": { "type": "text", @@ -2015,24 +1527,6 @@ "type": "text", "placeholders": {} }, - "securityKeyLost": "Ключ безпеки втрачено?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{Переглянули {username} і {count} інших}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "tapToShowImage": "Торкніться, щоб показати зображення", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, "errorObtainingLocation": "Помилка під час отримання розташування: {error}", "@errorObtainingLocation": { "type": "text", @@ -2050,21 +1544,6 @@ "type": "text", "placeholders": {} }, - "audioPlayerPause": "Пауза", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Відтворити", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Без опису", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noMatrixServer": "{server1} не є сервером matrix, використовувати {server2} натомість?", "@noMatrixServer": { "type": "text", @@ -2078,7 +1557,7 @@ "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "Типовий рівень дозволів", + "defaultPermissionLevel": "Типовий рівень дозволів для нових користувачів", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -2097,13 +1576,6 @@ "type": "text", "placeholder": {} }, - "savedFileAs": "Файл збережено як {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "pleaseChooseAPasscode": "Виберіть код доступу", "@pleaseChooseAPasscode": { "type": "text", @@ -2159,11 +1631,6 @@ "type": "text", "placeholders": {} }, - "friends": "Друзі", - "@friends": { - "type": "text", - "placeholders": {} - }, "homeserver": "Домашній сервер", "@homeserver": {}, "goToTheNewRoom": "Перейти до нової кімнати", @@ -2186,11 +1653,6 @@ "type": "text", "placeholders": {} }, - "chatHasBeenRemovedFromThisSpace": "Бесіду видалено з цього простору", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "chatHasBeenAddedToThisSpace": "Бесіду додано до цього простору", "@chatHasBeenAddedToThisSpace": {}, "chatBackupDescription": "Ваші старі повідомлення захищені ключем відновлення. Переконайтеся, що ви не втратите його.", @@ -2203,14 +1665,8 @@ "type": "text", "placeholders": {} }, - "yourChatBackupHasBeenSetUp": "Резервне копіювання бесіди налаштовано.", + "yourChatBackupHasBeenSetUp": "Рез. копію чату налаштовано.", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackup": "Налаштувати резервне копіювання бесіди", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Ключ записано", - "@iWroteDownTheKey": {}, - "setupChatBackupDescription": "Щоб захистити ваші повідомлення, ми створили для вас ключ відновлення.\nЗберігайте його в надійному місці, наприклад, у менеджері паролів.", - "@setupChatBackupDescription": {}, "clearArchive": "Очистити архів", "@clearArchive": {}, "commandHint_html": "Надіслати текст у форматі HTML", @@ -2218,8 +1674,6 @@ "type": "text", "description": "Usage hint for the command /html" }, - "yourUserId": "Ваш ID користувача:", - "@yourUserId": {}, "commandHint_invite": "Запросіть цього користувача до цієї кімнати", "@commandHint_invite": { "type": "text", @@ -2245,33 +1699,6 @@ "type": "text", "placeholders": {} }, - "ignoreUsername": "Нехтувати ім'я користувача", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Увімкніть резервне копіювання бесід, щоб ніколи не втратити доступ до них.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Увійти за допомогою {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "noPublicRoomsFound": "Загальнодоступних кімнат не знайдено…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Поки що статусів не знайдено.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "obtainingLocation": "Отримання розташування…", "@obtainingLocation": { "type": "text", @@ -2296,8 +1723,6 @@ "type": "text", "placeholders": {} }, - "newUsernameDescription": "Ваш ID користувача матиме формат @username:servername", - "@newUsernameDescription": {}, "serverRequiresEmail": "Цей сервер потребує перевірки вашої адресу е-пошти для реєстрації.", "@serverRequiresEmail": {}, "pleaseFollowInstructionsOnWeb": "Виконайте вказівки вебсайту та торкніться далі.", @@ -2305,11 +1730,6 @@ "type": "text", "placeholders": {} }, - "saveFileToFolder": "Зберегти файл до цієї теки", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "sendVideo": "Надіслати відео", "@sendVideo": { "type": "text", @@ -2350,13 +1770,6 @@ "type": "text", "placeholders": {} }, - "unreadMessages": "{unreadEvents, plural, =1{1 непрочитане повідомлення} few{{unreadEvents} непрочитані повідомлення} many{{unreadEvents} непрочитаних повідомлень} other{{unreadEvents} непрочитані повідомлення}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, "unreadChats": "{unreadCount, plural, =1{1 непрочитана бесіда} few{{unreadCount} непрочитані бесіди} many{{unreadCount} непрочитаних бесід} other{{unreadCount} непрочитані бесіди}}", "@unreadChats": { "type": "text", @@ -2364,28 +1777,11 @@ "unreadCount": {} } }, - "unlockChatBackup": "Розблокувати резервну копію бесіди", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "withTheseAddressesRecoveryDescription": "За допомогою цих адрес ви можете відновити свій пароль.", "@withTheseAddressesRecoveryDescription": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "Ви будете під'єднані до {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "yourChatsAreBeingSynced": "Ваші бесіди синхронізуються…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, "privacy": "Приватність", "@privacy": { "type": "text", @@ -2403,11 +1799,6 @@ "senderName": {} } }, - "discover": "Огляд", - "@discover": { - "type": "text", - "placeholders": {} - }, "cantOpenUri": "Не вдалося відкрити URI {uri}", "@cantOpenUri": { "type": "text", @@ -2450,38 +1841,11 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "Шифрування безпечне лише тоді, коли всі пристрої перевірено.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Введіть ключ безпеки:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "editBlockedServers": "Редагувати заблоковані сервери", "@editBlockedServers": { "type": "text", "placeholders": {} }, - "moreEvents": "{count,plural, =1{ще 1 подія} few{ще {count} події} many{ще {count} подій} other{ще {count} події}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "publicGroups": "Загальнодоступні групи", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Відкритий ключ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "showPassword": "Показати пароль", "@showPassword": { "type": "text", @@ -2497,11 +1861,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "Дозволити надсилання звітів про вади за допомогою sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "passwordHasBeenChanged": "Пароль змінено", "@passwordHasBeenChanged": { "type": "text", @@ -2522,21 +1881,11 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "Звук, вібрація, колір світлодіода", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPin": "Введіть свій PIN-код", "@pleaseEnterYourPin": { "type": "text", "placeholders": {} }, - "publicSpace": "Загальнодоступний простір", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "spaceName": "Назва простору", "@spaceName": { "type": "text", @@ -2562,35 +1911,18 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "Користувача не перевірено", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Перевірений користувач", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "unverified": "Неперевірений", "@unverified": {}, - "zoomOut": "Зменшити", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Служби визначення місцеположення вимкнені. Увімкніть їх, щоб могти надавати доступ до вашого місцеположення.", + "locationDisabledNotice": "Служби визначення розташування вимкнені. Увімкніть їх, щоб мати змогу ділитися своїм розташуванням.", "@locationDisabledNotice": { "type": "text", "placeholders": {} }, - "locationPermissionDeniedNotice": "Дозвіл на розташування відхилено. Надайте можливість ділитися своїм місцеперебуванням.", + "locationPermissionDeniedNotice": "Дозвіл на розташування відхилено. Надайте можливість ділитися своїм розташуванням.", "@locationPermissionDeniedNotice": { "type": "text", "placeholders": {} }, - "newPasswordDescription": "Щоб мати можливість відновити пароль потрібно буде додати адресу е-пошти до свого облікового запису.", - "@newPasswordDescription": {}, "oneClientLoggedOut": "На одному з ваших клієнтів виконано вихід із системи", "@oneClientLoggedOut": {}, "bundleName": "Назва вузла", @@ -2611,19 +1943,8 @@ "@editBundlesForAccount": {}, "addToBundle": "Додати до вузлів", "@addToBundle": {}, - "pleaseEnterValidEmail": "Введіть дійсну адресу е-пошти.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Паролі не збігаються!", - "@passwordsDoNotMatch": {}, - "repeatPassword": "Повторити пароль", + "repeatPassword": "Повторіть пароль", "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Виберіть принаймні {min} символів.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, "messageInfo": "Відомості про повідомлення", "@messageInfo": {}, "time": "Час", @@ -2636,20 +1957,10 @@ "@sender": {}, "addToSpaceDescription": "Виберіть простір, щоб додати до нього цю бесіду.", "@addToSpaceDescription": {}, - "loginWithOneClick": "Увійти одним натисканням", - "@loginWithOneClick": {}, - "removeFromSpaceDescription": "Це вилучає цей бесіду з поточного простору. Її все одно буде видно у розділі «Усі бесіди».", - "@removeFromSpaceDescription": {}, "removeFromSpace": "Вилучити з простору", "@removeFromSpace": {}, "start": "Почати", "@start": {}, - "setupChatBackupNow": "Налаштуйте резервне копіювання бесіди зараз", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Щоб розблокувати резервну копію бесіди, введіть ключ безпеки, який був створений під час попереднього сеансу. Ключ безпеки — це не ваш пароль.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Зберегти ключ безпеки зараз", - "@saveTheSecurityKeyNow": {}, "commandHint_discardsession": "Відкинути сеанс", "@commandHint_discardsession": { "type": "text", @@ -2675,20 +1986,8 @@ "type": "text", "placeholders": {} }, - "addToStory": "Додати до історії", - "@addToStory": {}, "publish": "Опублікувати", "@publish": {}, - "whoCanSeeMyStories": "Хто може бачити мої історії?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Скасувати підписку на історії", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Цей користувач ще нічого не опублікував у своїй історії", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Ваша історія", - "@yourStory": {}, - "replyHasBeenSent": "Відповідь надіслано", - "@replyHasBeenSent": {}, "videoWithSize": "Відео ({size})", "@videoWithSize": { "type": "text", @@ -2696,29 +1995,6 @@ "size": {} } }, - "storyFrom": "Історія за {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Зауважте, що у вашій історії люди можуть бачити та зв’язуватися одне з одним.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Що відбувається?", - "@whatIsGoingOn": {}, - "addDescription": "Додати опис", - "@addDescription": {}, - "bubbleSize": "Розмір бульбашки", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Я розумію", - "@iUnderstand": {}, - "storyPrivacyWarning": "Зверніть увагу, що люди можуть бачити та зв'язуватися один з одним у вашій історії. Ваші історії будуть видимі впродовж 24 годин, але немає жодної гарантії, що вони будуть видалені з усіх пристроїв і серверів.", - "@storyPrivacyWarning": {}, "dismiss": "Відхилити", "@dismiss": {}, "markAsRead": "Позначити прочитаним", @@ -2727,12 +2003,6 @@ "@reportUser": {}, "openChat": "Відкрити бесіду", "@openChat": {}, - "integrationsNotImplemented": "Редагування віджетів та інтеграцій поки що неможливе.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Редагувати віджети та інтеграції", - "@editIntegrations": {}, - "matrixWidgets": "Віджети Matrix", - "@matrixWidgets": {}, "reactedWith": "{sender} реагує з {reaction}", "@reactedWith": { "type": "text", @@ -2745,8 +2015,6 @@ "@emojis": {}, "pinMessage": "Прикріпити в кімнаті", "@pinMessage": {}, - "pinnedEventsError": "Помилка завантаження закріплених повідомлень", - "@pinnedEventsError": {}, "confirmEventUnpin": "Ви впевнені, що бажаєте назавжди відкріпите подію?", "@confirmEventUnpin": {}, "placeCall": "Здійснити виклик", @@ -2774,8 +2042,6 @@ "@nextAccount": {}, "previousAccount": "Попередній обліковий запис", "@previousAccount": {}, - "editWidgets": "Редагувати віджети", - "@editWidgets": {}, "addWidget": "Додати віджет", "@addWidget": {}, "widgetVideo": "Відео", @@ -2794,23 +2060,18 @@ "@widgetUrlError": {}, "errorAddingWidget": "Помилка додавання віджета.", "@errorAddingWidget": {}, - "separateChatTypes": "Окремі особисті бесіди, групи та простори", + "separateChatTypes": "Розділіть особисті бесіди та групи", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "Показувати пов'язані особисті бесіди у просторах", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youInvitedBy": "Ви були запрошені {user}", + "youInvitedBy": "📩 Ви були запрошені {user}", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youAcceptedTheInvitation": "Ви прийняли запрошення", + "youAcceptedTheInvitation": "👍 Ви погодилися на запрошення", "@youAcceptedTheInvitation": {}, "youRejectedTheInvitation": "Ви відхилили запрошення", "@youRejectedTheInvitation": {}, @@ -2826,7 +2087,7 @@ "user": {} } }, - "youKickedAndBanned": "Ви вилучили й заблокували {user}", + "youKickedAndBanned": "🙅 Ви вилучили й заблокували {user}", "@youKickedAndBanned": { "placeholders": { "user": {} @@ -2834,7 +2095,7 @@ }, "youJoinedTheChat": "Ви приєдналися до бесіди", "@youJoinedTheChat": {}, - "youKicked": "Ви вилучили {user}", + "youKicked": "👞 Ви вилучили {user}", "@youKicked": { "placeholders": { "user": {} @@ -2846,25 +2107,19 @@ "user": {} } }, - "youInvitedUser": "Ви запросили {user}", + "youInvitedUser": "📩 Ви запросили {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "showSpaces": "Показати список просторів", - "@showSpaces": {}, - "noEmailWarning": "Введіть справжню адресу електронної пошти. В іншому випадку ви не зможете скинути пароль. Якщо ви цього не хочете, торкніться кнопки ще раз, щоб продовжити.", - "@noEmailWarning": {}, - "saveTheRecoveryKeyNow": "Збережіть ключ відновлення зараз", - "@saveTheRecoveryKeyNow": {}, "saveKeyManuallyDescription": "Збережіть цей ключ вручну, запустивши діалогове вікно спільного доступу до системи або буфер обміну.", "@saveKeyManuallyDescription": {}, "storeInAndroidKeystore": "Зберегти в Android KeyStore", "@storeInAndroidKeystore": {}, "storeInAppleKeyChain": "Зберегти в Apple KeyChain", "@storeInAppleKeyChain": {}, - "storeSecurlyOnThisDevice": "Зберегти на цей пристрій", + "storeSecurlyOnThisDevice": "Зберегти безпечно на цей пристрій", "@storeSecurlyOnThisDevice": {}, "pleaseEnterRecoveryKeyDescription": "Щоб розблокувати старі повідомлення, введіть ключ відновлення, згенерований у попередньому сеансі. Ваш ключ відновлення це НЕ ваш пароль.", "@pleaseEnterRecoveryKeyDescription": {}, @@ -2874,14 +2129,770 @@ "@recoveryKey": {}, "recoveryKeyLost": "Ключ відновлення втрачено?", "@recoveryKeyLost": {}, - "enableAutoBackups": "Увімкнути автоматичне резервне копіювання", - "@enableAutoBackups": {}, "users": "Користувачі", "@users": {}, - "stories": "Історії", - "@stories": {}, "unlockOldMessages": "Розблокувати старі повідомлення", "@unlockOldMessages": {}, "storeInSecureStorageDescription": "Збережіть ключ відновлення в безпечному сховищі цього пристрою.", - "@storeInSecureStorageDescription": {} + "@storeInSecureStorageDescription": {}, + "countFiles": "{count} файлів", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "hydrate": "Відновлення з файлу резервної копії", + "@hydrate": {}, + "hydrateTorLong": "Минулого разу ви експортували свій сеанс із TOR? Швидко імпортуйте його та продовжуйте спілкування.", + "@hydrateTorLong": {}, + "indexedDbErrorTitle": "Проблеми приватного режиму", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "На жаль, сховище повідомлень не ввімкнуто у приватному режимі типово.\nВідкрийте\n - about:config\n - установіть для dom.indexedDB.privateBrowsing.enabled значення true\nІнакше запустити FluffyChat буде неможливо.", + "@indexedDbErrorLong": {}, + "dehydrate": "Експортувати сеанс та очистити пристрій", + "@dehydrate": {}, + "dehydrateWarning": "Цю дію не можна скасувати. Переконайтеся, що ви безпечно зберігаєте файл резервної копії.", + "@dehydrateWarning": {}, + "dehydrateTor": "Користувачі TOR: експорт сеансу", + "@dehydrateTor": {}, + "dehydrateTorLong": "Для користувачів TOR рекомендується експортувати сеанс перед закриттям вікна.", + "@dehydrateTorLong": {}, + "hydrateTor": "Користувачі TOR: імпорт експортованого сеансу", + "@hydrateTor": {}, + "user": "Користувач", + "@user": {}, + "custom": "Користувацький", + "@custom": {}, + "supposedMxid": "Це має бути {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "confirmMatrixId": "Підтвердьте свій Matrix ID, щоб видалити свій обліковий запис.", + "@confirmMatrixId": {}, + "commandHint_markasgroup": "Позначити групою", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "Позначити кімнатою особистого спілкування для надання Matrix ID", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "Чому це повідомлення нечитабельне?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Це може статися, якщо повідомлення було надіслано до того, як ви ввійшли у свій обліковий запис на цьому пристрої.\n\nТакож можливо, що відправник заблокував ваш пристрій або щось пішло не так з під'єднанням до інтернету.\n\nЧи можете ви прочитати повідомлення на іншому сеансі? Тоді ви зможете перенести повідомлення з нього! Перейдіть до Налаштування > Пристрої та переконайтеся, що ваші пристрої перевірили один одного. Коли ви відкриєте кімнату наступного разу й обидва сеанси будуть на активні, ключі будуть передані автоматично.\n\nВи ж не хочете втрачати ключі після виходу або зміни пристроїв? Переконайтеся, що ви ввімкнули резервне копіювання бесід у налаштуваннях.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Це сповіщення з'являється під час роботи основної служби.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "спільний доступ до екрана", + "@screenSharingTitle": {}, + "callingPermissions": "Дозволи на виклик", + "@callingPermissions": {}, + "callingAccount": "Обліковий запис для виклику", + "@callingAccount": {}, + "callingAccountDetails": "Дозволяє FluffyChat використовувати основний застосунок Android для набору номера.", + "@callingAccountDetails": {}, + "appearOnTop": "З'являтися зверху", + "@appearOnTop": {}, + "appearOnTopDetails": "Дозволяє застосунку показуватися зверху (не потрібно, якщо Fluffychat вже налаштований обліковим записом для викликів)", + "@appearOnTopDetails": {}, + "newGroup": "Нова група", + "@newGroup": {}, + "newSpace": "Новий простір", + "@newSpace": {}, + "enterSpace": "Увійти в простір", + "@enterSpace": {}, + "enterRoom": "Увійти в кімнату", + "@enterRoom": {}, + "otherCallingPermissions": "Мікрофон, камера та інші дозволи FluffyChat", + "@otherCallingPermissions": {}, + "allSpaces": "Усі простори", + "@allSpaces": {}, + "screenSharingDetail": "Ви ділитеся своїм екраном FuffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} бесід", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "Сховати неважливі державні свята", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Не показувати знову", + "@doNotShowAgain": {}, + "commandHint_cuddle": "Надіслати пригортайку", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName} надсилає вам гугл-очі", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "Надіслати кілька гугл-очей", + "@commandHint_googly": {}, + "commandHint_hug": "Надіслати обійми", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} пригортається до вас", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} обіймає вас", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "wasDirectChatDisplayName": "Порожня бесіда (раніше {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "startFirstChat": "Розпочніть свою першу бесіду", + "@startFirstChat": {}, + "newSpaceDescription": "Простори дозволяють об'єднувати ваші бесіди та створювати приватні або загальнодоступні спільноти.", + "@newSpaceDescription": {}, + "encryptThisChat": "Зашифрувати цю бесіду", + "@encryptThisChat": {}, + "disableEncryptionWarning": "З міркувань безпеки ви не можете вимкнути шифрування в бесіді, ув якій воно було ввімкнене раніше.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Вибачте... це неможливо", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Ключі пристрою:", + "@deviceKeys": {}, + "reopenChat": "Відновити бесіду", + "@reopenChat": {}, + "noOtherDevicesFound": "Інших пристроїв не знайдено", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Увага! Якщо ви не ввімкнете резервне копіювання бесіди, ви втратите доступ до своїх зашифрованих повідомлень. Наполегливо радимо ввімкнути резервне копіювання бесіди перед виходом.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Не вдалося надіслати! Сервер підтримує вкладення розміром до {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Файл збережено в {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "Перейти до останнього прочитаного повідомлення", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Читати тут", + "@readUpToHere": {}, + "jump": "Перейти", + "@jump": {}, + "openLinkInBrowser": "Відкрити посилання у браузері", + "@openLinkInBrowser": {}, + "allRooms": "Усі групові бесіди", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "reportErrorDescription": "О, ні. Щось пішло не так. Якщо хочете, можете повідомити про помилку розробникам.", + "@reportErrorDescription": {}, + "report": "повідомити", + "@report": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Спробуйте пізніше або виберіть інший сервер.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWithPassword": "Увійти за допомогою пароля", + "@signInWithPassword": {}, + "signInWith": "Увійти через {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Не файл зображення.", + "@notAnImage": {}, + "importNow": "Імпортувати зараз", + "@importNow": {}, + "importEmojis": "Імпорт емодзі", + "@importEmojis": {}, + "importFromZipFile": "Імпорт з файлу .zip", + "@importFromZipFile": {}, + "replace": "Замінити", + "@replace": {}, + "exportEmotePack": "Експортувати набір смайликів у форматі .zip", + "@exportEmotePack": {}, + "sendTypingNotifications": "Надсилати сповіщення про ввід тексту", + "@sendTypingNotifications": {}, + "createGroup": "Створити групу", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Хочете запросити {contact} до бесіди \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "messagesStyle": "Повідомлення:", + "@messagesStyle": {}, + "shareInviteLink": "Надіслати запрошувальне посилання", + "@shareInviteLink": {}, + "tryAgain": "Повторіть спробу", + "@tryAgain": {}, + "setTheme": "Налаштувати тему:", + "@setTheme": {}, + "setColorTheme": "Налаштувати колірну тему:", + "@setColorTheme": {}, + "addChatDescription": "Додати опис бесіди...", + "@addChatDescription": {}, + "chatPermissions": "Дозволи бесіди", + "@chatPermissions": {}, + "chatDescription": "Опис бесіди", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Опис бесіди змінено", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Опис бесіди ще не створено.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Недійсна назва сервера", + "@invalidServerName": {}, + "optionalRedactReason": "(Необов'язково) Причина редагування цього повідомлення...", + "@optionalRedactReason": {}, + "redactedBy": "Відредаговано {username}", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "Особисте повідомлення", + "@directChat": {}, + "redactedByBecause": "Відредаговано {username}, тому що: \"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "profileNotFound": "Не вдалося знайти користувача на сервері. Можливо, проблема зі з'єднанням або користувач не існує.", + "@profileNotFound": {}, + "invite": "Запросити", + "@invite": {}, + "redactMessageDescription": "Повідомлення буде відредаговано для всіх учасників цієї розмови. Це не можна скасувати.", + "@redactMessageDescription": {}, + "setChatDescription": "Налаштувати опис бесіди", + "@setChatDescription": {}, + "inviteGroupChat": "📨 Запросити до групової бесіди", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Запросити до приватної бесіди", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Тут з'являться нещодавно використані смайлики...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "Недійсний ввід!", + "@invalidInput": {}, + "wrongPinEntered": "Введено неправильний PIN! Повторіть спробу за {seconds} секунд...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "banUserDescription": "Користувача буде заблоковано в бесіді, і він не зможе знову увійти в неї, поки його не буде розблоковано.", + "@banUserDescription": {}, + "removeDevicesDescription": "Ви вийдете з цього пристрою і більше не зможете отримувати повідомлення.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Користувач зможе знову увійти в бесіду, якщо спробує.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push-сповіщення недоступні", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Після того, як ви зробите цього користувача адміністратором, ви, можливо, не зможете це скасувати, оскільки він матиме ті самі права, що й ви.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Бесіду буде переміщено до архіву. Інші користувачі зможуть побачити, що ви вийшли з неї.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪{user} стукає до вас", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "learnMore": "Докладніше", + "@learnMore": {}, + "roomUpgradeDescription": "Після цього бесіду буде відтворено з новою версією кімнати. Усі учасники отримають сповіщення, що їм потрібно перейти до нової бесіди. Ви можете дізнатися більше про версії кімнат на https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Введіть число більше ніж 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Користувача вигнали з бесіди, але не заблокували. До загальнодоступних бесід користувач може приєднатися будь-коли.", + "@kickUserDescription": {}, + "blockListDescription": "Ви можете заблокувати користувачів, які вас турбують. Ви не зможете отримувати жодних повідомлень або запрошень до кімнати від користувачів з вашого персонального списку блокування.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Створити групу та запросити користувачів", + "@createGroupAndInviteUsers": {}, + "startConversation": "Розпочати розмову", + "@startConversation": {}, + "blockedUsers": "Заблоковані користувачі", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Групу можна знайти через пошук", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "На жаль, не знайдено жодного користувача з запитом \"{query}\".Перевірте, чи не було допущено помилки.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "Заблокувати", + "@block": {}, + "yourGlobalUserIdIs": "Ваш глобальний ID користувача: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Надіслати необроблений json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Вибачте... схоже, це неправильний ключ відновлення.", + "@wrongRecoveryKey": {}, + "blockUsername": "Ігнорувати ім'я користувача", + "@blockUsername": {}, + "groupName": "Назва групи", + "@groupName": {}, + "databaseMigrationTitle": "Базу даних оптимізовано", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Пошук для #chats, @users...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Зачекайте, будь ласка. Це може тривати деякий час.", + "@databaseMigrationBody": {}, + "thisDevice": "Цей пристрій:", + "@thisDevice": {}, + "publicSpaces": "Загальнодоступний простір", + "@publicSpaces": {}, + "passwordIsWrong": "Введений пароль неправильний", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Введіть поточний пароль", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Загальнодоступне посилання", + "@publicLink": {}, + "nothingFound": "Нічого не знайдено...", + "@nothingFound": {}, + "decline": "Відхилити", + "@decline": {}, + "newPassword": "Новий пароль", + "@newPassword": {}, + "passwordsDoNotMatch": "Паролі відрізняються", + "@passwordsDoNotMatch": {}, + "subspace": "Підпростір", + "@subspace": {}, + "select": "Вибрати", + "@select": {}, + "pleaseChooseAStrongPassword": "Виберіть надійний пароль", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Додати бесіду або підпростір", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Лишіть порожнім, щоб оновити статус.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Приєднатися до простору", + "@joinSpace": {}, + "searchForUsers": "Пошук @користувачів...", + "@searchForUsers": {}, + "sessionLostBody": "Ваш сеанс втрачено. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "databaseBuildErrorBody": "Не вдалося створити базу даних SQlite. Застосунок намагається використовувати стару базу даних. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "Виникла помилка під час запуску застосунку", + "@initAppError": {}, + "restoreSessionBody": "Наразі застосунок намагається відновити ваш сеанс з резервної копії. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "youInvitedToBy": "📩 Вас запрошено за посиланням на:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "acceptedKeyVerification": "{sender} погоджується звірити ключі", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "canceledKeyVerification": "{sender} скасовує звірення ключів", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} просить звірити ключі", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "Прозорий", + "@transparent": {}, + "sendReadReceiptsDescription": "Інші учасники бесіди бачитимуть, що ви прочитали повідомлення.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Форматовані повідомлення", + "@formattedMessages": {}, + "forwardMessageTo": "Переслати повідомлення до {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceipts": "Надіслати підтвердження прочитання", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Інші учасники бесіди бачитимуть, коли ви набираєте нове повідомлення.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Показувати розширений вміст повідомлень, наприклад, жирний текст, використовуючи markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Звірити іншого користувача", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "Якщо ви звіряєте іншого користувача, ви можете бути впевнені, що знаєте, кому ви насправді пишете. 💪\n\nКоли ви почнете звірення, ви та інший користувач побачите спливне вікно в застосунку. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою.\n\nНайкращий спосіб зробити це — зустрітися або розпочати відеовиклик. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Коли ви звіряєте інший пристрій, ці пристрої можуть обмінюватися ключами, підвищуючи вашу загальну безпеку. 💪 Коли ви розпочнете звірення, в застосунку на обох пристроях з'явиться спливне вікно. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою. Найкраще мати обидва пристрої під рукою перед початком звірення. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherDevice": "🔐 Звірити інший пристрій", + "@verifyOtherDevice": {}, + "completedKeyVerification": "{sender} завершує звірення ключів", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} готовий до звірення ключів", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} розпочинає звірення ключів", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "presenceStyle": "Присутність:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "Показувати повідомлення про стан від інших користувачів", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "hidePresences": "Сховати список станів?", + "@hidePresences": {}, + "incomingMessages": "Вхідні повідомлення", + "@incomingMessages": {}, + "discover": "Огляд", + "@discover": {}, + "stickers": "Наліпки", + "@stickers": {}, + "searchIn": "Пошук у бесіді \"{chat}\"...", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "commandHint_ignore": "Ігнорувати цей Matrix ID", + "@commandHint_ignore": {}, + "restricted": "Обмежено", + "@restricted": {}, + "swipeRightToLeftToReply": "Посунути праворуч або ліворуч, щоб відповісти", + "@swipeRightToLeftToReply": {}, + "globalChatId": "Глобальний ID бесіди", + "@globalChatId": {}, + "accessAndVisibility": "Доступ і видимість", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Хто може приєднатися до цієї бесіди і як її можна знайти.", + "@accessAndVisibilityDescription": {}, + "calls": "Виклики", + "@calls": {}, + "customEmojisAndStickers": "Власні емоджі та наліпки", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Додавайте або діліться власними емоджі або наліпками, які можна використовувати в будь-якій бесіді.", + "@customEmojisAndStickersBody": {}, + "createNewAddress": "Створити нову адресу", + "@createNewAddress": {}, + "userRole": "Роль користувача", + "@userRole": {}, + "minimumPowerLevel": "{level} — це найнижчий рівень повноважень.", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "commandHint_unignore": "Не ігнорувати цей Matrix ID", + "@commandHint_unignore": {}, + "knockRestricted": "Стук обмежено", + "@knockRestricted": {}, + "appLockDescription": "Блокувати застосунок, коли не використовується ПІН-код", + "@appLockDescription": {}, + "hideRedactedMessages": "Сховати змінені повідомлення", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Якщо хтось змінить повідомлення, його більше не буде видно в бесіді.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Сховати недійсні або невідомі формати повідомлень", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Сховати зміни користувачів у загальнодоступних бесідах", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Не показувати в хронології бесіди, якщо хтось приєднується до загальнодоступної бесіди або виходить з неї, щоб покращити її читабельність.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Огляд", + "@overview": {}, + "notifyMeFor": "Сповіщати мене про", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Налаштування відновлення пароля", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} хоче приєднатися до бесіди.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "Загальнодоступне посилання ще не створено", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Постукатись", + "@knock": {}, + "knocking": "Стукаються", + "@knocking": {}, + "noDatabaseEncryption": "Шифрування бази даних не підтримується на цій платформі", + "@noDatabaseEncryption": {}, + "usersMustKnock": "Користувачі повинні постукатись", + "@usersMustKnock": {}, + "noOneCanJoin": "Ніхто не може приєднатись", + "@noOneCanJoin": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Бесіду можна знайти за допомогою пошуку на {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "publicChatAddresses": "Адреси загальнодоступної бесіди", + "@publicChatAddresses": {}, + "searchMore": "Шукати ще...", + "@searchMore": {}, + "gallery": "Галерея", + "@gallery": {}, + "files": "Файли", + "@files": {}, + "unreadChatsInApp": "{appname}: {unread} непрочитаних бесід", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "thereAreCountUsersBlocked": "Наразі заблоковано {count} користувачів.", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "moderatorLevel": "{level} - Модератор", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - Адміністратор", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "userLevel": "{level} - Користувач", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "changeGeneralChatSettings": "Змінити загальні налаштування чату", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Запросити інших користувачів до цього чату", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Змінити права доступу до чату", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Змінити видимість історії чату", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Змінити основну адресу загальнодоступного чату", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Надсилати сповіщення @room", + "@sendRoomNotifications": {}, + "space": "Простір", + "@space": {}, + "spaces": "Простори", + "@spaces": {}, + "goToSpace": "Перейти до простору: {space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "Позначити непрочитаним", + "@markAsUnread": {}, + "alwaysUse24HourFormat": "ні", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "invitedBy": "📩 Запрошений {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "changeTheDescriptionOfTheGroup": "Змінити опис чату", + "@changeTheDescriptionOfTheGroup": {}, + "updateInstalled": "🎉 Оновлення {version} встановлено!", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "changelog": "Зміни", + "@changelog": {}, + "chatPermissionsDescription": "Визначте, який рівень повноважень необхідний для певних дій у цьому чаті. Рівні повноважень 0, 50 і 100 зазвичай представляють користувачів, модераторів та адміністраторів, але можливі будь-які градації.", + "@chatPermissionsDescription": {}, + "countChatsAndCountParticipants": "{chats} чати та {participants} учасників", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Більше чатів не знайдено...", + "@noMoreChatsFound": {}, + "joinedChats": "Приєднані чати", + "@joinedChats": {}, + "unread": "Непрочитані", + "@unread": {}, + "sendCanceled": "Надсилання скасовано", + "@sendCanceled": {}, + "noChatsFoundHere": "Бесід ще немає. Розпочніть спілкування натиснувши кнопку нижче. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "Увійти за допомогою Matrix-ID", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Знайти домашні сервери", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Що таке домашній сервер?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Усі ваші дані зберігаються на домашньому сервері, так само як у постачальника послуг електронної пошти. Ви можете вибрати, який домашній сервер ви хочете використовувати, водночас ви можете спілкуватися з усіма. Докладніше на https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Здається, це несумісний домашній сервер. Неправильна URL-адреса?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Обчислення розміру файлу...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Підготовка до надсилання вкладення...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Надсилання вкладення...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Генерування мініатюри відео...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Стиснення відео...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Надсилання вкладення {index} з {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "Досягнуто ліміту сервера! Очікування {seconds} секунд...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "Один із ваших пристроїв не верифікований", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Примітка: Коли ви під'єднуєте всі свої пристрої до резервної копії бесіди, вони автоматично верифікуються.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Продовжити", + "@continueText": {}, + "manageAccount": "Керувати обліковим записом", + "@manageAccount": {}, + "welcomeText": "Привіт-привіт 👋 Це FluffyChat. Ви можете увійти на будь-який сервер, сумісний із https://matrix.org. А потім спілкуватися з будь-ким. Це величезна децентралізована мережа для обміну повідомленнями!", + "@welcomeText": {}, + "blur": "Розмиття:", + "@blur": {}, + "opacity": "Прозорість:", + "@opacity": {}, + "setWallpaper": "Встановити шпалери", + "@setWallpaper": {}, + "aboutHomeserver": "Про {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "noContactInformationProvided": "Сервер не надає жодної дійсної контактної інформації", + "@noContactInformationProvided": {}, + "contactServerSecurity": "Зв’язатися з відділом безпеки сервера", + "@contactServerSecurity": {}, + "supportPage": "Сторінка підтримки", + "@supportPage": {}, + "serverInformation": "Інформація про сервер:", + "@serverInformation": {}, + "contactServerAdmin": "Зв’язатися з адміністратором сервера", + "@contactServerAdmin": {}, + "name": "Ім'я", + "@name": {}, + "version": "Версія", + "@version": {}, + "website": "Вебсайт", + "@website": {}, + "compressBeforeSending": "Стиснути перед відправленням", + "@compressBeforeSending": {}, + "sendUncompressed": "Відправити без стиснення", + "@sendUncompressed": {}, + "boldText": "Жирний текст", + "@boldText": {}, + "italicText": "Курсивний текст", + "@italicText": {}, + "strikeThrough": "Перекреслений текст", + "@strikeThrough": {}, + "pleaseFillOut": "Будь ласка, заповніть", + "@pleaseFillOut": {}, + "invalidUrl": "Невірний URL", + "@invalidUrl": {}, + "addLink": "Додати посилання", + "@addLink": {}, + "unableToJoinChat": "Неможливо приєднатися до чату. Можливо, інша сторона вже закрила розмову.", + "@unableToJoinChat": {}, + "sendImages": "Надіслати {count} зображення", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "Стиснути", + "@compress": {} } diff --git a/assets/l10n/intl_vi.arb b/assets/l10n/intl_vi.arb index d732bc53d5..0dc49651a9 100644 --- a/assets/l10n/intl_vi.arb +++ b/assets/l10n/intl_vi.arb @@ -22,11 +22,6 @@ "type": "text", "placeholders": {} }, - "accountInformation": "Thông tin tài khoản", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, "activatedEndToEndEncryption": "{username} đã kích hoạt mã hóa đầu cuối 2 chiều", "@activatedEndToEndEncryption": { "type": "text", @@ -34,11 +29,6 @@ "username": {} } }, - "addGroupDescription": "Thêm mô tả cho nhóm", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, "admin": "Quản trị viên", "@admin": { "type": "text", @@ -49,11 +39,6 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "Bạn đã có tài khoản?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, "answeredTheCall": "{senderName} đã trả lời cuộc gọi", "@answeredTheCall": { "type": "text", @@ -71,11 +56,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "Phòng hội thảo đã lưu trữ", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "Khách vãng lai có được tham gia không", "@areGuestsAllowedToJoin": { "type": "text", @@ -86,33 +66,11 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "Vui lòng nhập cụm mật khẩu hoặc khóa khôi phục để lưu khóa vào bộ nhớ cache.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "blockDevice": "Thiết bị bị chặn", "@blockDevice": { "type": "text", "placeholders": {} }, - "zoomOut": "Thu nhỏ", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Phóng to", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Bạn sẽ được kết nối tới {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, "verified": "Đã xác thực", "@verified": { "type": "text", @@ -123,36 +81,16 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "Chạm vào một thiết bị để chứng thực", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, "showPassword": "Hiển thị mật khẩu", "@showPassword": { "type": "text", "placeholders": {} }, - "securityKeyLost": "Thất lạc khoá bảo mật?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Khóa bảo mật", - "@securityKey": { - "type": "text", - "placeholders": {} - }, "pleaseFollowInstructionsOnWeb": "Vui lòng làm theo hướng dẫn trên trang web và bấm tiếp", "@pleaseFollowInstructionsOnWeb": { "type": "text", "placeholders": {} }, - "pleaseEnterSecurityKey": "Vui lòng nhập khoá bảo mật", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "noEncryptionForPublicRooms": "Bạn chỉ có thể kích hoạt mã hoá khi phòng này không mở", "@noEncryptionForPublicRooms": { "type": "text", @@ -188,16 +126,6 @@ "type": "text", "placeholders": {} }, - "discardPicture": "Xoá hình ảnh", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Mã hoá chỉ bảo mật khi tất cả các thiết bị đều được chứng thực", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "devices": "Các thiết bị", "@devices": { "type": "text", @@ -213,11 +141,6 @@ "type": "text", "placeholders": {} }, - "deny": "Từ chối", - "@deny": { - "type": "text", - "placeholders": {} - }, "deleteMessage": "Xoá tin nhắn", "@deleteMessage": { "type": "text", @@ -268,11 +191,6 @@ "type": "text", "placeholders": {} }, - "createNewGroup": "Tạo một nhóm mới", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, "createdTheChat": "{username} đã tạo cuộc trò chuyện", "@createdTheChat": { "type": "text", @@ -280,11 +198,6 @@ "username": {} } }, - "createAccountNow": "Tạo tài khoản mới ngay", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, "create": "Tạo", "@create": { "type": "text", @@ -297,16 +210,6 @@ "count": {} } }, - "couldNotSetDisplayname": "Không thể thay tên hiển thị", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Không thể đặt ảnh đại diện", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, "couldNotDecryptMessage": "Không thể giải mã tin nhắn: {error}", "@couldNotDecryptMessage": { "type": "text", @@ -324,11 +227,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "Kết nối thất bại", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "connect": "Kết nối", "@connect": { "type": "text", @@ -354,11 +252,6 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "Chọn tên người dùng", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "chooseAStrongPassword": "Chọn một mật khẩu mạnh", "@chooseAStrongPassword": { "type": "text", @@ -384,16 +277,6 @@ "type": "text", "placeholders": {} }, - "changeWallpaper": "Thay hình nền", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Thay đổi máy chủ", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, "changeTheNameOfTheGroup": "Thay đổi tên nhóm", "@changeTheNameOfTheGroup": { "type": "text", @@ -409,11 +292,6 @@ "type": "text", "placeholders": {} }, - "changelog": "Lịch sử thay đổi", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changedTheRoomInvitationLink": "{username} đã thay đổi đường dẫn mời", "@changedTheRoomInvitationLink": { "type": "text", @@ -490,11 +368,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "Khóa đã được lưu vào bộ nhớ tạm", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "blocked": "Đã chặn", "@blocked": { "type": "text", @@ -534,36 +407,227 @@ "supportedVersions": {} } }, - "avatarHasBeenChanged": "Ảnh đại diện đã được thay đổi", - "@avatarHasBeenChanged": { + "askVerificationRequest": "Bạn có đồng ý yêu cầu chứng thực từ {username} không?", + "@askVerificationRequest": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "areYouSureYouWantToLogout": "Bạn có chắc bạn muốn đăng xuất không?", + "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "authentication": "Xác thực", - "@authentication": { + "addEmail": "Thêm email", + "@addEmail": { "type": "text", "placeholders": {} }, - "askVerificationRequest": "Bạn có đồng ý yêu cầu chứng thực từ {username} không?", - "@askVerificationRequest": { + "notifications": "Thông báo", + "@notifications": { + "type": "text", + "placeholders": {} + }, + "newGroup": "Nhóm mới", + "@newGroup": {}, + "pleaseEnterANumber": "Hãy nhập số lớn hơn 0", + "@pleaseEnterANumber": {}, + "newSpaceDescription": "Không gian cho phép bạn hợp nhất các cuộc trò chuyện của mình và xây dựng cộng đồng riêng tư hoặc công khai.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "Vì lý do bảo mật, bạn không thể tắt tính năng mã hóa trong cuộc trò chuyện đã được bật tính năng này trước đó.", + "@disableEncryptionWarning": {}, + "makeAdminDescription": "Khi bạn đặt người dùng này làm quản trị viên, bạn không thể hoàn tác việc này vì khi đó họ sẽ có quyền ngang bạn.", + "@makeAdminDescription": {}, + "setColorTheme": "Chọn màu giao diện:", + "@setColorTheme": {}, + "callingAccount": "Gọi tài khoản", + "@callingAccount": {}, + "openLinkInBrowser": "Mở đường dẫn trong trình duyệt", + "@openLinkInBrowser": {}, + "setTheme": "Chọn giao diện:", + "@setTheme": {}, + "invitePrivateChat": "📨 Mời trò chuyện riêng tư", + "@invitePrivateChat": {}, + "inviteGroupChat": "📨 Mời nhóm trò chuyện", + "@inviteGroupChat": {}, + "addToSpace": "Thêm vào không gian", + "@addToSpace": {}, + "importEmojis": "Nhập Biểu cảm", + "@importEmojis": {}, + "importFromZipFile": "Nhập vào từ tệp .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Xuất gói biểu cảm bằng tệp .zip", + "@exportEmotePack": {}, + "hideUnimportantStateEvents": "Ẩn các sự kiện không quan trọng", + "@hideUnimportantStateEvents": {}, + "replace": "Thay thế", + "@replace": {}, + "addChatDescription": "Thêm mô tả hội thoại...", + "@addChatDescription": {}, + "report": "báo cáo", + "@report": {}, + "remove": "Loại bỏ", + "@remove": { + "type": "text", + "placeholders": {} + }, + "restricted": "Bị hạn chế", + "@restricted": {}, + "newSpace": "Không gian mới", + "@newSpace": {}, + "enterRoom": "Nhập phòng", + "@enterRoom": {}, + "signInWithPassword": "Đăng nhập với mật khẩu", + "@signInWithPassword": {}, + "all": "Tất cả", + "@all": { + "type": "text", + "placeholders": {} + }, + "appLock": "Khoá ứng dụng", + "@appLock": { + "type": "text", + "placeholders": {} + }, + "allChats": "Tất cả hội thoại", + "@allChats": { + "type": "text", + "placeholders": {} + }, + "repeatPassword": "Nhập lại mật khẩu", + "@repeatPassword": {}, + "confirmMatrixId": "Hãy xác nhận Matrix ID để xoá tài khoản.", + "@confirmMatrixId": {}, + "supposedMxid": "Đây nên là {mxid}", + "@supposedMxid": { "type": "text", "placeholders": { - "username": {} + "mxid": {} } }, - "askSSSSVerify": "Vui lòng nhập mật khẩu bảo mật hoặc khóa khôi phục để chứng thực phiên của bạn.", - "@askSSSSVerify": { + "noBackupWarning": "Cẩn thận! Nếu không bật sao lưu trò chuyện, bạn sẽ mất quyền truy cập vào tin nhắn được mã hóa của mình. Chúng tôi khuyên bạn nên bật sao lưu trò chuyện trước khi đăng xuất.", + "@noBackupWarning": {}, + "doNotShowAgain": "Không hiện lại nữa", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Hội thoại trống (từng là {oldDisplayName})", + "@wasDirectChatDisplayName": { "type": "text", - "placeholders": {} + "placeholders": { + "oldDisplayName": {} + } }, - "areYouSureYouWantToLogout": "Bạn có chắc bạn muốn đăng xuất không?", - "@areYouSureYouWantToLogout": { + "reportErrorDescription": "😭 Ôi. Có lỗi xảy ra. Bạn có thể báo cáo lỗi tới nhà phát triển nếu muốn.", + "@reportErrorDescription": {}, + "profileNotFound": "Không tìm thấy người dùng này tại máy chủ. Có thể do lỗi kết nối hoặc người dùng không tồn tại.", + "@profileNotFound": {}, + "banUserDescription": "Người dùng sẽ bị cấm khỏi cuộc trò chuyện và không thể tham gia lại cho tới khi được gỡ cấm.", + "@banUserDescription": {}, + "learnMore": "Tìm hiểu thêm", + "@learnMore": {}, + "incomingMessages": "Tin nhắn đến", + "@incomingMessages": {}, + "encryptThisChat": "Mã hóa cuộc trò chuyện này", + "@encryptThisChat": {}, + "noOtherDevicesFound": "Không tìm thấy thiết bị khác", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Máy chủ báo cáo rằng tệp tin quá lớn để gửi.", + "@fileIsTooBigForServer": {}, + "signInWith": "Đăng nhập với {provider}", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "notAnImage": "Không phải tệp ảnh.", + "@notAnImage": {}, + "importNow": "Nhập vào", + "@importNow": {}, + "allSpaces": "Tất cả không gian", + "@allSpaces": {}, + "enterSpace": "Nhập không gian", + "@enterSpace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Hãy thử lại sau hoặc chọn 1 máy chủ khác.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "jumpToLastReadMessage": "Đi tới tin nhắn đã đọc mới nhất", + "@jumpToLastReadMessage": {}, + "commandHint_ignore": "Phớt lờ matrix ID này", + "@commandHint_ignore": {}, + "appLockDescription": "Khoá ứng dụng khi không dùng bằng mã pin", + "@appLockDescription": {}, + "notifyMeFor": "Bật thông báo cho", + "@notifyMeFor": {}, + "settings": "Cài đặt", + "@settings": { "type": "text", "placeholders": {} }, - "addEmail": "Thêm email", - "@addEmail": { + "sendSticker": "Gửi nhãn dán", + "@sendSticker": { "type": "text", "placeholders": {} - } + }, + "fileHasBeenSavedAt": "Tệp đã được lưu tại {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "readUpToHere": "Đọc tới đây", + "@readUpToHere": {}, + "jump": "Đi tới", + "@jump": {}, + "callingPermissions": "Quyền gọi điện", + "@callingPermissions": {}, + "numChats": "{number} cuộc hội thoại", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hidePresences": "Ẩn danh sách trạng thái?", + "@hidePresences": {}, + "sorryThatsNotPossible": "Xin lỗi... không khả dụng", + "@sorryThatsNotPossible": {}, + "reopenChat": "Mở lại cuộc trò chuyện", + "@reopenChat": {}, + "wrongPinEntered": "Nhập sai mã pin! Thử lại sau {seconds} giây...", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "archiveRoomDescription": "Cuộc trò chuyện sẽ được chuyển tới mục lưu trữ. Người dùng khác sẽ thấy được bạn đã rời khỏi cuộc trò chuyện.", + "@archiveRoomDescription": {}, + "kickUserDescription": "Người dùng bị đuổi khỏi cuộc trò chuyện nhưng không bị cấm. Trong các cuộc trò chuyện công khai, người dùng có thể vào lại bất cứ lúc nào.", + "@kickUserDescription": {}, + "unbanUserDescription": "Người dùng sẽ có thể vào lại cuộc trò chuyện nếu họ thử.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Thông báo đẩy không khả dụng", + "@pushNotificationsNotAvailable": {}, + "invite": "Mời", + "@invite": {}, + "invalidInput": "Dữ liệu nhập không hợp lệ!", + "@invalidInput": {}, + "removeDevicesDescription": "Bạn sẽ đăng xuất khỏi thiết bị này và không nhận được tin nhắn nữa.", + "@removeDevicesDescription": {}, + "noUsersFoundWithQuery": "Không tìm thấy người dùng nào với \"{query}\". Hãy kiểm tra xem bạn có nhập nhầm không.", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "commandHint_unignore": "Bỏ phớt lờ matrix ID này", + "@commandHint_unignore": {}, + "discover": "Khám phá", + "@discover": {}, + "stickers": "Nhãn dán", + "@stickers": {}, + "roomUpgradeDescription": "Cuộc trò chuyện sẽ được tạo lại với phiên bản phòng mới. Tất cả những người tham gia sẽ được thông báo rằng họ cần chuyển sang cuộc trò chuyện mới. Bạn có thể tìm hiểu thêm về các phiên bản phòng tại https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {} } diff --git a/assets/l10n/intl_zh.arb b/assets/l10n/intl_zh.arb index 95b2c0889c..0e93c1fbab 100644 --- a/assets/l10n/intl_zh.arb +++ b/assets/l10n/intl_zh.arb @@ -11,7 +11,7 @@ "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username} 已接受邀请", + "acceptedTheInvitation": "👍 {username} 接受了邀请", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -23,12 +23,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "账户信息", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} 激活了端到端加密", + "activatedEndToEndEncryption": "🔐 {username} 激活了端到端加密", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -40,16 +35,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "添加一条群组介绍", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "添加新的好友", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "管理员", "@admin": { "type": "text", @@ -65,12 +50,7 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "已经有账户了?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "已开始与 {senderName} 通话", + "answeredTheCall": "{senderName} 接听了通话", "@answeredTheCall": { "type": "text", "placeholders": { @@ -92,69 +72,34 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "已存档的聊天室", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "是否允许游客加入", + "areGuestsAllowedToJoin": "是否允许访客加入", "@areGuestsAllowedToJoin": { "type": "text", "placeholders": {} }, - "areYouSure": "您确定吗?", + "areYouSure": "你确定吗?", "@areYouSure": { "type": "text", "placeholders": {} }, - "areYouSureYouWantToLogout": "您确定要注销吗?", + "areYouSureYouWantToLogout": "你确定要注销吗?", "@areYouSureYouWantToLogout": { "type": "text", "placeholders": {} }, - "askSSSSCache": "请输入您的安全存储密码或恢复密钥以存储密钥。", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "请输入您的安全存储的密码短语或恢复密钥,以向对方签名。", + "askSSSSSign": "请输入你的安全存储的密码短语或恢复密钥,以向对方签名。", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "请输入安全存储密码或恢复密钥以验证您的会话。", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "是否接受来自 {username} 的验证申请?", + "askVerificationRequest": "是否接受来自 {username} 的验证请求?", "@askVerificationRequest": { "type": "text", "placeholders": { "username": {} } }, - "audioPlayerPause": "暂停", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "播放", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "身份验证", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "头像已更改", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "主服务器支持的登录方式:\n{serverVersions}\n但本应用仅支持:\n{supportedVersions}", + "badServerLoginTypesException": "主服务器支持的登录方式:\n{serverVersions}\n但此应用仅支持:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", "placeholders": { @@ -162,7 +107,7 @@ "supportedVersions": {} } }, - "badServerVersionsException": "主服务器支持的 Spec 版本:\n{serverVersions}\n但本应用仅支持 {supportedVersions} 版本", + "badServerVersionsException": "主服务器支持的 Spec 版本:\n{serverVersions}\n但此应用仅支持 {supportedVersions} 版本", "@badServerVersionsException": { "type": "text", "placeholders": { @@ -170,12 +115,12 @@ "supportedVersions": {} } }, - "banFromChat": "从对话中封禁", + "banFromChat": "从聊天中封禁", "@banFromChat": { "type": "text", "placeholders": {} }, - "banned": "已被封禁", + "banned": "已封禁", "@banned": { "type": "text", "placeholders": {} @@ -203,11 +148,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "密钥已缓存", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "取消", "@cancel": { "type": "text", @@ -218,7 +158,7 @@ "type": "text", "placeholders": {} }, - "changedTheChatAvatar": "{username} 更改了会话头像", + "changedTheChatAvatar": "{username} 更改了聊天头像", "@changedTheChatAvatar": { "type": "text", "placeholders": { @@ -241,14 +181,14 @@ "chatname": {} } }, - "changedTheChatPermissions": "{username} 更改了会话权限", + "changedTheChatPermissions": "{username} 更改了聊天权限", "@changedTheChatPermissions": { "type": "text", "placeholders": { "username": {} } }, - "changedTheDisplaynameTo": "{username} 将展示名称更改为:'{displayname}'", + "changedTheDisplaynameTo": "{username} 将昵称更改为:'{displayname}'", "@changedTheDisplaynameTo": { "type": "text", "placeholders": { @@ -256,14 +196,14 @@ "displayname": {} } }, - "changedTheGuestAccessRules": "{username} 更改了游客访问规则", + "changedTheGuestAccessRules": "{username} 更改了访客访问规则", "@changedTheGuestAccessRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheGuestAccessRulesTo": "{username} 更改了游客访问规则为:{rules}", + "changedTheGuestAccessRulesTo": "{username} 更改了访客访问规则为:{rules}", "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { @@ -271,14 +211,14 @@ "rules": {} } }, - "changedTheHistoryVisibility": "{username} 更改了历史记录观察状态", + "changedTheHistoryVisibility": "{username} 更改了历史记录可见性", "@changedTheHistoryVisibility": { "type": "text", "placeholders": { "username": {} } }, - "changedTheHistoryVisibilityTo": "{username} 更改了历史记录观察状态到:{rules}", + "changedTheHistoryVisibilityTo": "{username} 更改了历史记录可见性为:{rules}", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -322,21 +262,11 @@ "username": {} } }, - "changelog": "更改记录", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "更改密码", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "更改已被保存", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "更改主服务器", "@changeTheHomeserver": { "type": "text", @@ -347,22 +277,12 @@ "type": "text", "placeholders": {} }, - "changeTheNameOfTheGroup": "更改了群组名称", + "changeTheNameOfTheGroup": "更改群组名称", "@changeTheNameOfTheGroup": { "type": "text", "placeholders": {} }, - "changeTheServer": "更改服务器", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "更改壁纸", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "更改您的头像", + "changeYourAvatar": "更改你的头像", "@changeYourAvatar": { "type": "text", "placeholders": {} @@ -372,7 +292,7 @@ "type": "text", "placeholders": {} }, - "chat": "会话", + "chat": "聊天", "@chat": { "type": "text", "placeholders": {} @@ -382,12 +302,12 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "您的旧信息受恢复密钥保护。请确保您不会丢失它。", + "chatBackupDescription": "你的旧消息受恢复密钥保护。请确保你不会丢失它。", "@chatBackupDescription": { "type": "text", "placeholders": {} }, - "chatDetails": "会话详情", + "chatDetails": "聊天详情", "@chatDetails": { "type": "text", "placeholders": {} @@ -402,24 +322,14 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "输入一个昵称", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, "clearArchive": "清除存档", "@clearArchive": {}, - "clearText": "清除文本", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "关闭", "@close": { "type": "text", "placeholders": {} }, - "commandHint_ban": "在此聊天室封禁该用户", + "commandHint_ban": "在此聊天室封禁指定用户", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -429,22 +339,22 @@ "type": "text", "description": "Usage hint for the command /html" }, - "commandHint_invite": "邀请该用户加入此聊天室", + "commandHint_invite": "邀请指定用户加入此聊天室", "@commandHint_invite": { "type": "text", "description": "Usage hint for the command /invite" }, - "commandHint_join": "加入该聊天室", + "commandHint_join": "加入指定聊天室", "@commandHint_join": { "type": "text", "description": "Usage hint for the command /join" }, - "commandHint_kick": "将该用户移出此聊天室", + "commandHint_kick": "在此聊天室移除指定用户", "@commandHint_kick": { "type": "text", "description": "Usage hint for the command /kick" }, - "commandHint_leave": "退出该聊天室", + "commandHint_leave": "退出此聊天室", "@commandHint_leave": { "type": "text", "description": "Usage hint for the command /leave" @@ -454,17 +364,17 @@ "type": "text", "description": "Usage hint for the command /me" }, - "commandHint_myroomavatar": "设置您的聊天室头像(通过 mxc-uri)", + "commandHint_myroomavatar": "设置你在此聊天室的头像(通过 mxc-uri)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" }, - "commandHint_myroomnick": "设置您的聊天室昵称", + "commandHint_myroomnick": "设置你在此聊天室的昵称", "@commandHint_myroomnick": { "type": "text", "description": "Usage hint for the command /myroomnick" }, - "commandHint_op": "设置该用户的权限等级(默认:50)", + "commandHint_op": "设置指定用户的权限等级(默认:50)", "@commandHint_op": { "type": "text", "description": "Usage hint for the command /op" @@ -474,7 +384,7 @@ "type": "text", "description": "Usage hint for the command /plain" }, - "commandHint_react": "将回复作为响应发送", + "commandHint_react": "将回复作为回应发送", "@commandHint_react": { "type": "text", "description": "Usage hint for the command /react" @@ -484,7 +394,7 @@ "type": "text", "description": "Usage hint for the command /send" }, - "commandHint_unban": "在此聊天室解封该用户", + "commandHint_unban": "在此聊天室解封指定用户", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" @@ -501,12 +411,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "对比并确认这些表情匹配其他那些设备:", + "compareEmojiMatch": "请比较表情符号", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "比较以下数字,确保它们和另一设备上的相同:", + "compareNumbersMatch": "请比较以下数字", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -526,17 +436,12 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "连接尝试失败", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "联系人已被邀请至群组", "@contactHasBeenInvitedToTheGroup": { "type": "text", "placeholders": {} }, - "containsDisplayName": "包含显示名称", + "containsDisplayName": "包含昵称", "@containsDisplayName": { "type": "text", "placeholders": {} @@ -551,11 +456,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "内容查看器", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "已复制到剪贴板", "@copiedToClipboard": { "type": "text", @@ -571,23 +471,13 @@ "type": "text", "placeholders": {} }, - "couldNotDecryptMessage": "不能解密消息:{error}", + "couldNotDecryptMessage": "不能解密消息: {error}", "@couldNotDecryptMessage": { "type": "text", "placeholders": { "error": {} } }, - "couldNotSetAvatar": "不能设定头像", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "不能设定显示名称", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, "countParticipants": "{count} 名参与者", "@countParticipants": { "type": "text", @@ -600,33 +490,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "现在创建账户", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} 创建了聊天", + "createdTheChat": "💬 {username} 创建了聊天", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "创建新群组", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "交叉签名未启用", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "交叉签名已启用", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "目前活跃", "@currentlyActive": { "type": "text", @@ -662,12 +532,12 @@ "day": {} } }, - "deactivateAccountWarning": "这将停用您的用户账户。这不能被撤销,您确定吗?", + "deactivateAccountWarning": "这将停用你的用户账户。这不能被撤销!你确定吗?", "@deactivateAccountWarning": { "type": "text", "placeholders": {} }, - "defaultPermissionLevel": "默认权限级别", + "defaultPermissionLevel": "新用户默认权限级别", "@defaultPermissionLevel": { "type": "text", "placeholders": {} @@ -687,11 +557,6 @@ "type": "text", "placeholders": {} }, - "deny": "否认", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "设备", "@device": { "type": "text", @@ -707,41 +572,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "加密仅在所有设备都被验证时才安全。", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "一对一聊天", + "directChats": "私聊", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "丢弃图片", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "探索", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "发现群组", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "显示名称已被改变", + "displaynameHasBeenChanged": "昵称已更改", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "捐助", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "下载文件", "@downloadFile": { "type": "text", @@ -752,26 +592,16 @@ "type": "text", "placeholders": {} }, - "editBlockedServers": "编辑被阻止的服务器", + "editBlockedServers": "编辑被屏蔽的服务器", "@editBlockedServers": { "type": "text", "placeholders": {} }, - "editChatPermissions": "编辑聊天权限", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "编辑显示名称", + "editDisplayname": "编辑昵称", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "编辑 Jitsi 实例", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAliases": "编辑聊天室别名", "@editRoomAliases": { "type": "text", @@ -807,7 +637,7 @@ "type": "text", "placeholders": {} }, - "emoteWarnNeedToPick": "您需要选择一个表情快捷码和一张图片!", + "emoteWarnNeedToPick": "你需要选择一个表情快捷码和一张图片!", "@emoteWarnNeedToPick": { "type": "text", "placeholders": {} @@ -817,11 +647,6 @@ "type": "text", "placeholders": {} }, - "enableChatBackup": "启用聊天记录备份以确保不会丢失您的聊天记录。", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, "enableEmotesGlobally": "在全局启用表情包", "@enableEmotesGlobally": { "type": "text", @@ -832,12 +657,12 @@ "type": "text", "placeholders": {} }, - "enableEncryptionWarning": "您之后将无法停用加密,确定吗?", + "enableEncryptionWarning": "你之后将无法停用加密,确定吗?", "@enableEncryptionWarning": { "type": "text", "placeholders": {} }, - "encrypted": "加密的", + "encrypted": "已加密", "@encrypted": { "type": "text", "placeholders": {} @@ -847,21 +672,11 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "加密算法", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "加密未启用", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "端到端加密设置", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, "endedTheCall": "{senderName} 结束了通话", "@endedTheCall": { "type": "text", @@ -869,22 +684,12 @@ "senderName": {} } }, - "enterAGroupName": "输入群组名称", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "输入一个电子邮件地址", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "输入用户名", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "输入您的主服务器地址", + "enterYourHomeserver": "输入你的主服务器地址", "@enterYourHomeserver": { "type": "text", "placeholders": {} @@ -904,11 +709,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "文件大小", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -924,16 +724,6 @@ "type": "text", "placeholders": {} }, - "friday": "星期五", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "好友", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "自加入起", "@fromJoining": { "type": "text", @@ -954,16 +744,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "群组描述", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "群组描述已被更改", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "群组是公开的", "@groupIsPublic": { "type": "text", @@ -974,19 +754,19 @@ "type": "text", "placeholders": {} }, - "groupWith": "名称为{displayname}的群组", + "groupWith": "名称为 {displayname} 的群组", "@groupWith": { "type": "text", "placeholders": { "displayname": {} } }, - "guestsAreForbidden": "游客被禁止", + "guestsAreForbidden": "访客禁止加入", "@guestsAreForbidden": { "type": "text", "placeholders": {} }, - "guestsCanJoin": "游客可以加入", + "guestsCanJoin": "访客可以加入", "@guestsCanJoin": { "type": "text", "placeholders": {} @@ -1004,21 +784,16 @@ "type": "text", "placeholders": {} }, - "hideRedactedEvents": "隐藏编辑事件", + "hideRedactedEvents": "隐藏已删除的事件", "@hideRedactedEvents": { "type": "text", "placeholders": {} }, - "hideUnknownEvents": "隐藏未知事件", + "hideUnknownEvents": "隐藏未知的事件", "@hideUnknownEvents": { "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "主服务器不兼容", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "这些内容有多令人反感?", "@howOffensiveIsThisContent": { "type": "text", @@ -1044,16 +819,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "您可以忽略打扰您的用户。您将不会收到来自忽略列表中用户的任何消息或聊天室邀请。", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "忽略用户名", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "我已经点击了链接", "@iHaveClickedOnLink": { "type": "text", @@ -1069,11 +834,6 @@ "type": "text", "placeholders": {} }, - "invalidEmail": "无效的电子邮件", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, "inviteContact": "邀请联系人", "@inviteContact": { "type": "text", @@ -1091,7 +851,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username} 邀请了 {targetName}", + "invitedUser": "📩 {username} 邀请了 {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -1104,12 +864,12 @@ "type": "text", "placeholders": {} }, - "inviteForMe": "来自我的邀请", + "inviteForMe": "发给我的邀请", "@inviteForMe": { "type": "text", "placeholders": {} }, - "inviteText": "{username} 邀请您使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开该邀请链接:{link}", + "inviteText": "{username} 邀请你使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开邀请链接:\n {link}", "@inviteText": { "type": "text", "placeholders": { @@ -1117,17 +877,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "下列设备密钥是否正确?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "正在输入…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username} 加入了聊天", + "joinedTheChat": "👋 {username} 加入了聊天", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1139,17 +894,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "密钥已被缓存", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "密钥缺失", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} 踢了 {targetName}", + "kicked": "👞 {username} 踢出了 {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1157,7 +902,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username} 踢了 {targetName} 并将其封禁", + "kickedAndBanned": "🙅 {username} 踢出并封禁了 {targetName}", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1177,16 +922,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "上次使用的IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "很长时间未上线", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "离开", "@leave": { "type": "text", @@ -1236,39 +971,17 @@ "homeserver": {} } }, - "loginWith": "使用 {brand} 登录", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, "logout": "注销", "@logout": { "type": "text", "placeholders": {} }, - "makeAModerator": "创建监管者", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "创建管理员", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "确保识别码正确", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "成员变更", "@memberChanges": { "type": "text", "placeholders": {} }, - "mention": "提到", + "mention": "提及", "@mention": { "type": "text", "placeholders": {} @@ -1278,34 +991,17 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "消息将对所有参与者移除", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "监管者", + "moderator": "协管员", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "星期一", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 个更多事件} other{{count} 个更多事件}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "将该聊天静音", + "muteChat": "静音聊天", "@muteChat": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "请注意当前您需要Pantalaimon以使用端到端加密功能。", + "needPantalaimonWarning": "请注意当前你需要 Pantalaimon 以使用端到端加密功能。", "@needPantalaimonWarning": { "type": "text", "placeholders": {} @@ -1315,7 +1011,7 @@ "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "来自 FluffyChat 的新消息", + "newMessageInFluffyChat": "💬 FluffyChat 新消息", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1330,52 +1026,37 @@ "type": "text", "placeholders": {} }, - "no": "不", + "no": "否", "@no": { "type": "text", "placeholders": {} }, - "noConnectionToTheServer": "未与服务器建立连接", + "noConnectionToTheServer": "无法连接服务器", "@noConnectionToTheServer": { "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "Fluffychat 目前不支持启用交叉签名。请在 Element 中启用。", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "没有说明", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "未找到表情。😕", "@noEmotesFound": { "type": "text", "placeholders": {} }, - "noEncryptionForPublicRooms": "您只能在聊天室不可被公众访问时才能启用加密。", + "noEncryptionForPublicRooms": "你只能在聊天室不可被公众访问时才能启用加密。", "@noEncryptionForPublicRooms": { "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "看起来您手机上没有谷歌服务框架。这对保护您的隐私而言是个好决定!要接收 FluffyChat 的推送通知,推荐您使用 https://microg.org/ 或 https://unifiedpush.org/。", + "noGoogleServicesWarning": "看起来你手机上没有 Firebase Cloud Messaging。如果仍希望接收 FluffyChat 的推送通知,推荐安装 ntfy。借助 ntfy 或另一个 Unified Push 程序,你可以以一种数据安全的方式接收推送通知。你可以从 PlayStore 或 F-Droid 商店下载 ntfy。", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "FluffyChat 目前不支持启用在线密钥备份。请在 Element 中启用。", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "无", "@none": { "type": "text", "placeholders": {} }, - "noPasswordRecoveryDescription": "您尚未添加恢复密码的方法。", + "noPasswordRecoveryDescription": "你尚未添加恢复密码的方法。", "@noPasswordRecoveryDescription": { "type": "text", "placeholders": {} @@ -1385,21 +1066,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "没有找到公共聊天室…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, "noRoomsFound": "未找到聊天室…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "目前还没有发现任何状态。", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "通知", "@notifications": { "type": "text", @@ -1410,18 +1081,6 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "在网页版不支持", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} 已选择", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, "numUsersTyping": "{count} 人正在输入…", "@numUsersTyping": { "type": "text", @@ -1449,11 +1108,6 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "在线密钥备份被停用", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "在线密钥备份已启用", "@onlineKeyBackupEnabled": { "type": "text", @@ -1479,16 +1133,6 @@ "type": "text", "placeholders": {} }, - "optionalAddEmail": "(可选) 您的电子邮件地址", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(可选) 群组名称", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "or": "或", "@or": { "type": "text", @@ -1499,11 +1143,6 @@ "type": "text", "placeholders": {} }, - "participatingUserDevices": "参与者的设备", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "密码短语或恢复密钥", "@passphraseOrKey": { "type": "text", @@ -1539,7 +1178,7 @@ "type": "text", "placeholders": {} }, - "pin": "固定", + "pin": "置顶", "@pin": { "type": "text", "placeholders": {} @@ -1561,11 +1200,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "请选择用户名", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "请点击电子邮件中的链接,然后继续。", "@pleaseClickOnLink": { "type": "text", @@ -1576,27 +1210,17 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "请输入 Matrix ID。", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "请键入您的安全密钥:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "请输入您的密码", + "pleaseEnterYourPassword": "请输入你的密码", "@pleaseEnterYourPassword": { "type": "text", "placeholders": {} }, - "pleaseEnterYourPin": "请输入您的 PIN", + "pleaseEnterYourPin": "请输入你的 PIN", "@pleaseEnterYourPin": { "type": "text", "placeholders": {} }, - "pleaseEnterYourUsername": "请输入您的用户名", + "pleaseEnterYourUsername": "请输入你的用户名", "@pleaseEnterYourUsername": { "type": "text", "placeholders": {} @@ -1611,16 +1235,6 @@ "type": "text", "placeholders": {} }, - "publicGroups": "公共群组", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "公钥", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "公开聊天室", "@publicRooms": { "type": "text", @@ -1641,14 +1255,14 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username} 编辑了一个事件", + "redactedAnEvent": "{username} 删除了一个事件", "@redactedAnEvent": { "type": "text", "placeholders": { "username": {} } }, - "redactMessage": "重新编辑信息", + "redactMessage": "删除消息", "@redactMessage": { "type": "text", "placeholders": {} @@ -1680,12 +1294,12 @@ "type": "text", "placeholders": {} }, - "removeAllOtherDevices": "移除其他全部设备", + "removeAllOtherDevices": "移除所有其它设备", "@removeAllOtherDevices": { "type": "text", "placeholders": {} }, - "removedBy": "被{username}移除", + "removedBy": "被 {username} 移除", "@removedBy": { "type": "text", "placeholders": { @@ -1697,17 +1311,12 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "解禁聊天", + "unbanFromChat": "从聊天中解封", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "移除消息", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "移除您的头像", + "removeYourAvatar": "移除你的头像", "@removeYourAvatar": { "type": "text", "placeholders": {} @@ -1717,7 +1326,7 @@ "type": "text", "placeholders": {} }, - "replaceRoomWithNewerVersion": "用较新的版本替换聊天室", + "replaceRoomWithNewerVersion": "更新聊天室至新版本", "@replaceRoomWithNewerVersion": { "type": "text", "placeholders": {} @@ -1737,16 +1346,6 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "请求读取旧的消息", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "撤销全部权限", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "聊天室已升级", "@roomHasBeenUpgraded": { "type": "text", @@ -1757,53 +1356,21 @@ "type": "text", "placeholders": {} }, - "saturday": "星期六", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "保存文件为 {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, "saveFile": "保存文件", "@saveFile": { "type": "text", "placeholders": {} }, - "saveFileToFolder": "将文件保存到此文件夹", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, "search": "搜索", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "搜索聊天室", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "安全", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "安全密钥", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "丢失安全密钥?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, "seenByUser": "被 {username} 看见", "@seenByUser": { "type": "text", @@ -1811,22 +1378,6 @@ "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{被 {username} 和 {count} 个其他人看见}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "被 {username} 和 {username2} 看见", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "发送", "@send": { "type": "text", @@ -1846,11 +1397,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "允许向 sentry.io 发送错误报告", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "发送文件", "@sendFile": { "type": "text", @@ -1881,35 +1427,35 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username} 发送了文件", + "sentAFile": "📁{username} 发送了文件", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username} 发送了音频", + "sentAnAudio": "🎤{username} 发送了音频", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username} 发送了图片", + "sentAPicture": "🖼️ {username} 发送了图片", "@sentAPicture": { "type": "text", "placeholders": { "username": {} } }, - "sentASticker": "{username} 发送了贴纸", + "sentASticker": "😊 {username} 发送了贴纸", "@sentASticker": { "type": "text", "placeholders": { "username": {} } }, - "sentAVideo": "{username} 发送了视频", + "sentAVideo": "🎥 {username} 发送了视频", "@sentAVideo": { "type": "text", "placeholders": { @@ -1923,21 +1469,6 @@ "senderName": {} } }, - "sentryInfo": "关于您隐私的信息: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "会话已验证", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "设置个人资料图片", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, "setAsCanonicalAlias": "设为主要别名", "@setAsCanonicalAlias": { "type": "text", @@ -1948,11 +1479,6 @@ "type": "text", "placeholders": {} }, - "setGroupDescription": "设置群组描述", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, "setInvitationLink": "设置邀请链接", "@setInvitationLink": { "type": "text", @@ -1990,11 +1516,6 @@ "type": "text", "placeholders": {} }, - "signUp": "注册", - "@signUp": { - "type": "text", - "placeholders": {} - }, "singlesignon": "单点登录", "@singlesignon": { "type": "text", @@ -2005,11 +1526,6 @@ "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "声音、振动和 LED 颜色", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "源代码", "@sourceCode": { "type": "text", @@ -2022,17 +1538,12 @@ "senderName": {} } }, - "startYourFirstChat": "现在开始您的第一个聊天!🙂\n- 点击“新聊天”按钮\n- 输入好友的二维码\n- 聊得开心", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "状态", "@status": { "type": "text", "placeholders": {} }, - "statusExampleMessage": "您今天怎么样?", + "statusExampleMessage": "你今天怎么样?", "@statusExampleMessage": { "type": "text", "placeholders": {} @@ -2042,11 +1553,6 @@ "type": "text", "placeholders": {} }, - "sunday": "星期日", - "@sunday": { - "type": "text", - "placeholders": {} - }, "synchronizingPleaseWait": "同步中…请等待。", "@synchronizingPleaseWait": { "type": "text", @@ -2057,21 +1563,6 @@ "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "点选一部设备进行验证", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "点击以显示图片", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "点击以显示菜单", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "它们不匹配", "@theyDontMatch": { "type": "text", @@ -2082,26 +1573,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "该聊天室已被归档。", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "星期四", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{suffix} {hours12}时{minutes}分", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -2123,12 +1594,12 @@ "type": "text", "placeholders": {} }, - "tooManyRequestsWarning": "请求太多。请稍后再试!", + "tooManyRequestsWarning": "请求过多。请稍后再试!", "@tooManyRequestsWarning": { "type": "text", "placeholders": {} }, - "transferFromAnotherDevice": "从其他设备传输", + "transferFromAnotherDevice": "从其它设备传输", "@transferFromAnotherDevice": { "type": "text", "placeholders": {} @@ -2138,11 +1609,6 @@ "type": "text", "placeholders": {} }, - "tuesday": "星期二", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "不可用", "@unavailable": { "type": "text", @@ -2156,7 +1622,7 @@ "targetName": {} } }, - "unblockDevice": "解锁设备", + "unblockDevice": "解除屏蔽设备", "@unblockDevice": { "type": "text", "placeholders": {} @@ -2178,45 +1644,23 @@ "type": {} } }, - "unknownSessionVerify": "未知会话,请验证", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "解锁聊天记录备份", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "解除聊天的静音", + "unmuteChat": "取消静音聊天", "@unmuteChat": { "type": "text", "placeholders": {} }, - "unpin": "取消固定", + "unpin": "取消置顶", "@unpin": { "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} 个未读聊天}}", + "unreadChats": "{unreadCount, plural, =1{1 个未读聊天} other{{unreadCount} 个未读聊天}}", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} 条未读消息}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "使用适合 AMOLED 屏的颜色?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, "userAndOthersAreTyping": "{username} 和其他 {count} 人正在输入…", "@userAndOthersAreTyping": { "type": "text", @@ -2240,7 +1684,7 @@ "username": {} } }, - "userLeftTheChat": "{username} 离开了聊天", + "userLeftTheChat": "🚪{username} 离开了聊天", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2252,11 +1696,6 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "用户未验证", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, "userSentUnknownEvent": "{username} 发送了一个 {type} 事件", "@userSentUnknownEvent": { "type": "text", @@ -2265,56 +1704,31 @@ "type": {} } }, - "userUnknownVerification": "用户的验证状态未知", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "用户已验证", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "已验证", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "成功验证会话!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "验证", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "手动验证", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "开始验证", "@verifyStart": { "type": "text", "placeholders": {} }, - "verifySuccess": "您已成功验证!", + "verifySuccess": "你已成功验证!", "@verifySuccess": { "type": "text", "placeholders": {} }, - "verifyTitle": "验证其他账户", + "verifyTitle": "验证其它账户", "@verifyTitle": { "type": "text", "placeholders": {} }, - "verifyUser": "验证用户", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "视频通话", "@videoCall": { "type": "text", @@ -2355,7 +1769,7 @@ "type": "text", "placeholders": {} }, - "wallpaper": "壁纸", + "wallpaper": "壁纸:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2365,22 +1779,7 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "端到端加密目前在测试阶段!请自行承担风险!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "星期三", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "欢迎来到 Matrix 网络中最可爱的即时通讯应用。", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "我们向您发送了一封电子邮件", + "weSentYouAnEmail": "我们向你发送了一封电子邮件", "@weSentYouAnEmail": { "type": "text", "placeholders": {} @@ -2390,22 +1789,22 @@ "type": "text", "placeholders": {} }, - "whoIsAllowedToJoinThisGroup": "谁被允许加入本群组", + "whoIsAllowedToJoinThisGroup": "谁可以加入此群组", "@whoIsAllowedToJoinThisGroup": { "type": "text", "placeholders": {} }, - "whyDoYouWantToReportThis": "您举报的理由是什么?", + "whyDoYouWantToReportThis": "你举报的理由是什么?", "@whyDoYouWantToReportThis": { "type": "text", "placeholders": {} }, - "wipeChatBackup": "确定要清除您的聊天记录备份以创建新的恢复密钥吗?", + "wipeChatBackup": "确定要清除你的聊天记录备份以创建新的恢复密钥吗?", "@wipeChatBackup": { "type": "text", "placeholders": {} }, - "withTheseAddressesRecoveryDescription": "通过这些地址,您可以恢复密码。", + "withTheseAddressesRecoveryDescription": "通过这些地址,你可以恢复密码。", "@withTheseAddressesRecoveryDescription": { "type": "text", "placeholders": {} @@ -2420,76 +1819,39 @@ "type": "text", "placeholders": {} }, - "you": "您", + "you": "你", "@you": { "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "您被邀请到该聊天", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "您已不再参与此聊天", + "youAreNoLongerParticipatingInThisChat": "你已不再参与此聊天", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "您不能邀请您自己", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "您已被该聊天封禁", + "youHaveBeenBannedFromThisChat": "你已被此聊天封禁", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourChatsAreBeingSynced": "正在同步您的聊天…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "您自己的用户名", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "您的公钥", + "yourPublicKey": "你的公钥", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "您将连接到 {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "放大", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "缩小", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "allChats": "所有会话", + "allChats": "所有聊天", "@allChats": { "type": "text", "placeholders": {} }, - "addToSpace": "加入空间", + "addToSpace": "添加到空间", "@addToSpace": {}, "obtainingLocation": "获取位置中…", "@obtainingLocation": { "type": "text", "placeholders": {} }, - "noMatrixServer": "{server1} 不是一个Matrix服务器,试试{server2}?", + "noMatrixServer": "{server1} 不是一个 Matrix 服务器,试试 {server2}?", "@noMatrixServer": { "type": "text", "placeholders": { @@ -2497,12 +1859,12 @@ "server2": {} } }, - "locationPermissionDeniedNotice": "位置权限被拒绝.请授予此权限以分享你的位置.", + "locationPermissionDeniedNotice": "位置权限被拒绝。请授予此权限以分享你的位置.", "@locationPermissionDeniedNotice": { "type": "text", "placeholders": {} }, - "locationDisabledNotice": "位置服务已禁用.请启用此服务以分享你的位置.", + "locationDisabledNotice": "位置服务已禁用。请启用此服务以分享你的位置.", "@locationDisabledNotice": { "type": "text", "placeholders": {} @@ -2514,19 +1876,12 @@ "error": {} } }, - "enterASpacepName": "输入空间名称", - "@enterASpacepName": {}, - "dontAskAgain": "取消并不再询问", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, "createNewSpace": "创建新空间", "@createNewSpace": { "type": "text", "placeholders": {} }, - "cantOpenUri": "无法打开URI {uri}", + "cantOpenUri": "无法打开 URI {uri}", "@cantOpenUri": { "type": "text", "placeholders": { @@ -2553,11 +1908,6 @@ "type": "text", "placeholders": {} }, - "publicSpace": "公共空间", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, "openInMaps": "在地图中打开", "@openInMaps": { "type": "text", @@ -2565,69 +1915,35 @@ }, "sendOnEnter": "按 Enter 键发送", "@sendOnEnter": {}, - "passwordsDoNotMatch": "密码不匹配!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "请至少输入 {min} 个字符。", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "createNewChatExplaination": "请他人扫描上方二维码以开始新的聊天,若他人无法扫码,您可以直接点击二维码分享您的邀请链接。", - "@createNewChatExplaination": {}, - "yourChatBackupHasBeenSetUp": "您的聊天记录备份已设置。", + "yourChatBackupHasBeenSetUp": "你的聊天记录备份已设置。", "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "为了保护您的信息,我们为您生成了一个恢复密钥。\n请将其保存在安全的地方,如密码管理器中。", - "@setupChatBackupDescription": {}, "scanQrCode": "扫描二维码", "@scanQrCode": {}, - "chatHasBeenAddedToThisSpace": "会话已添加到此空间", + "chatHasBeenAddedToThisSpace": "聊天已添加到此空间", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "会话已从此空间移除", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, "homeserver": "服务器", "@homeserver": {}, - "newPasswordDescription": "若您要使用密码重置功能,您在注册之后需要给账户添加一个电子邮件地址。", - "@newPasswordDescription": {}, - "oneClientLoggedOut": "您的一个客户端已登出", + "oneClientLoggedOut": "你的一个客户端已登出", "@oneClientLoggedOut": {}, "removeFromBundle": "从此集合中移除", "@removeFromBundle": {}, - "unverified": "未认证", + "unverified": "未经验证", "@unverified": {}, - "pleaseEnterValidEmail": "请输入一个有效的电子邮件地址。", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "再次输入密码", + "repeatPassword": "重复输入密码", "@repeatPassword": {}, - "yourUserId": "您的 ID:", - "@yourUserId": {}, - "setupChatBackup": "设置聊天记录备份", - "@setupChatBackup": {}, - "iWroteDownTheKey": "我已经记下了密钥", - "@iWroteDownTheKey": {}, - "shareYourInviteLink": "分享您的邀请链接", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "手动输入邀请链接…", - "@typeInInviteLinkManually": {}, - "newUsernameDescription": "您的 ID 格式为 @username:servername", - "@newUsernameDescription": {}, "addAccount": "添加账户", "@addAccount": {}, - "editBundlesForAccount": "编辑该账户的集合", + "editBundlesForAccount": "编辑此账户的集合", "@editBundlesForAccount": {}, - "enableMultiAccounts": "(测试功能)在本设备上添加多个账户", + "enableMultiAccounts": "(测试功能)在此设备上添加多个账户", "@enableMultiAccounts": {}, - "addToBundle": "添加到集合中", + "addToBundle": "添加到集合", "@addToBundle": {}, "bundleName": "集合名称", "@bundleName": {}, "link": "链接", "@link": {}, - "serverRequiresEmail": "此服务器需要验证您的电子邮件地址以进行注册。", + "serverRequiresEmail": "此服务器需要验证你的电子邮件地址以进行注册。", "@serverRequiresEmail": {}, "messageType": "消息类型", "@messageType": {}, @@ -2639,19 +1955,9 @@ "@messageInfo": {}, "time": "时间", "@time": {}, - "loginWithOneClick": "一键登录", - "@loginWithOneClick": {}, "addToSpaceDescription": "选择一个空间以添加此聊天。", "@addToSpaceDescription": {}, - "setupChatBackupNow": "立即设置您的聊天备份", - "@setupChatBackupNow": {}, - "removeFromSpaceDescription": "这将从当前空间中删除此聊天。 但它仍在“所有聊天”下可见。", - "@removeFromSpaceDescription": {}, - "pleaseEnterSecurityKeyDescription": "要解锁您的聊天备份,请输入您在之前会话中生成的安全密钥。 您的安全密钥不是您的密码。", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "立即保存安全密钥", - "@saveTheSecurityKeyNow": {}, - "removeFromSpace": "从空间删除", + "removeFromSpace": "从此空间中移除", "@removeFromSpace": {}, "start": "开始", "@start": {}, @@ -2660,7 +1966,7 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_dm": "启动一对一聊天\n使用 --no-encryption 选项来禁用加密", + "commandHint_dm": "创建私聊\n使用 --no-encryption 选项来禁用加密", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2680,20 +1986,8 @@ "type": "text", "placeholders": {} }, - "addToStory": "添加到 Story", - "@addToStory": {}, "publish": "发布", "@publish": {}, - "whoCanSeeMyStories": "谁能看到我的 Story?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "取消 Story 订阅", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "该用户尚未在 Story 发布任何内容", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "你的 Story", - "@yourStory": {}, - "replyHasBeenSent": "已发送回复", - "@replyHasBeenSent": {}, "videoWithSize": "视频 ({size})", "@videoWithSize": { "type": "text", @@ -2701,30 +1995,7 @@ "size": {} } }, - "storyFrom": "自 {date} 起的 Story: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "请注意,人们可以在你的 Story 中看到彼此并相互联系。", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "发生什么事了?", - "@whatIsGoingOn": {}, - "addDescription": "添加描述", - "@addDescription": {}, - "bubbleSize": "气泡大小", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "storyPrivacyWarning": "请注意,人们可以在你的 Story 中看到和联系彼此。您的故事在 24 小时内可见,但不能保证它们将从所有设备和服务器上删除。", - "@storyPrivacyWarning": {}, - "iUnderstand": "我了解", - "@iUnderstand": {}, - "dismiss": "驳回", + "dismiss": "忽略", "@dismiss": {}, "markAsRead": "标为已读", "@markAsRead": {}, @@ -2732,13 +2003,7 @@ "@reportUser": {}, "openChat": "打开聊天", "@openChat": {}, - "matrixWidgets": "Matrix 小部件", - "@matrixWidgets": {}, - "integrationsNotImplemented": "尚无法编辑小部件和集成。", - "@integrationsNotImplemented": {}, - "editIntegrations": "编辑小部件和集成", - "@editIntegrations": {}, - "reactedWith": "{sender} 通过 {reaction} 进行了回应", + "reactedWith": "{sender} 回应了 {reaction}", "@reactedWith": { "type": "text", "placeholders": { @@ -2746,13 +2011,11 @@ "reaction": {} } }, - "pinnedEventsError": "加载置顶消息时出错", - "@pinnedEventsError": {}, - "confirmEventUnpin": "你确定要永久性取消置顶这一活动吗?", + "confirmEventUnpin": "你确定要永久性取消置顶此事件吗?", "@confirmEventUnpin": {}, "pinMessage": "置顶到聊天室", "@pinMessage": {}, - "emojis": "颜文字", + "emojis": "表情符号", "@emojis": {}, "unsupportedAndroidVersionLong": "这个功能需要较新版本的 Android 系统。请检查更新或 Lineage OS 支持。", "@unsupportedAndroidVersionLong": {}, @@ -2760,7 +2023,7 @@ "@unsupportedAndroidVersion": {}, "voiceCall": "语音通话", "@voiceCall": {}, - "placeCall": "打电话", + "placeCall": "发起通话", "@placeCall": {}, "videoCallsBetaWarning": "请注意,视频通话目前处于测试阶段。它们可能不能像预期的那样工作,或者在所有平台上都不能工作。", "@videoCallsBetaWarning": {}, @@ -2779,15 +2042,13 @@ "@nextAccount": {}, "previousAccount": "上个账户", "@previousAccount": {}, - "editWidgets": "编辑小部件", - "@editWidgets": {}, "widgetVideo": "视频", "@widgetVideo": {}, "widgetJitsi": "Jitsi Meet", "@widgetJitsi": {}, "widgetCustom": "自定义", "@widgetCustom": {}, - "widgetNameError": "请提供显示名称。", + "widgetNameError": "请提供昵称。", "@widgetNameError": {}, "errorAddingWidget": "添加小部件出错。", "@errorAddingWidget": {}, @@ -2799,16 +2060,11 @@ "@widgetName": {}, "widgetUrlError": "这不是有效的 URL。", "@widgetUrlError": {}, - "separateChatTypes": "分开私聊、群组和空间", + "separateChatTypes": "分开私聊和群组", "@separateChatTypes": { "type": "text", "placeholders": {} }, - "showDirectChatsInSpaces": "在空间中显示相关私聊", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, "youRejectedTheInvitation": "你拒绝了邀请", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "你加入了聊天", @@ -2819,19 +2075,19 @@ "user": {} } }, - "youInvitedBy": "你受到 {user} 的邀请", + "youInvitedBy": "📩 你受到了 {user} 的邀请", "@youInvitedBy": { "placeholders": { "user": {} } }, - "youInvitedUser": "你邀请了 {user}", + "youInvitedUser": "📩 你邀请了 {user}", "@youInvitedUser": { "placeholders": { "user": {} } }, - "youKicked": "你踢掉了 {user}", + "youKicked": "👞 你踢出了 {user}", "@youKicked": { "placeholders": { "user": {} @@ -2843,7 +2099,7 @@ "user": {} } }, - "youAcceptedTheInvitation": "你接受了邀请", + "youAcceptedTheInvitation": "👍 你接受了邀请", "@youAcceptedTheInvitation": {}, "youHaveWithdrawnTheInvitationFor": "你撤回了对 {user} 的邀请", "@youHaveWithdrawnTheInvitationFor": { @@ -2851,21 +2107,17 @@ "user": {} } }, - "youKickedAndBanned": "你踢掉并封禁了 {user}", + "youKickedAndBanned": "🙅 你踢出并封禁了 {user}", "@youKickedAndBanned": { "placeholders": { "user": {} } }, - "showSpaces": "显示空间列表", - "@showSpaces": {}, - "noEmailWarning": "请输入有效电子邮件地址。否则你将无法重置密码。如果你不想输入邮件地址,再次轻点按钮以继续。", - "@noEmailWarning": {}, "storeInSecureStorageDescription": "将恢复密钥存储在此设备的安全存储中。", "@storeInSecureStorageDescription": {}, "storeInAppleKeyChain": "存储在 Apple KeyChain 中", "@storeInAppleKeyChain": {}, - "unlockOldMessages": "解锁旧信息", + "unlockOldMessages": "解锁旧消息", "@unlockOldMessages": {}, "pleaseEnterRecoveryKey": "请输入你的恢复密钥:", "@pleaseEnterRecoveryKey": {}, @@ -2873,20 +2125,774 @@ "@recoveryKey": {}, "recoveryKeyLost": "丢失了恢复密钥?", "@recoveryKeyLost": {}, - "pleaseEnterRecoveryKeyDescription": "要解锁您的旧邮件,请输入你在之前会话中生成的恢复密钥。 你的恢复密钥不是你的密码。", + "pleaseEnterRecoveryKeyDescription": "要解锁你的旧邮件,请输入你在之前会话中生成的恢复密钥。 你的恢复密钥不是你的密码。", "@pleaseEnterRecoveryKeyDescription": {}, "saveKeyManuallyDescription": "通过触发系统共享对话框或剪贴板手动保存此密钥。", "@saveKeyManuallyDescription": {}, "storeInAndroidKeystore": "存储在 Android KeyStore 中", "@storeInAndroidKeystore": {}, - "storeSecurlyOnThisDevice": "在此设备上安全存储", + "storeSecurlyOnThisDevice": "安全地存储在此设备上", "@storeSecurlyOnThisDevice": {}, - "saveTheRecoveryKeyNow": "立即保存恢复密钥", - "@saveTheRecoveryKeyNow": {}, - "enableAutoBackups": "启用自动备份", - "@enableAutoBackups": {}, "users": "用户", "@users": {}, - "stories": "故事", - "@stories": {} + "countFiles": "{count} 个文件", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "dehydrateTor": "TOR 用户:导出会话", + "@dehydrateTor": {}, + "dehydrateTorLong": "建议 TOR 用户在关闭窗口之前导出会话。", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR 用户:导入会话导出", + "@hydrateTor": {}, + "hydrate": "从备份文件恢复", + "@hydrate": {}, + "dehydrate": "导出会话并擦除设备", + "@dehydrate": {}, + "dehydrateWarning": "此操作无法撤消。 确保你安全地存储备份文件。", + "@dehydrateWarning": {}, + "indexedDbErrorTitle": "私有模式问题", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "遗憾的是,默认情况下未在私有模式下启用消息存储。\n请访问\n - about:config\n - 将 dom.indexedDB.privateBrowsing.enabled 设置为 true\n否则,无法运行 FluffyChat。", + "@indexedDbErrorLong": {}, + "hydrateTorLong": "你上次是否导出 TOR 会话? 快速导入它并继续聊天。", + "@hydrateTorLong": {}, + "user": "用户", + "@user": {}, + "custom": "自定义", + "@custom": {}, + "confirmMatrixId": "请确认你的 Matrix ID 以删除账户。", + "@confirmMatrixId": {}, + "supposedMxid": "应为 {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "commandHint_markasgroup": "标记为群组", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "将给定的 Matrix ID 标为私信聊天室", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "为什么此消息不可读?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "如果消息是在你在此设备上登录账户前发送的,就可能发生这种情况。\n\n也有可能是发送者屏蔽了你的设备或网络连接出了问题。\n\n你能在另一个会话中读取消息吗?如果是的话,你可以从它那里传递信息!点击设置 > 设备,并确保你的设备已经相互验证。当你下次打开聊天室,且两个会话都在前台,密钥就会自动传输。\n\n你不想在注销或切换设备时丢失密钥?请确保在设置中启用了聊天备份。", + "@noKeyForThisMessage": {}, + "newGroup": "新群组", + "@newGroup": {}, + "newSpace": "新的空间", + "@newSpace": {}, + "enterSpace": "进入空间", + "@enterSpace": {}, + "enterRoom": "进入聊天室", + "@enterRoom": {}, + "allSpaces": "所有空间", + "@allSpaces": {}, + "appearOnTop": "显示在其它应用上方", + "@appearOnTop": {}, + "appearOnTopDetails": "允许应用显示在顶部(如果你已经将 Fluffychat 设置为呼叫账户,则不需要授予此权限)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "麦克风、摄像头和其它 FluffyChat 权限", + "@otherCallingPermissions": {}, + "callingPermissions": "呼叫权限", + "@callingPermissions": {}, + "callingAccountDetails": "允许 FluffyChat 使用本机 android 拨号器应用。", + "@callingAccountDetails": {}, + "foregroundServiceRunning": "此通知在前台服务运行时出现。", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "屏幕共享", + "@screenSharingTitle": {}, + "callingAccount": "呼叫账户", + "@callingAccount": {}, + "screenSharingDetail": "你正在 FluffyChat 中共享屏幕", + "@screenSharingDetail": {}, + "numChats": "{number} 个聊天", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "隐藏不重要的状态事件", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "不再显示", + "@doNotShowAgain": {}, + "googlyEyesContent": "{senderName} 向你发送了“大眼”表情", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_googly": "发送“大眼”表情", + "@commandHint_googly": {}, + "commandHint_cuddle": "发送“搂抱”", + "@commandHint_cuddle": {}, + "commandHint_hug": "发送“拥抱”", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} 搂抱了你", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "hugContent": "{senderName} 拥抱了你", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "wasDirectChatDisplayName": "空聊天(曾是 {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "startFirstChat": "发起你的第一个聊天", + "@startFirstChat": {}, + "newSpaceDescription": "空间让你可以整合聊天并建立私人或公共社区。", + "@newSpaceDescription": {}, + "encryptThisChat": "加密此聊天", + "@encryptThisChat": {}, + "disableEncryptionWarning": "出于安全考虑 ,你不能在之前已启用加密的聊天中禁用加密。", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "非常抱歉……这是做不到的", + "@sorryThatsNotPossible": {}, + "deviceKeys": "设备密钥:", + "@deviceKeys": {}, + "report": "举报", + "@report": {}, + "fileIsTooBigForServer": "无法发送!服务器只支持最大 {max} 的文件。", + "@fileIsTooBigForServer": {}, + "noOtherDevicesFound": "未找到其它设备", + "@noOtherDevicesFound": {}, + "jumpToLastReadMessage": "跳转到上次已读的消息", + "@jumpToLastReadMessage": {}, + "readUpToHere": "读到此处", + "@readUpToHere": {}, + "jump": "跳转", + "@jump": {}, + "openLinkInBrowser": "在浏览器中打开链接", + "@openLinkInBrowser": {}, + "signInWith": "使用 {provider} 登录", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "allRooms": "所有群聊", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "fileHasBeenSavedAt": "文件已保存在 {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "reportErrorDescription": "😭 哦不。出了点差错。如果你愿意,可以向开发人员报告此错误。", + "@reportErrorDescription": {}, + "noBackupWarning": "警告!如果不启用聊天备份,你将无法访问加密消息。强烈建议在注销前先启用聊天备份。", + "@noBackupWarning": {}, + "signInWithPassword": "使用密码登录", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "请稍后再试或选择其它服务器。", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "reopenChat": "重新打开聊天", + "@reopenChat": {}, + "importEmojis": "导入表情包", + "@importEmojis": {}, + "notAnImage": "不是图像文件。", + "@notAnImage": {}, + "importNow": "立即导入", + "@importNow": {}, + "importFromZipFile": "从 .zip 文件导入", + "@importFromZipFile": {}, + "replace": "替换", + "@replace": {}, + "exportEmotePack": "以 .zip 格式导出表情包", + "@exportEmotePack": {}, + "sendTypingNotifications": "发送正在输入通知", + "@sendTypingNotifications": {}, + "createGroup": "创建群组", + "@createGroup": {}, + "shareInviteLink": "分享邀请链接", + "@shareInviteLink": {}, + "profileNotFound": "服务器上找不到此用户。可能是连接有问题或者用户不存在。", + "@profileNotFound": {}, + "inviteContactToGroupQuestion": "你是否要邀请 {contact} 参与聊天 \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "重试", + "@tryAgain": {}, + "addChatDescription": "添加聊天说明…", + "@addChatDescription": {}, + "chatPermissions": "聊天权限", + "@chatPermissions": {}, + "chatDescription": "聊天描述", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "聊天描述已被更改", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "尚未创建聊天描述。", + "@noChatDescriptionYet": {}, + "invalidServerName": "服务器名称无效", + "@invalidServerName": {}, + "redactMessageDescription": "消息将为此对话中所有参与者删除。此操作无法撤销。", + "@redactMessageDescription": {}, + "optionalRedactReason": "(可选)删除此消息的原因...", + "@optionalRedactReason": {}, + "setChatDescription": "设置聊天描述", + "@setChatDescription": {}, + "setTheme": "设置主题:", + "@setTheme": {}, + "setColorTheme": "设置颜色主题:", + "@setColorTheme": {}, + "invite": "邀请", + "@invite": {}, + "messagesStyle": "消息:", + "@messagesStyle": {}, + "redactedBy": "已被 {username} 删除", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "directChat": "私聊", + "@directChat": {}, + "redactedByBecause": "已被 {username} 删除,原因:\"{reason}\"", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "inviteGroupChat": "📨 邀请至群聊", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 邀请至私聊", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "最近使用过的表情会出现在这里...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "invalidInput": "无效的输入!", + "@invalidInput": {}, + "wrongPinEntered": "输入的 PIN 码不正确!请 {seconds} 秒后重试…", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "hasKnocked": "{user} 请求了加入聊天室的邀请", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "pleaseEnterANumber": "请输入大于 0 的数", + "@pleaseEnterANumber": {}, + "banUserDescription": "该用户将被禁止进入聊天室,在解除封禁之前将不能再进入聊天室。", + "@banUserDescription": {}, + "removeDevicesDescription": "你将注销此设备,无法再接收消息。", + "@removeDevicesDescription": {}, + "unbanUserDescription": "如果用户尝试加入则可以再次进入聊天。", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "推送通知不可用", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "一旦你将该用户设为管理员,你可能无法撤销,因为他们将拥有与你相同的权限。", + "@makeAdminDescription": {}, + "archiveRoomDescription": "聊天将被移至存档。其他用户将能看到你已离开聊天。", + "@archiveRoomDescription": {}, + "learnMore": "了解更多", + "@learnMore": {}, + "roomUpgradeDescription": "聊天之后将以新的聊天室版本重新创建。所有参与者都会收到通知以切换到新的聊天室。有关聊天室版本的更多信息,请访问 https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "kickUserDescription": "该用户会被踢出聊天但未被封禁。在公开聊天中,该用户可以随时重新加入。", + "@kickUserDescription": {}, + "blockListDescription": "你可以屏蔽打扰你的用户。你将不会收到来自屏蔽列表中用户的任何消息或聊天室邀请。", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "创建群组并邀请用户", + "@createGroupAndInviteUsers": {}, + "startConversation": "开始对话", + "@startConversation": {}, + "blockedUsers": "已屏蔽的用户", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "可通过搜索找到该群组", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "很遗憾,没有找到有关\"{query}\"的用户。请检查是否有错别字。", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "block": "屏蔽", + "@block": {}, + "yourGlobalUserIdIs": "你的全局用户 ID 是: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "发送原始 json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "抱歉…这似乎不是正确的恢复密钥。", + "@wrongRecoveryKey": {}, + "blockUsername": "忽略用户名", + "@blockUsername": {}, + "groupName": "群组名称", + "@groupName": {}, + "databaseMigrationTitle": "数据库已优化", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "搜索 #聊天,@用户…", + "@searchChatsRooms": {}, + "databaseMigrationBody": "请稍候。可能需要稍等片刻。", + "@databaseMigrationBody": {}, + "thisDevice": "此设备:", + "@thisDevice": {}, + "publicSpaces": "公开空间", + "@publicSpaces": {}, + "passwordIsWrong": "你输入的密码有误", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "请输入你当前的密码", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "公开链接", + "@publicLink": {}, + "nothingFound": "未找到任何内容…", + "@nothingFound": {}, + "decline": "拒绝", + "@decline": {}, + "newPassword": "新的密码", + "@newPassword": {}, + "passwordsDoNotMatch": "密码不匹配", + "@passwordsDoNotMatch": {}, + "subspace": "子空间", + "@subspace": {}, + "select": "选择", + "@select": {}, + "pleaseChooseAStrongPassword": "请选择一个强密码", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "添加聊天或子空间", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "留空以清除你的状态。", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "加入空间", + "@joinSpace": {}, + "searchForUsers": "搜索 @用户…", + "@searchForUsers": {}, + "databaseBuildErrorBody": "无法构建 SQLite 数据库。目前应用尝试使用旧数据库。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "initAppError": "在初始化应用时发生错误", + "@initAppError": {}, + "sessionLostBody": "你的会话已丢失。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "restoreSessionBody": "应用现在尝试从备份中恢复你的会话。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendTypingNotificationsDescription": "聊天中的其他参与者可以看到你正在输入新消息。", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "使用 Markdown 显示富文本内容,例如加粗文本。", + "@formattedMessagesDescription": {}, + "verifyOtherUserDescription": "如果你验证了其他用户,就可以确保你清楚自己正在与谁进行通信。💪\n\n当你开始验证时,你和其他用户将在应用中看到一个弹出窗口。然后你会看到一系列表情符号或数字,你和其他用户需要比较它们是否一致。\n\n最好的方式是线下会面或开始视频通话。👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "当你验证另一个设备时,这些设备可以交换密钥,从而提高整体安全性。 💪 当你开始验证时,两个设备上的应用都将显示一个弹出窗口。然后你会看到一系列表情符号或数字,你需要比较两个设备上显示的内容。在开始验证之前,最好将两个设备都放在手边。🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} 取消了密钥验证", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "sendReadReceipts": "发送已读回执", + "@sendReadReceipts": {}, + "formattedMessages": "格式化的消息", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 验证其它设备", + "@verifyOtherDevice": {}, + "verifyOtherUser": "🔐 验证其他用户", + "@verifyOtherUser": {}, + "forwardMessageTo": "转发消息至 {roomName} ?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendReadReceiptsDescription": "聊天中的其他参与者可以看到你是否读过消息。", + "@sendReadReceiptsDescription": {}, + "acceptedKeyVerification": "{sender} 接受了密钥验证", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} 已准备好进行密钥验证", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} 完成了密钥验证", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "requestedKeyVerification": "{sender} 请求了密钥验证", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} 开始了密钥验证", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "透明", + "@transparent": {}, + "youInvitedToBy": "📩 你已通过链接被邀请到:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "presencesToggle": "显示其他用户的状态消息", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "presenceStyle": "是否在线:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "hidePresences": "隐藏状态列表?", + "@hidePresences": {}, + "incomingMessages": "传入消息", + "@incomingMessages": {}, + "stickers": "贴纸", + "@stickers": {}, + "discover": "发现", + "@discover": {}, + "commandHint_ignore": "忽略给定的 matrix ID", + "@commandHint_ignore": {}, + "commandHint_unignore": "取消忽略给定的 matrix ID", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} 未读聊天", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "appLockDescription": "用 pin 码在不用 FluffyChat 时锁定它", + "@appLockDescription": {}, + "globalChatId": "全局聊天 ID", + "@globalChatId": {}, + "accessAndVisibility": "访问和可见性", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "谁可以加入此聊天以及怎样发现该聊天。", + "@accessAndVisibilityDescription": {}, + "calls": "通话", + "@calls": {}, + "customEmojisAndStickers": "自定义表情符号和贴纸", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "隐藏被涂黑的消息", + "@hideRedactedMessages": {}, + "overview": "概览", + "@overview": {}, + "notifyMeFor": "提示内容", + "@notifyMeFor": {}, + "passwordRecoverySettings": "密码发现设置", + "@passwordRecoverySettings": {}, + "noPublicLinkHasBeenCreatedYet": "尚未创建公开链接", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "请求", + "@knock": {}, + "noOneCanJoin": "无人可以加入", + "@noOneCanJoin": {}, + "knocking": "正在请求", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "可通过搜索 {server} 发现聊天", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "thereAreCountUsersBlocked": "目前有 {count} 名用户被封禁。", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "hideRedactedMessagesBody": "如果某人涂黑了一条消息,那么在聊天中再也看不到这条消息。", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "隐藏无效或未知的消息格式", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "在公开聊天中隐藏成员变化", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "不在聊天时间线中显示某人是否加入或离开了公开聊天来改进可读性。", + "@hideMemberChangesInPublicChatsBody": {}, + "userWouldLikeToChangeTheChat": "{user} 想加入聊天。", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "customEmojisAndStickersBody": "添加或分享可用于任何聊天的表情符号或贴纸。", + "@customEmojisAndStickersBody": {}, + "usersMustKnock": "用户必须请求加入", + "@usersMustKnock": {}, + "noDatabaseEncryption": "数据库加密在此平台上不受支持", + "@noDatabaseEncryption": {}, + "userRole": "用户角色", + "@userRole": {}, + "minimumPowerLevel": "{level} 是最低权限等级。", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "publicChatAddresses": "公开聊天的地址", + "@publicChatAddresses": {}, + "createNewAddress": "新建地址", + "@createNewAddress": {}, + "searchMore": "搜索更多…", + "@searchMore": {}, + "gallery": "图库", + "@gallery": {}, + "files": "文件", + "@files": {}, + "searchIn": "在 “{chat}” 聊天中搜索…", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "knockRestricted": "“请求加入”请求受限", + "@knockRestricted": {}, + "restricted": "受限", + "@restricted": {}, + "swipeRightToLeftToReply": "从右向左滑动进行回复", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "找不到更多聊天…", + "@noMoreChatsFound": {}, + "joinedChats": "已加入的聊天", + "@joinedChats": {}, + "space": "空间", + "@space": {}, + "spaces": "空间", + "@spaces": {}, + "goToSpace": "转到空间:{space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "标为未读", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} 个聊天和 {participants} 名参与者", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "unread": "未读", + "@unread": {}, + "userLevel": "{level} - 用户", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - 主持人", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "adminLevel": "{level} - 管理员", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "inviteOtherUsers": "邀请其他用户到这个聊天", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "更改聊天权限", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "更改聊天历史的可见性", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "更改主公共聊天地址", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "发送通知聊天室所有人的通知", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "更改聊天描述", + "@changeTheDescriptionOfTheGroup": {}, + "changeGeneralChatSettings": "更改常规聊天设置", + "@changeGeneralChatSettings": {}, + "invitedBy": "📩 邀请人 {user}", + "@invitedBy": { + "placeholders": { + "user": {} + } + }, + "chatPermissionsDescription": "定义此聊天中哪个权限等级对特定操作是必需的。权限等级 0、50 和 100 通常代表用户、主持人和管理员,但你可以自定义任何等级。", + "@chatPermissionsDescription": {}, + "changelog": "更新记录", + "@changelog": {}, + "updateInstalled": "🎉 已安装更新 {version} !", + "@updateInstalled": { + "type": "text", + "placeholders": { + "version": {} + } + }, + "sendCanceled": "发送被取消", + "@sendCanceled": {}, + "noChatsFoundHere": "此处尚未找到聊天。使用下方按钮 ⤵️ 开始和某人的新聊天", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "使用 Matrix-ID 登录", + "@loginWithMatrixId": {}, + "discoverHomeservers": "发现主服务器", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "什么是主服务器?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "主服务器上就像电子邮件提供商,你的所有数据都存储在上面。你可以选择你想使用哪个主服务器。在 https://matrix.org 上了解更多信息。", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "似乎不是兼容的主服务器。URL 不正确?", + "@doesNotSeemToBeAValidHomeserver": {}, + "prepareSendingAttachment": "准备发送附件…", + "@prepareSendingAttachment": {}, + "sendingAttachment": "发送附件中…", + "@sendingAttachment": {}, + "calculatingFileSize": "计算文件尺寸中…", + "@calculatingFileSize": {}, + "generatingVideoThumbnail": "生成视频缩略图中…", + "@generatingVideoThumbnail": {}, + "compressVideo": "压缩视频中…", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "正在发送附件 {index},共 {length} 个附件…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": {}, + "length": {} + } + }, + "serverLimitReached": "达到了服务器限制!等待 {seconds} 秒…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": {} + } + }, + "oneOfYourDevicesIsNotVerified": "您设备中的一台未验证", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "注意:当你连接所有设备到聊天备份时,这些设备将被自动验证。", + "@noticeChatBackupDeviceVerification": {}, + "welcomeText": "你好呀 👋 欢迎来到 FluffyChat。你可以登录任意兼容 https://matrix.org 的 homeserver,然后和任何人聊天。这是个巨大的去中心化消息网络!", + "@welcomeText": {}, + "continueText": "继续", + "@continueText": {}, + "blur": "模糊:", + "@blur": {}, + "opacity": "不透明:", + "@opacity": {}, + "setWallpaper": "设置壁纸", + "@setWallpaper": {}, + "manageAccount": "管理账户", + "@manageAccount": {}, + "aboutHomeserver": "关于 {homeserver}", + "@aboutHomeserver": { + "type": "text", + "placeholders": { + "homeserver": {} + } + }, + "version": "版本", + "@version": {}, + "noContactInformationProvided": "服务器未提供任何有效的联系信息", + "@noContactInformationProvided": {}, + "contactServerAdmin": "联系服务器管理员", + "@contactServerAdmin": {}, + "name": "名称", + "@name": {}, + "contactServerSecurity": "联系服务器安全管理", + "@contactServerSecurity": {}, + "supportPage": "支持页面", + "@supportPage": {}, + "serverInformation": "服务器信息:", + "@serverInformation": {}, + "website": "网站", + "@website": {}, + "compressBeforeSending": "发送前压缩", + "@compressBeforeSending": {}, + "italicText": "文件倾斜", + "@italicText": {}, + "strikeThrough": "删除线", + "@strikeThrough": {}, + "pleaseFillOut": "请填写", + "@pleaseFillOut": {}, + "addLink": "添加链接", + "@addLink": {}, + "sendUncompressed": "无压缩发送", + "@sendUncompressed": {}, + "boldText": "文本加粗", + "@boldText": {}, + "invalidUrl": "无效 url", + "@invalidUrl": {}, + "unableToJoinChat": "无法加入聊天。可能其他方面已经关闭了对话。", + "@unableToJoinChat": {}, + "sendImages": "发送 {count} 张图片", + "@sendImages": { + "type": "text", + "placeholders": { + "count": {} + } + }, + "compress": "压缩", + "@compress": {} } diff --git a/assets/l10n/intl_zh_Hant.arb b/assets/l10n/intl_zh_Hant.arb index 4952d2ec9f..9570c7214a 100644 --- a/assets/l10n/intl_zh_Hant.arb +++ b/assets/l10n/intl_zh_Hant.arb @@ -5,12 +5,12 @@ "type": "text", "placeholders": {} }, - "accept": "接受", + "accept": "同意", "@accept": { "type": "text", "placeholders": {} }, - "acceptedTheInvitation": "{username}已接受邀請", + "acceptedTheInvitation": "👍 {username} 已接受邀請", "@acceptedTheInvitation": { "type": "text", "placeholders": { @@ -22,12 +22,7 @@ "type": "text", "placeholders": {} }, - "accountInformation": "帳號資訊", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}已啟用點對點加密", + "activatedEndToEndEncryption": "🔐 {username} 已啟用點對點加密", "@activatedEndToEndEncryption": { "type": "text", "placeholders": { @@ -39,16 +34,6 @@ "type": "text", "placeholders": {} }, - "addGroupDescription": "新增一個群組描述", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "新增朋友", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, "admin": "管理員", "@admin": { "type": "text", @@ -64,12 +49,7 @@ "type": "text", "placeholders": {} }, - "alreadyHaveAnAccount": "已經有帳號了?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "已開始與{senderName}通話", + "answeredTheCall": "已開始與 {senderName} 通話", "@answeredTheCall": { "type": "text", "placeholders": { @@ -91,11 +71,6 @@ "type": "text", "placeholders": {} }, - "archivedRoom": "已封存的對話", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, "areGuestsAllowedToJoin": "是否允許訪客加入", "@areGuestsAllowedToJoin": { "type": "text", @@ -111,48 +86,18 @@ "type": "text", "placeholders": {} }, - "askSSSSCache": "請輸入您安全儲存的密碼短語或恢復金鑰以快取金鑰。", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, "askSSSSSign": "請輸入您安全儲存的密碼短語或恢復金鑰,以向對方簽名。", "@askSSSSSign": { "type": "text", "placeholders": {} }, - "askSSSSVerify": "請輸入您安全儲存的密碼短語或恢復金鑰以驗證您的工作階段。", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "是否接受來自{username}的驗證申請?", + "askVerificationRequest": "是否接受來自 {username} 的驗證申請?", "@askVerificationRequest": { "type": "text", "placeholders": { "username": {} } }, - "audioPlayerPause": "暫停", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "播放", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "身份驗證", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "頭貼已變更", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "badServerLoginTypesException": "目前伺服器支援的登入類型:\n{serverVersions}\n但本應用程式僅支援:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "text", @@ -161,7 +106,7 @@ "supportedVersions": {} } }, - "badServerVersionsException": "目前伺服器支援的Spec版本:\n{serverVersions}\n但本應用程式僅支援{supportedVersions}", + "badServerVersionsException": "目前伺服器支援的協議版本:\n{serverVersions}\n但本應用程式僅支援 {supportedVersions}", "@badServerVersionsException": { "type": "text", "placeholders": { @@ -169,17 +114,17 @@ "supportedVersions": {} } }, - "banFromChat": "已從聊天室中封禁", + "banFromChat": "已從聊天室中封鎖", "@banFromChat": { "type": "text", "placeholders": {} }, - "banned": "已被封禁", + "banned": "已被封鎖", "@banned": { "type": "text", "placeholders": {} }, - "bannedUser": "{username}封禁了{targetName}", + "bannedUser": "{username} 封鎖了 {targetName}", "@bannedUser": { "type": "text", "placeholders": { @@ -202,11 +147,6 @@ "type": "text", "placeholders": {} }, - "cachedKeys": "金鑰已快取", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, "cancel": "取消", "@cancel": { "type": "text", @@ -217,14 +157,14 @@ "type": "text", "placeholders": {} }, - "changedTheChatAvatar": "{username}變更了對話頭貼", + "changedTheChatAvatar": "{username} 變更了對話頭貼", "@changedTheChatAvatar": { "type": "text", "placeholders": { "username": {} } }, - "changedTheChatDescriptionTo": "{username}變更了對話介紹為:「{description}」", + "changedTheChatDescriptionTo": "{username} 變更了聊天室介紹為:「{description}」", "@changedTheChatDescriptionTo": { "type": "text", "placeholders": { @@ -232,7 +172,7 @@ "description": {} } }, - "changedTheChatNameTo": "{username}變更了暱稱為:「{chatname}」", + "changedTheChatNameTo": "{username} 變更了聊天室名稱為:「{chatname}」", "@changedTheChatNameTo": { "type": "text", "placeholders": { @@ -240,7 +180,7 @@ "chatname": {} } }, - "changedTheChatPermissions": "{username}變更了對話權限", + "changedTheChatPermissions": "{username} 變更了對話權限", "@changedTheChatPermissions": { "type": "text", "placeholders": { @@ -255,14 +195,14 @@ "displayname": {} } }, - "changedTheGuestAccessRules": "{username}變更了訪客訪問規則", + "changedTheGuestAccessRules": "{username} 變更了訪客訪問規則", "@changedTheGuestAccessRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheGuestAccessRulesTo": "{username}變更了訪客訪問規則為:{rules}", + "changedTheGuestAccessRulesTo": "{username} 變更了訪客訪問規則為:{rules}", "@changedTheGuestAccessRulesTo": { "type": "text", "placeholders": { @@ -270,14 +210,14 @@ "rules": {} } }, - "changedTheHistoryVisibility": "{username}變更了歷史記錄觀察狀態", + "changedTheHistoryVisibility": "{username} 變更了歷史記錄觀察狀態", "@changedTheHistoryVisibility": { "type": "text", "placeholders": { "username": {} } }, - "changedTheHistoryVisibilityTo": "{username}變更了歷史紀錄觀察狀態到:{rules}", + "changedTheHistoryVisibilityTo": "{username} 變更了歷史紀錄觀察狀態到:{rules}", "@changedTheHistoryVisibilityTo": { "type": "text", "placeholders": { @@ -285,14 +225,14 @@ "rules": {} } }, - "changedTheJoinRules": "{username}變更了加入的規則", + "changedTheJoinRules": "{username} 變更了加入的規則", "@changedTheJoinRules": { "type": "text", "placeholders": { "username": {} } }, - "changedTheJoinRulesTo": "{username}變更了加入的規則為:{joinRules}", + "changedTheJoinRulesTo": "{username} 變更了加入的規則為:{joinRules}", "@changedTheJoinRulesTo": { "type": "text", "placeholders": { @@ -300,42 +240,32 @@ "joinRules": {} } }, - "changedTheProfileAvatar": "{username}變更了頭貼", + "changedTheProfileAvatar": "{username} 變更了頭貼", "@changedTheProfileAvatar": { "type": "text", "placeholders": { "username": {} } }, - "changedTheRoomAliases": "{username}變更了聊天室名", + "changedTheRoomAliases": "{username} 變更了聊天室名", "@changedTheRoomAliases": { "type": "text", "placeholders": { "username": {} } }, - "changedTheRoomInvitationLink": "{username}變更了邀請連結", + "changedTheRoomInvitationLink": "{username} 變更了邀請連結", "@changedTheRoomInvitationLink": { "type": "text", "placeholders": { "username": {} } }, - "changelog": "變更日誌", - "@changelog": { - "type": "text", - "placeholders": {} - }, "changePassword": "變更密碼", "@changePassword": { "type": "text", "placeholders": {} }, - "changesHaveBeenSaved": "變更已被儲存", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, "changeTheHomeserver": "變更主機位址", "@changeTheHomeserver": { "type": "text", @@ -351,22 +281,12 @@ "type": "text", "placeholders": {} }, - "changeTheServer": "變更伺服器", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "變更聊天背景", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, "channelCorruptedDecryptError": "加密已被破壞", "@channelCorruptedDecryptError": { "type": "text", "placeholders": {} }, - "chat": "聊天", + "chat": "聊天室", "@chat": { "type": "text", "placeholders": {} @@ -376,7 +296,7 @@ "type": "text", "placeholders": {} }, - "chatBackupDescription": "您的聊天記錄備份已被安全金鑰鑰加密。請您確保不會弄丟它。", + "chatBackupDescription": "您的過往聊天室記錄已被恢復金鑰加密。請您確保不會弄丟它。", "@chatBackupDescription": { "type": "text", "placeholders": {} @@ -391,27 +311,17 @@ "type": "text", "placeholders": {} }, - "chooseAUsername": "輸入您的使用者名稱", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearText": "清除文字", - "@clearText": { - "type": "text", - "placeholders": {} - }, "close": "關閉", "@close": { "type": "text", "placeholders": {} }, - "compareEmojiMatch": "對比並確認這些表情符合其他那些裝置:", + "compareEmojiMatch": "請對比這些表情", "@compareEmojiMatch": { "type": "text", "placeholders": {} }, - "compareNumbersMatch": "比較以下數字,確保它們和另一個裝置上的相同:", + "compareNumbersMatch": "請對比這些數字", "@compareNumbersMatch": { "type": "text", "placeholders": {} @@ -431,11 +341,6 @@ "type": "text", "placeholders": {} }, - "connectionAttemptFailed": "嘗試連接失敗", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "聯絡人已被邀請至群組", "@contactHasBeenInvitedToTheGroup": { "type": "text", @@ -456,11 +361,6 @@ "type": "text", "placeholders": {} }, - "contentViewer": "內容檢視器", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, "copiedToClipboard": "已複製到剪貼簿", "@copiedToClipboard": { "type": "text", @@ -483,17 +383,7 @@ "error": {} } }, - "couldNotSetAvatar": "不能設定頭貼", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "不能設定顯示名稱", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count}個參與者", + "countParticipants": "{count} 個參與者", "@countParticipants": { "type": "text", "placeholders": { @@ -505,33 +395,13 @@ "type": "text", "placeholders": {} }, - "createAccountNow": "現在建立帳號", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}建立了聊天室", + "createdTheChat": "💬 {username} 建立了聊天室", "@createdTheChat": { "type": "text", "placeholders": { "username": {} } }, - "createNewGroup": "建立新群組", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "第三方登入未啟用", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "第三方登入已啟用", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, "currentlyActive": "目前活躍", "@currentlyActive": { "type": "text", @@ -542,7 +412,7 @@ "type": "text", "placeholders": {} }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", + "dateAndTimeOfDay": "{date} , {timeOfDay}", "@dateAndTimeOfDay": { "type": "text", "placeholders": { @@ -550,7 +420,7 @@ "timeOfDay": {} } }, - "dateWithoutYear": "{month}-{day}", + "dateWithoutYear": "{month} - {day}", "@dateWithoutYear": { "type": "text", "placeholders": { @@ -558,7 +428,7 @@ "day": {} } }, - "dateWithYear": "{year}-{month}-{day}", + "dateWithYear": "{year} - {month} - {day}", "@dateWithYear": { "type": "text", "placeholders": { @@ -592,11 +462,6 @@ "type": "text", "placeholders": {} }, - "deny": "否認", - "@deny": { - "type": "text", - "placeholders": {} - }, "device": "裝置", "@device": { "type": "text", @@ -612,41 +477,16 @@ "type": "text", "placeholders": {} }, - "deviceVerifyDescription": "只有在所有的裝置都經過驗證後,加密才會是安全的。", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, "directChats": "直接傳訊", "@directChats": { "type": "text", "placeholders": {} }, - "discardPicture": "放棄圖片", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "探索", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "探索群組", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, "displaynameHasBeenChanged": "顯示名稱已被變更", "@displaynameHasBeenChanged": { "type": "text", "placeholders": {} }, - "donate": "捐贈", - "@donate": { - "type": "text", - "placeholders": {} - }, "downloadFile": "下載文件", "@downloadFile": { "type": "text", @@ -662,21 +502,11 @@ "type": "text", "placeholders": {} }, - "editChatPermissions": "編輯聊天室權限", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, "editDisplayname": "編輯顯示名稱", "@editDisplayname": { "type": "text", "placeholders": {} }, - "editJitsiInstance": "編輯Jitsi實例", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, "editRoomAvatar": "編輯聊天室頭貼", "@editRoomAvatar": { "type": "text", @@ -732,7 +562,7 @@ "type": "text", "placeholders": {} }, - "encrypted": "加密的", + "encrypted": "已加密的", "@encrypted": { "type": "text", "placeholders": {} @@ -742,43 +572,23 @@ "type": "text", "placeholders": {} }, - "encryptionAlgorithm": "加密算法", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, "encryptionNotEnabled": "加密未啟用", "@encryptionNotEnabled": { "type": "text", "placeholders": {} }, - "end2endEncryptionSettings": "點對點加密設定", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName}結束了通話", + "endedTheCall": "{senderName} 結束了通話", "@endedTheCall": { "type": "text", "placeholders": { "senderName": {} } }, - "enterAGroupName": "輸入群組名稱", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, "enterAnEmailAddress": "輸入一個電子郵件位址", "@enterAnEmailAddress": { "type": "text", "placeholders": {} }, - "enterAUsername": "輸入使用者名稱", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, "enterYourHomeserver": "輸入伺服器位址", "@enterYourHomeserver": { "type": "text", @@ -799,11 +609,6 @@ "type": "text", "placeholders": {} }, - "fileSize": "檔案大小", - "@fileSize": { - "type": "text", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "text", @@ -819,16 +624,6 @@ "type": "text", "placeholders": {} }, - "friday": "星期五", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "朋友", - "@friends": { - "type": "text", - "placeholders": {} - }, "fromJoining": "自加入起", "@fromJoining": { "type": "text", @@ -844,16 +639,6 @@ "type": "text", "placeholders": {} }, - "groupDescription": "群組描述", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "群組描述已被變更", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, "groupIsPublic": "群組是公開的", "@groupIsPublic": { "type": "text", @@ -864,7 +649,7 @@ "type": "text", "placeholders": {} }, - "groupWith": "名稱為{displayname}的群組", + "groupWith": "名稱為 {displayname} 的群組", "@groupWith": { "type": "text", "placeholders": { @@ -881,7 +666,7 @@ "type": "text", "placeholders": {} }, - "hasWithdrawnTheInvitationFor": "{username}收回了對{targetName}的邀請", + "hasWithdrawnTheInvitationFor": "{username} 收回了對 {targetName} 的邀請", "@hasWithdrawnTheInvitationFor": { "type": "text", "placeholders": { @@ -904,11 +689,6 @@ "type": "text", "placeholders": {} }, - "homeserverIsNotCompatible": "伺服器不相容", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, "howOffensiveIsThisContent": "這個內容有多令人反感?", "@howOffensiveIsThisContent": { "type": "text", @@ -934,16 +714,6 @@ "type": "text", "placeholders": {} }, - "ignoreListDescription": "您可以無視打擾您的使用者。您將不會再收到來自無視列表中使用者的任何消息或聊天室邀請。", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "無視使用者名稱", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, "iHaveClickedOnLink": "我已經點擊了網址", "@iHaveClickedOnLink": { "type": "text", @@ -964,7 +734,7 @@ "type": "text", "placeholders": {} }, - "inviteContactToGroup": "邀請聯絡人到{groupName}", + "inviteContactToGroup": "邀請聯絡人到 {groupName}", "@inviteContactToGroup": { "type": "text", "placeholders": { @@ -976,7 +746,7 @@ "type": "text", "placeholders": {} }, - "invitedUser": "{username}邀請了{targetName}", + "invitedUser": "📩 {username} 邀請了 {targetName}", "@invitedUser": { "type": "text", "placeholders": { @@ -994,7 +764,7 @@ "type": "text", "placeholders": {} }, - "inviteText": "{username}邀請您使用FluffyChat\n1. 安裝FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:{link}", + "inviteText": "{username} 邀請您使用 FluffyChat\n1. 安裝 FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:\n{link}", "@inviteText": { "type": "text", "placeholders": { @@ -1002,17 +772,12 @@ "link": {} } }, - "isDeviceKeyCorrect": "下列裝置金鑰是否正確?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, "isTyping": "正在輸入...…", "@isTyping": { "type": "text", "placeholders": {} }, - "joinedTheChat": "{username}加入了聊天室", + "joinedTheChat": "👋 {username} 加入了聊天室", "@joinedTheChat": { "type": "text", "placeholders": { @@ -1024,17 +789,7 @@ "type": "text", "placeholders": {} }, - "keysCached": "金鑰已被快取", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "金鑰遺失", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}踢了{targetName}", + "kicked": "👞 {username} 踢了 {targetName}", "@kicked": { "type": "text", "placeholders": { @@ -1042,7 +797,7 @@ "targetName": {} } }, - "kickedAndBanned": "{username}踢了{targetName}並將其封禁", + "kickedAndBanned": "🙅 {username} 踢了 {targetName} 並將其封鎖", "@kickedAndBanned": { "type": "text", "placeholders": { @@ -1062,16 +817,6 @@ "localizedTimeShort": {} } }, - "lastSeenIp": "最後使用的IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "很長一段時間沒有上線了", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, "leave": "離開", "@leave": { "type": "text", @@ -1092,19 +837,19 @@ "type": "text", "placeholders": {} }, - "loadCountMoreParticipants": "載入{count}個更多的參與者", + "loadCountMoreParticipants": "載入 {count} 個更多的參與者", "@loadCountMoreParticipants": { "type": "text", "placeholders": { "count": {} } }, - "loadingPleaseWait": "載入中… 請稍候。", + "loadingPleaseWait": "載入中...... 請稍候。", "@loadingPleaseWait": { "type": "text", "placeholders": {} }, - "loadMore": "載入更多…", + "loadMore": "載入更多...…", "@loadMore": { "type": "text", "placeholders": {} @@ -1114,7 +859,7 @@ "type": "text", "placeholders": {} }, - "logInTo": "登入{homeserver}", + "logInTo": "登入 {homeserver}", "@logInTo": { "type": "text", "placeholders": { @@ -1126,21 +871,6 @@ "type": "text", "placeholders": {} }, - "makeAModerator": "建立版主", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "建立管理員", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "確保識別碼正確", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, "memberChanges": "變更成員", "@memberChanges": { "type": "text", @@ -1156,44 +886,27 @@ "type": "text", "placeholders": {} }, - "messageWillBeRemovedWarning": "將移除所有參與者的訊息", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, "moderator": "版主", "@moderator": { "type": "text", "placeholders": {} }, - "monday": "星期一", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{還有1個事件} other{還有{count}個事件}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, "muteChat": "將該聊天室靜音", "@muteChat": { "type": "text", "placeholders": {} }, - "needPantalaimonWarning": "請注意您需要Pantalaimon才能使用點對點加密功能。", + "needPantalaimonWarning": "請注意您需要 Pantalaimon 才能使用點對點加密功能。", "@needPantalaimonWarning": { "type": "text", "placeholders": {} }, - "newChat": "新聊天室", + "newChat": "新聊天", "@newChat": { "type": "text", "placeholders": {} }, - "newMessageInFluffyChat": "來自 FluffyChat 的新訊息", + "newMessageInFluffyChat": "💬 來自 FluffyChat 的新訊息", "@newMessageInFluffyChat": { "type": "text", "placeholders": {} @@ -1218,16 +931,6 @@ "type": "text", "placeholders": {} }, - "noCrossSignBootstrap": "FluffyChat目前不支援啟用Cross-Signing。請在Riot中啟用。", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "沒有描述", - "@noDescription": { - "type": "text", - "placeholders": {} - }, "noEmotesFound": "表情符號不存在。😕", "@noEmotesFound": { "type": "text", @@ -1238,16 +941,11 @@ "type": "text", "placeholders": {} }, - "noGoogleServicesWarning": "看起來您手機上沒有Google服務框架。這對於保護您的隱私而言是個好決定!但為了收到FluffyChat的推播通知,我們推薦您使用 https://microg.org/ 或 https://unifiedpush.org/。", + "noGoogleServicesWarning": "您手機上沒有安裝 Google 服務框架。這或許對於保護您的隱私而言是個好事!但為了收到 FluffyChat 的推播通知,我們建議您使用 https://microg.org 或 https://unifiedpush.org。", "@noGoogleServicesWarning": { "type": "text", "placeholders": {} }, - "noMegolmBootstrap": "FluffyChat目前不支援啟用線上金鑰備份。請在Riot中啟用。", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, "none": "無", "@none": { "type": "text", @@ -1263,21 +961,11 @@ "type": "text", "placeholders": {} }, - "noPublicRoomsFound": "找不到公開的聊天室…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "找不到聊天室…", + "noRoomsFound": "找不到聊天室...…", "@noRoomsFound": { "type": "text", "placeholders": {} }, - "noStatusesFound": "目前還沒有發現任何狀態。", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, "notifications": "通知", "@notifications": { "type": "text", @@ -1288,19 +976,7 @@ "type": "text", "placeholders": {} }, - "notSupportedInWeb": "在網頁版不支援", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number}已選擇", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count}個人正在輸入…", + "numUsersTyping": "{count} 個人正在輸入...…", "@numUsersTyping": { "type": "text", "placeholders": { @@ -1327,17 +1003,12 @@ "type": "text", "placeholders": {} }, - "onlineKeyBackupDisabled": "線上金鑰備份被停用", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, "onlineKeyBackupEnabled": "線上金鑰備份已啟用", "@onlineKeyBackupEnabled": { "type": "text", "placeholders": {} }, - "oopsSomethingWentWrong": "哎呀!出了一點差錯…", + "oopsSomethingWentWrong": "哎呀!出了一點差錯...…", "@oopsSomethingWentWrong": { "type": "text", "placeholders": {} @@ -1352,21 +1023,11 @@ "type": "text", "placeholders": {} }, - "optionalGroupName": "(可選)群組名稱", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, "participant": "參與者", "@participant": { "type": "text", "placeholders": {} }, - "participatingUserDevices": "參與者裝置", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, "passphraseOrKey": "密碼短語或恢復金鑰", "@passphraseOrKey": { "type": "text", @@ -1402,7 +1063,7 @@ "type": "text", "placeholders": {} }, - "play": "播放{fileName}", + "play": "播放 {fileName}", "@play": { "type": "text", "placeholders": { @@ -1414,11 +1075,6 @@ "type": "text", "placeholders": {} }, - "pleaseChooseAUsername": "請選擇使用者名稱", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, "pleaseClickOnLink": "請點擊電子郵件中的網址,然後繼續。", "@pleaseClickOnLink": { "type": "text", @@ -1429,16 +1085,6 @@ "type": "text", "placeholders": {} }, - "pleaseEnterAMatrixIdentifier": "請輸入Matrix ID。", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "請輸入您的安全金鑰 :", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, "pleaseEnterYourPassword": "請輸入您的密碼", "@pleaseEnterYourPassword": { "type": "text", @@ -1459,11 +1105,6 @@ "type": "text", "placeholders": {} }, - "publicKey": "公鑰", - "@publicKey": { - "type": "text", - "placeholders": {} - }, "publicRooms": "公開的聊天室", "@publicRooms": { "type": "text", @@ -1484,7 +1125,7 @@ "type": "text", "placeholders": {} }, - "redactedAnEvent": "{username}編輯了一個事件", + "redactedAnEvent": "{username} 編輯了一個事件", "@redactedAnEvent": { "type": "text", "placeholders": { @@ -1501,7 +1142,7 @@ "type": "text", "placeholders": {} }, - "rejectedTheInvitation": "{username}拒絕了邀請", + "rejectedTheInvitation": "{username} 拒絕了邀請", "@rejectedTheInvitation": { "type": "text", "placeholders": { @@ -1523,7 +1164,7 @@ "type": "text", "placeholders": {} }, - "removedBy": "被{username}移除", + "removedBy": "被 {username} 移除", "@removedBy": { "type": "text", "placeholders": { @@ -1535,16 +1176,11 @@ "type": "text", "placeholders": {} }, - "unbanFromChat": "解禁聊天", + "unbanFromChat": "解封聊天室", "@unbanFromChat": { "type": "text", "placeholders": {} }, - "removeMessage": "移除訊息", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, "renderRichContent": "繪製圖文訊息內容", "@renderRichContent": { "type": "text", @@ -1570,74 +1206,28 @@ "type": "text", "placeholders": {} }, - "requestToReadOlderMessages": "請求讀取過去的訊息", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "撤銷所有權限", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, "roomHasBeenUpgraded": "聊天室已更新", "@roomHasBeenUpgraded": { "type": "text", "placeholders": {} }, - "saturday": "星期六", - "@saturday": { - "type": "text", - "placeholders": {} - }, "search": "搜尋", "@search": { "type": "text", "placeholders": {} }, - "searchForAChat": "搜尋聊天室", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, "security": "安全", "@security": { "type": "text", "placeholders": {} }, - "securityKey": "安全金鑰", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "遺失安全金鑰?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username}已讀", + "seenByUser": "{username} 已讀", "@seenByUser": { "type": "text", "placeholders": { "username": {} } }, - "seenByUserAndCountOthers": "{count, plural, other{{username}和其他{count}個人已讀}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username}和{username2}已讀", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, "send": "傳送", "@send": { "type": "text", @@ -1653,11 +1243,6 @@ "type": "text", "placeholders": {} }, - "sendBugReports": "允許向sentry.io回報錯誤", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, "sendFile": "傳送文件", "@sendFile": { "type": "text", @@ -1683,21 +1268,21 @@ "type": "text", "placeholders": {} }, - "sentAFile": "{username}傳送了一個文件", + "sentAFile": "{username} 傳送了一個文件", "@sentAFile": { "type": "text", "placeholders": { "username": {} } }, - "sentAnAudio": "{username}傳送了一個音訊", + "sentAnAudio": "{username} 傳送了一個音訊", "@sentAnAudio": { "type": "text", "placeholders": { "username": {} } }, - "sentAPicture": "{username}傳送了一張圖片", + "sentAPicture": "{username} 傳送了一張圖片", "@sentAPicture": { "type": "text", "placeholders": { @@ -1725,28 +1310,8 @@ "senderName": {} } }, - "sentryInfo": "關於您的隱私:https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "工作階段已被驗證", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "設定個人檔案頭貼", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "自訂表情符號", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "設定群組描述", - "@setGroupDescription": { + "setCustomEmotes": "自訂表情符號", + "@setCustomEmotes": { "type": "text", "placeholders": {} }, @@ -1755,7 +1320,7 @@ "type": "text", "placeholders": {} }, - "setPermissionsLevel": "設定權限級別", + "setPermissionsLevel": "設定權限等級", "@setPermissionsLevel": { "type": "text", "placeholders": {} @@ -1787,38 +1352,23 @@ "type": "text", "placeholders": {} }, - "signUp": "註冊", - "@signUp": { - "type": "text", - "placeholders": {} - }, "skip": "跳過", "@skip": { "type": "text", "placeholders": {} }, - "soundVibrationLedColor": "聲音、振動及LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, "sourceCode": "原始碼", "@sourceCode": { "type": "text", "placeholders": {} }, - "startedACall": "{senderName}開始了通話", + "startedACall": "{senderName} 開始了通話", "@startedACall": { "type": "text", "placeholders": { "senderName": {} } }, - "startYourFirstChat": "請開始您的聊天之旅☆(ゝω●)\n- 點擊「新聊天室」\n- 掃描朋友的二維碼\n- 一起開心的聊天吧", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, "status": "狀態", "@status": { "type": "text", @@ -1834,26 +1384,11 @@ "type": "text", "placeholders": {} }, - "sunday": "星期日", - "@sunday": { - "type": "text", - "placeholders": {} - }, "systemTheme": "自動", "@systemTheme": { "type": "text", "placeholders": {} }, - "tapOnDeviceToVerify": "在一個裝置上點擊以進行驗證", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "點擊以顯示功能表", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, "theyDontMatch": "它們不相符", "@theyDontMatch": { "type": "text", @@ -1864,26 +1399,6 @@ "type": "text", "placeholders": {} }, - "thisRoomHasBeenArchived": "這個聊天室已被封存。", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "星期四", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{suffix} {hours12}點{minutes}分", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1900,7 +1415,7 @@ "type": "text", "placeholders": {} }, - "toggleUnread": "標記為已讀/未讀", + "toggleUnread": "標示為已讀/未讀", "@toggleUnread": { "type": "text", "placeholders": {} @@ -1920,17 +1435,12 @@ "type": "text", "placeholders": {} }, - "tuesday": "星期二", - "@tuesday": { - "type": "text", - "placeholders": {} - }, "unavailable": "無法取得", "@unavailable": { "type": "text", "placeholders": {} }, - "unbannedUser": "{username}解除封禁了{targetName}", + "unbannedUser": "{username} 解除封鎖了 {targetName}", "@unbannedUser": { "type": "text", "placeholders": { @@ -1960,16 +1470,6 @@ "type": {} } }, - "unknownSessionVerify": "未知的工作階段,請驗證", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "解鎖聊天記錄備份", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, "unmuteChat": "取消靜音聊天室", "@unmuteChat": { "type": "text", @@ -1980,26 +1480,14 @@ "type": "text", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} 個未讀聊天室}}", + "unreadChats": "{unreadCount, plural, =1 {1 unread chat} other { {unreadCount} 個未讀聊天室} }", "@unreadChats": { "type": "text", "placeholders": { "unreadCount": {} } }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} 個未讀訊息}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "使用適合AMOLED螢幕的顏色?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username}和其他{count}個人正在輸入…", + "userAndOthersAreTyping": "{username} 和其他 {count} 個人正在輸入...…", "@userAndOthersAreTyping": { "type": "text", "placeholders": { @@ -2007,7 +1495,7 @@ "count": {} } }, - "userAndUserAreTyping": "{username}和{username2}正在輸入…", + "userAndUserAreTyping": "{username} 和 {username2} 正在輸入...…", "@userAndUserAreTyping": { "type": "text", "placeholders": { @@ -2015,14 +1503,14 @@ "username2": {} } }, - "userIsTyping": "{username}正在輸入…", + "userIsTyping": "{username} 正在輸入...…", "@userIsTyping": { "type": "text", "placeholders": { "username": {} } }, - "userLeftTheChat": "{username}離開了聊天室", + "userLeftTheChat": "{username} 離開了聊天室", "@userLeftTheChat": { "type": "text", "placeholders": { @@ -2034,12 +1522,7 @@ "type": "text", "placeholders": {} }, - "userNotVerified": "使用者尚未驗證", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username}傳送了一個{type}事件", + "userSentUnknownEvent": "{username} 傳送了一個 {type} 事件", "@userSentUnknownEvent": { "type": "text", "placeholders": { @@ -2047,36 +1530,16 @@ "type": {} } }, - "userUnknownVerification": "未知的使用者驗證狀態", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "使用者已驗證", - "@userVerified": { - "type": "text", - "placeholders": {} - }, "verified": "已驗證", "@verified": { "type": "text", "placeholders": {} }, - "verifiedSession": "工作階段成功驗證!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, "verify": "驗證", "@verify": { "type": "text", "placeholders": {} }, - "verifyManual": "手動驗證", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, "verifyStart": "開始驗證", "@verifyStart": { "type": "text", @@ -2092,17 +1555,12 @@ "type": "text", "placeholders": {} }, - "verifyUser": "驗證使用者", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, "videoCall": "視訊通話", "@videoCall": { "type": "text", "placeholders": {} }, - "visibilityOfTheChatHistory": "聊天記錄的可見性", + "visibilityOfTheChatHistory": "聊天室記錄的可見性", "@visibilityOfTheChatHistory": { "type": "text", "placeholders": {} @@ -2122,22 +1580,22 @@ "type": "text", "placeholders": {} }, - "waitingPartnerAcceptRequest": "正在等待夥伴接受請求…", + "waitingPartnerAcceptRequest": "正在等待夥伴接受請求...…", "@waitingPartnerAcceptRequest": { "type": "text", "placeholders": {} }, - "waitingPartnerEmoji": "正在等待夥伴接受表情符號…", + "waitingPartnerEmoji": "正在等待夥伴接受表情符號...…", "@waitingPartnerEmoji": { "type": "text", "placeholders": {} }, - "waitingPartnerNumbers": "正在等待夥伴接受數字…", + "waitingPartnerNumbers": "正在等待夥伴接受數字...…", "@waitingPartnerNumbers": { "type": "text", "placeholders": {} }, - "wallpaper": "桌布", + "wallpaper": "桌布:", "@wallpaper": { "type": "text", "placeholders": {} @@ -2147,21 +1605,6 @@ "type": "text", "placeholders": {} }, - "warningEncryptionInBeta": "點對點加密目前處於Beta測試中!使用的話後果自負呦!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "星期三", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "歡迎使用Matrix中最可愛的即時通訊軟體(*´▽`*)。", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, "weSentYouAnEmail": "我們向您傳送了一封電子郵件", "@weSentYouAnEmail": { "type": "text", @@ -2182,7 +1625,7 @@ "type": "text", "placeholders": {} }, - "wipeChatBackup": "要清除您的聊天記錄備份以建立新的安全金鑰嗎?", + "wipeChatBackup": "是否清除您的聊天室記錄備份以建立新的安全金鑰嗎?", "@wipeChatBackup": { "type": "text", "placeholders": {} @@ -2192,7 +1635,7 @@ "type": "text", "placeholders": {} }, - "writeAMessage": "輸入訊息…", + "writeAMessage": "輸入訊息...…", "@writeAMessage": { "type": "text", "placeholders": {} @@ -2207,58 +1650,21 @@ "type": "text", "placeholders": {} }, - "youAreInvitedToThisChat": "有人邀請您加入這個聊天室", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, "youAreNoLongerParticipatingInThisChat": "您不再參與這個聊天室了", "@youAreNoLongerParticipatingInThisChat": { "type": "text", "placeholders": {} }, - "youCannotInviteYourself": "您不能邀請您自己", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "您已經被這個聊天室封禁", + "youHaveBeenBannedFromThisChat": "您已經被這個聊天室封鎖", "@youHaveBeenBannedFromThisChat": { "type": "text", "placeholders": {} }, - "yourOwnUsername": "您的使用者名稱", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, "yourPublicKey": "您的公鑰", "@yourPublicKey": { "type": "text", "placeholders": {} }, - "youWillBeConnectedTo": "您將會連接到{homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "放大", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "縮小", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "公開的群組", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, "people": "人", "@people": { "type": "text", @@ -2274,7 +1680,7 @@ "type": "text", "placeholders": {} }, - "commandHint_ban": "在此聊天室封禁該使用者", + "commandHint_ban": "在此聊天室封鎖該使用者", "@commandHint_ban": { "type": "text", "description": "Usage hint for the command /ban" @@ -2284,7 +1690,7 @@ "type": "text", "description": "Usage hint for the command /clearcache" }, - "commandHint_create": "建立一個空的群聊\n使用 --no-encryption 選項來禁用加密", + "commandHint_create": "建立一個空的群聊\n使用 --no-encryption 選項來停用加密", "@commandHint_create": { "type": "text", "description": "Usage hint for the command /create" @@ -2294,7 +1700,7 @@ "type": "text", "description": "Usage hint for the command /discardsession" }, - "commandHint_dm": "啟動一對一聊天\n使用 --no-encryption 選項來禁用加密", + "commandHint_dm": "啟動一對一聊天室\n使用 --no-encryption 選項來停用加密", "@commandHint_dm": { "type": "text", "description": "Usage hint for the command /dm" @@ -2336,7 +1742,7 @@ }, "addToSpace": "加入空間", "@addToSpace": {}, - "cantOpenUri": "無法打開URI {uri}", + "cantOpenUri": "無法打開 URI {uri}", "@cantOpenUri": { "type": "text", "placeholders": { @@ -2345,61 +1751,1017 @@ }, "repeatPassword": "再次輸入密碼", "@repeatPassword": {}, - "yourChatBackupHasBeenSetUp": "您的聊天記錄備份已設定。", + "yourChatBackupHasBeenSetUp": "您的聊天室記錄備份已設定。", "@yourChatBackupHasBeenSetUp": {}, - "pleaseChooseAtLeastChars": "請至少輸入 {min} 个字元。", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "setupChatBackupDescription": "為了保護您的消息,我們為您生成了一個安全金鑰。\n請將其儲存在安全的地方,例如密碼管理器中。", - "@setupChatBackupDescription": {}, "goToTheNewRoom": "前往新聊天室", "@goToTheNewRoom": { "type": "text", "placeholders": {} }, - "commandHint_myroomavatar": "設置您的聊天室頭貼(通過 mxc-uri)", + "commandHint_myroomavatar": "設定您的聊天室頭貼(通過 mxc-uri)", "@commandHint_myroomavatar": { "type": "text", "description": "Usage hint for the command /myroomavatar" }, - "commandHint_unban": "在此聊天室解封該使用者", + "commandHint_unban": "在此聊天室解除封鎖該使用者", "@commandHint_unban": { "type": "text", "description": "Usage hint for the command /unban" }, - "passwordsDoNotMatch": "密碼不匹配!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "請輸入一個有效的電子郵件地址。", - "@pleaseEnterValidEmail": {}, "autoplayImages": "自動播放動態貼圖和表情", "@autoplayImages": { "type": "text", "placeholder": {} }, - "sendOnEnter": "按 Enter 鍵發送", + "sendOnEnter": "按 Enter 鍵傳送", "@sendOnEnter": {}, "changeYourAvatar": "更改您的大頭貼", "@changeYourAvatar": { "type": "text", "placeholders": {} }, - "yourUserId": "您的ID:", - "@yourUserId": {}, - "setupChatBackup": "設定聊天記錄備份", - "@setupChatBackup": {}, - "iWroteDownTheKey": "我已經記下了金鑰", - "@iWroteDownTheKey": {}, - "chatHasBeenAddedToThisSpace": "聊天室已添加到此空間", + "chatHasBeenAddedToThisSpace": "聊天室已新增到此空間", "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "聊天室已從此空間移除", - "@chatHasBeenRemovedFromThisSpace": { + "clearArchive": "清除存檔", + "@clearArchive": {}, + "hugContent": "{senderName} 擁抱您", + "@hugContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_cuddle": "傳送一個摟抱表情", + "@commandHint_cuddle": {}, + "supposedMxid": "此處應爲 {mxid}", + "@supposedMxid": { + "type": "text", + "placeholders": { + "mxid": {} + } + }, + "invalidServerName": "伺服器名稱錯誤", + "@invalidServerName": {}, + "importFromZipFile": "從 .zip 檔案匯入", + "@importFromZipFile": {}, + "homeserver": "伺服器", + "@homeserver": {}, + "exportEmotePack": "將表情包匯出成 .zip 檔案", + "@exportEmotePack": {}, + "commandInvalid": "命令無效", + "@commandInvalid": { + "type": "text" + }, + "commandMissing": "{command} 不是正確的命令。", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, + "googlyEyesContent": "{senderName} 向您傳送了瞪眼表情", + "@googlyEyesContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "addChatDescription": "新增聊天室描述......", + "@addChatDescription": {}, + "sendTypingNotifications": "傳送「輸入中」通知", + "@sendTypingNotifications": {}, + "importEmojis": "匯入表情包", + "@importEmojis": {}, + "confirmMatrixId": "如需刪除你的帳戶,請確認你的 Matrix ID。", + "@confirmMatrixId": {}, + "notAnImage": "不是圖片檔案。", + "@notAnImage": {}, + "cuddleContent": "{senderName} 摟抱您", + "@cuddleContent": { + "type": "text", + "placeholders": { + "senderName": {} + } + }, + "commandHint_hug": "傳送一個擁抱表情", + "@commandHint_hug": {}, + "replace": "取代", + "@replace": {}, + "commandHint_googly": "傳送一些瞪眼表情", + "@commandHint_googly": {}, + "importNow": "立即匯入", + "@importNow": {}, + "blockListDescription": "你可以封鎖打擾你的使用者。你不會再收到任何從已封鎖使用者發來的訊息或聊天室邀請。", + "@blockListDescription": {}, + "blockedUsers": "已封鎖的使用者", + "@blockedUsers": {}, + "block": "封鎖", + "@block": {}, + "discover": "發現", + "@discover": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "sender": "傳送者", + "@sender": {}, + "voiceCall": "語音通話", + "@voiceCall": {}, + "blockUsername": "無視使用者名稱", + "@blockUsername": {}, + "noBackupWarning": "警告!如果不啟用聊天室備份,您將失去對加密訊息的訪問。強烈建議在登出前先啟用聊天室備份。", + "@noBackupWarning": {}, + "addChatOrSubSpace": "新增聊天室或子空間", + "@addChatOrSubSpace": {}, + "thisDevice": "這個裝置:", + "@thisDevice": {}, + "separateChatTypes": "分開私訊和群組", + "@separateChatTypes": { "type": "text", "placeholders": {} }, - "clearArchive": "清除存檔", - "@clearArchive": {} + "commandHint_markasdm": "將給定的 Matrix ID 標示為直接訊息房間", + "@commandHint_markasdm": {}, + "commandHint_html": "傳送 HTML 格式的文字", + "@commandHint_html": { + "type": "text", + "description": "Usage hint for the command /html" + }, + "commandHint_send": "傳送文字", + "@commandHint_send": { + "type": "text", + "description": "Usage hint for the command /send" + }, + "emoteKeyboardNoRecents": "最近使用的表情將顯示在這裡...", + "@emoteKeyboardNoRecents": { + "type": "text", + "placeholders": {} + }, + "noChatDescriptionYet": "尚未建立聊天室描述。", + "@noChatDescriptionYet": {}, + "optionalRedactReason": "(非必填)收回此訊息的原因...", + "@optionalRedactReason": {}, + "dehydrateWarning": "此操作不能反悔。請確保安全地存儲備份文件。", + "@dehydrateWarning": {}, + "hydrateTorLong": "上次在 TOR 上匯出會話了嗎?快速匯入它已繼續使用聊天室。", + "@hydrateTorLong": {}, + "hydrate": "從備份文件恢復", + "@hydrate": {}, + "locationDisabledNotice": "位置服務被停用。請啟用它們以能夠分享您的位置。", + "@locationDisabledNotice": { + "type": "text", + "placeholders": {} + }, + "noMatrixServer": "{server1} 不是 Matrix 服務器,改用 {server2} 嗎?", + "@noMatrixServer": { + "type": "text", + "placeholders": { + "server1": {}, + "server2": {} + } + }, + "addToBundle": "新增到套組", + "@addToBundle": {}, + "bundleName": "套組名稱", + "@bundleName": {}, + "pleaseEnterYourPin": "請輸入您的密碼", + "@pleaseEnterYourPin": { + "type": "text", + "placeholders": {} + }, + "redactedByBecause": "由 {username} 編輯,原因:「{reason}」", + "@redactedByBecause": { + "type": "text", + "placeholders": { + "username": {}, + "reason": {} + } + }, + "saveFile": "儲存檔案", + "@saveFile": { + "type": "text", + "placeholders": {} + }, + "publish": "發布", + "@publish": {}, + "hasKnocked": "🚪 {user} 敲門了", + "@hasKnocked": { + "placeholders": { + "user": {} + } + }, + "unlockOldMessages": "解鎖舊消息", + "@unlockOldMessages": {}, + "callingAccountDetails": "允許 FluffyChat 使用原生 Android 撥號應用程式。", + "@callingAccountDetails": {}, + "noOtherDevicesFound": "未找到其他裝置", + "@noOtherDevicesFound": {}, + "noUsersFoundWithQuery": "很遺憾,找不到與「{query}」相符的使用者。請檢查是否有打錯字。", + "@noUsersFoundWithQuery": { + "type": "text", + "placeholders": { + "query": {} + } + }, + "publicLink": "公開網址", + "@publicLink": {}, + "dehydrate": "匯出會話並清除裝置", + "@dehydrate": {}, + "dehydrateTor": "TOR 使用者:匯出會話", + "@dehydrateTor": {}, + "reopenChat": "重新開啟聊天室", + "@reopenChat": {}, + "widgetNameError": "請提供一個顯示名稱。", + "@widgetNameError": {}, + "yourGlobalUserIdIs": "您的全域使用者ID是: ", + "@yourGlobalUserIdIs": {}, + "startFirstChat": "開始您的第一次聊天室", + "@startFirstChat": {}, + "experimentalVideoCalls": "實驗性視訊通話", + "@experimentalVideoCalls": {}, + "youAcceptedTheInvitation": "👍 您接受了邀請", + "@youAcceptedTheInvitation": {}, + "storeSecurlyOnThisDevice": "在此裝置上安全存儲", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} 個文件", + "@countFiles": { + "placeholders": { + "count": {} + } + }, + "screenSharingDetail": "您正在 FuffyChat 中分享您的螢幕", + "@screenSharingDetail": {}, + "wrongPinEntered": "輸入的密碼錯誤! {seconds} 秒後再試一次......", + "@wrongPinEntered": { + "type": "text", + "placeholders": { + "seconds": {} + } + }, + "archiveRoomDescription": "聊天室將被移動到存檔中。其他使用者將能看到您已離開聊天室。", + "@archiveRoomDescription": {}, + "banUserDescription": "該使用者將被禁止進入聊天室,直到他們被解封之前都無法再次進入聊天室。", + "@banUserDescription": {}, + "searchChatsRooms": "搜尋 #chats, @users...", + "@searchChatsRooms": {}, + "decline": "拒絕", + "@decline": {}, + "sendReadReceipts": "傳送已讀回條", + "@sendReadReceipts": {}, + "formattedMessagesDescription": "使用 markdown 顯示豐富的訊息內容,如粗體文字。", + "@formattedMessagesDescription": {}, + "verifyOtherDevice": "🔐 驗證其他裝置", + "@verifyOtherDevice": {}, + "youInvitedUser": "📩 您邀請了 {user}", + "@youInvitedUser": { + "placeholders": { + "user": {} + } + }, + "pinMessage": "釘選到房間", + "@pinMessage": {}, + "youKicked": "👞 您踢出了 {user}", + "@youKicked": { + "placeholders": { + "user": {} + } + }, + "users": "使用者", + "@users": {}, + "pleaseChoose": "請選擇", + "@pleaseChoose": { + "type": "text", + "placeholders": {} + }, + "youRejectedTheInvitation": "您拒絕了邀請", + "@youRejectedTheInvitation": {}, + "enterRoom": "進入房間", + "@enterRoom": {}, + "allSpaces": "所有空間", + "@allSpaces": {}, + "indexedDbErrorLong": "預設情況下,私密模式不啟用消息存儲。\n請訪問\n - about:config\n - 將 dom.indexedDB.privateBrowsing.enabled 設定為 true\n否則,無法運行 FluffyChat。", + "@indexedDbErrorLong": {}, + "youKickedAndBanned": "🙅 您踢出並封鎖了 {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": {} + } + }, + "user": "使用者", + "@user": {}, + "custom": "自訂", + "@custom": {}, + "hidePresences": "隱藏狀態列表?", + "@hidePresences": {}, + "signInWithPassword": "使用密碼登入", + "@signInWithPassword": {}, + "setColorTheme": "設定顏色主題:", + "@setColorTheme": {}, + "makeAdminDescription": "一旦您讓這個使用者成為管理員,您可能無法撤銷此操作,因為他們將擁有與您相同的權限。", + "@makeAdminDescription": {}, + "createGroupAndInviteUsers": "建立群組並邀請使用者", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "可以透過搜尋找到群組", + "@groupCanBeFoundViaSearch": {}, + "pleaseEnterYourCurrentPassword": "請輸入您當前的密碼", + "@pleaseEnterYourCurrentPassword": {}, + "widgetCustom": "自訂", + "@widgetCustom": {}, + "createGroup": "建立群組", + "@createGroup": {}, + "enterSpace": "進入空間", + "@enterSpace": {}, + "shareLocation": "分享位置", + "@shareLocation": { + "type": "text", + "placeholders": {} + }, + "widgetVideo": "影片", + "@widgetVideo": {}, + "redactMessageDescription": "該訊息將對此對話中的所有參與者收回。這不能被反悔。", + "@redactMessageDescription": {}, + "removeFromBundle": "從此套組中移除", + "@removeFromBundle": {}, + "widgetName": "名稱", + "@widgetName": {}, + "jump": "跳轉", + "@jump": {}, + "commandHint_unignore": "取消無視已提供的 Matrix ID", + "@commandHint_unignore": {}, + "commandHint_markasgroup": "標示為群組", + "@commandHint_markasgroup": {}, + "commandHint_me": "描述自己", + "@commandHint_me": { + "type": "text", + "description": "Usage hint for the command /me" + }, + "commandHint_plain": "傳送未格式化的文字", + "@commandHint_plain": { + "type": "text", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "以反應的形式傳送回覆", + "@commandHint_react": { + "type": "text", + "description": "Usage hint for the command /react" + }, + "createNewSpace": "新建空間", + "@createNewSpace": { + "type": "text", + "placeholders": {} + }, + "allRooms": "所有群組聊天室", + "@allRooms": { + "type": "text", + "placeholders": {} + }, + "chatPermissions": "聊天室權限", + "@chatPermissions": {}, + "customEmojisAndStickersBody": "新增或分享可在任何聊天室中使用的自訂表情符號或貼圖。", + "@customEmojisAndStickersBody": {}, + "errorObtainingLocation": "取得位置錯誤:{error}", + "@errorObtainingLocation": { + "type": "text", + "placeholders": { + "error": {} + } + }, + "hideRedactedMessages": "隱藏被刪除的訊息", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "隱藏無效或未知的訊息格式", + "@hideInvalidOrUnknownMessageFormats": {}, + "dehydrateTorLong": "對 TOR 使用者,建議在關閉窗口前匯出會話。", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR 使用者:匯入會話", + "@hydrateTor": {}, + "messagesStyle": "訊息樣式:", + "@messagesStyle": {}, + "shareInviteLink": "分享邀請網址", + "@shareInviteLink": {}, + "scanQrCode": "掃描 QR 碼", + "@scanQrCode": {}, + "openVideoCamera": "打開錄影", + "@openVideoCamera": { + "type": "text", + "placeholders": {} + }, + "oneClientLoggedOut": "您的一個客戶端已登出", + "@oneClientLoggedOut": {}, + "addAccount": "新增帳號", + "@addAccount": {}, + "editBundlesForAccount": "為此帳號編輯套組", + "@editBundlesForAccount": {}, + "openInMaps": "在地圖中打開", + "@openInMaps": { + "type": "text", + "placeholders": {} + }, + "serverRequiresEmail": "該伺服器需要驗證您的註冊電子郵件地址。", + "@serverRequiresEmail": {}, + "or": "或", + "@or": { + "type": "text", + "placeholders": {} + }, + "hideMemberChangesInPublicChatsBody": "若有人加入或離開公開聊天室,將不在聊天室時間軸顯示,以提升資訊可讀性。", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "概觀", + "@overview": {}, + "notifyMeFor": "通知我", + "@notifyMeFor": {}, + "passwordRecoverySettings": "恢復密碼設定", + "@passwordRecoverySettings": {}, + "redactedBy": "由 {username} 編輯", + "@redactedBy": { + "type": "text", + "placeholders": { + "username": {} + } + }, + "recoveryKey": "恢復金鑰", + "@recoveryKey": {}, + "spaceName": "空間名稱", + "@spaceName": { + "type": "text", + "placeholders": {} + }, + "synchronizingPleaseWait": "正在同步... 請稍候。", + "@synchronizingPleaseWait": { + "type": "text", + "placeholders": {} + }, + "messageInfo": "訊息資訊", + "@messageInfo": {}, + "removeFromSpace": "從空間中移除", + "@removeFromSpace": {}, + "addToSpaceDescription": "選擇一個空間將此聊天室加入。", + "@addToSpaceDescription": {}, + "pleaseEnterRecoveryKeyDescription": "要解鎖您的舊訊息,請輸入在之前的會話中生成的恢復密鑰。您的恢復密鑰不是您的密碼。", + "@pleaseEnterRecoveryKeyDescription": {}, + "videoWithSize": "影片({size})", + "@videoWithSize": { + "type": "text", + "placeholders": { + "size": {} + } + }, + "emojis": "表情符號", + "@emojis": {}, + "placeCall": "發起通話", + "@placeCall": {}, + "unsupportedAndroidVersion": "不支持的Android版本", + "@unsupportedAndroidVersion": {}, + "videoCallsBetaWarning": "請注意,視訊通話目前處於測試階段。它們可能不會按預期工作,或者在所有平台上都不工作。", + "@videoCallsBetaWarning": {}, + "widgetUrlError": "這不是一個有效的URL。", + "@widgetUrlError": {}, + "nextAccount": "下一個帳戶", + "@nextAccount": {}, + "previousAccount": "上一個帳戶", + "@previousAccount": {}, + "addWidget": "新增小工具", + "@addWidget": {}, + "errorAddingWidget": "新增小工具時發生錯誤。", + "@errorAddingWidget": {}, + "youJoinedTheChat": "您加入了聊天室", + "@youJoinedTheChat": {}, + "youBannedUser": "您封鎖了 {user}", + "@youBannedUser": { + "placeholders": { + "user": {} + } + }, + "youHaveWithdrawnTheInvitationFor": "您已收回對 {user} 的邀請", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": {} + } + }, + "youInvitedBy": "📩 您被 {user} 邀請", + "@youInvitedBy": { + "placeholders": { + "user": {} + } + }, + "youUnbannedUser": "您解除封鎖了 {user}", + "@youUnbannedUser": { + "placeholders": { + "user": {} + } + }, + "youInvitedToBy": "📩 您通過網址被邀請至:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": {} + } + }, + "callingPermissions": "通話權限", + "@callingPermissions": {}, + "callingAccount": "通話帳戶", + "@callingAccount": {}, + "appearOnTop": "顯示在最上層", + "@appearOnTop": {}, + "newGroup": "新群組", + "@newGroup": {}, + "newSpace": "新空間", + "@newSpace": {}, + "numChats": "{number} 個聊天室", + "@numChats": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "hideUnimportantStateEvents": "隱藏不重要的狀態事件", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "不再顯示", + "@doNotShowAgain": {}, + "encryptThisChat": "加密此聊天室", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "抱歉......這是不可能的", + "@sorryThatsNotPossible": {}, + "profileNotFound": "在伺服器上找不到該使用者。可能是連接問題或該使用者不存在。", + "@profileNotFound": {}, + "invite": "邀請", + "@invite": {}, + "invitePrivateChat": "📨 邀請私人聊天室", + "@invitePrivateChat": {}, + "removeDevicesDescription": "您將從這個裝置登出,並將不再能夠接收消息。", + "@removeDevicesDescription": {}, + "unbanUserDescription": "如果該使用者嘗試,他們將能夠再次進入聊天室。", + "@unbanUserDescription": {}, + "kickUserDescription": "該使用者被踢出聊天室,但未被禁止。在公開聊天室中,該使用者可以隨時重新加入。", + "@kickUserDescription": {}, + "pushNotificationsNotAvailable": "推送通知不可用", + "@pushNotificationsNotAvailable": {}, + "learnMore": "了解更多", + "@learnMore": {}, + "nothingFound": "什麼都沒找到......", + "@nothingFound": {}, + "startConversation": "開始對話", + "@startConversation": {}, + "databaseMigrationBody": "請稍候。這可能需要一點時間。", + "@databaseMigrationBody": {}, + "pleaseChooseAStrongPassword": "請選擇一個強密碼", + "@pleaseChooseAStrongPassword": {}, + "passwordIsWrong": "您輸入的密碼錯誤", + "@passwordIsWrong": {}, + "publicChatAddresses": "公開聊天室地址", + "@publicChatAddresses": {}, + "userRole": "使用者角色", + "@userRole": {}, + "minimumPowerLevel": "{level} 是最低權限等級。", + "@minimumPowerLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "leaveEmptyToClearStatus": "留空以清除您的狀態。", + "@leaveEmptyToClearStatus": {}, + "select": "選擇", + "@select": {}, + "files": "文件", + "@files": {}, + "forwardMessageTo": "將訊息轉發至 {roomName}?", + "@forwardMessageTo": { + "type": "text", + "placeholders": { + "roomName": {} + } + }, + "sendTypingNotificationsDescription": "聊天室中的其他參與者可以看到您正在輸入新訊息。", + "@sendTypingNotificationsDescription": {}, + "verifyOtherDeviceDescription": "當您驗證另一個裝置時,這些裝置可以交換密鑰,提升您的整體安全性。💪 當您開始驗證時,一個彈出視窗將在兩個裝置上的應用程式中出現。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。在開始驗證之前最好有兩個裝置在手邊。🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} 接受了密鑰驗證", + "@acceptedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "completedKeyVerification": "{sender} 完成了密鑰驗證", + "@completedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "isReadyForKeyVerification": "{sender} 已準備好進行密鑰驗證", + "@isReadyForKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "thereAreCountUsersBlocked": "目前有 {count} 名使用者被封鎖。", + "@thereAreCountUsersBlocked": { + "type": "text", + "count": {} + }, + "knockRestricted": "敲門受限", + "@knockRestricted": {}, + "appLockDescription": "未使用時以密碼鎖定應用程式", + "@appLockDescription": {}, + "globalChatId": "全球聊天室 ID", + "@globalChatId": {}, + "accessAndVisibility": "訪問權限和可見性", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "誰被允許加入此聊天室以及如何發現聊天室。", + "@accessAndVisibilityDescription": {}, + "calls": "通話", + "@calls": {}, + "chatDescription": "聊天室描述", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "聊天室描述已變更", + "@chatDescriptionHasBeenChanged": {}, + "tryAgain": "再試一次", + "@tryAgain": {}, + "pleaseEnterRecoveryKey": "請輸入您的恢復金鑰:", + "@pleaseEnterRecoveryKey": {}, + "directChat": "私訊", + "@directChat": {}, + "register": "註冊", + "@register": { + "type": "text", + "placeholders": {} + }, + "setAsCanonicalAlias": "設為主要別名", + "@setAsCanonicalAlias": { + "type": "text", + "placeholders": {} + }, + "setChatDescription": "設定聊天室描述", + "@setChatDescription": {}, + "groupName": "群組名稱", + "@groupName": {}, + "searchForUsers": "搜尋 @users...", + "@searchForUsers": {}, + "inviteGroupChat": "📨 邀請群組聊天室", + "@inviteGroupChat": {}, + "setTheme": "設定主題:", + "@setTheme": {}, + "knocking": "敲門", + "@knocking": {}, + "sessionLostBody": "您的會話已丟失。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@sessionLostBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "swipeRightToLeftToReply": "向右滑至左以回覆", + "@swipeRightToLeftToReply": {}, + "hideRedactedMessagesBody": "如果有人收回一條訊息,該訊息將不再在聊天室中顯示。", + "@hideRedactedMessagesBody": {}, + "link": "網址", + "@link": {}, + "obtainingLocation": "正在取得位置…", + "@obtainingLocation": { + "type": "text", + "placeholders": {} + }, + "oopsPushError": "哎呀!設定推送通知時不幸發生錯誤。", + "@oopsPushError": { + "type": "text", + "placeholders": {} + }, + "removeYourAvatar": "移除您的頭像", + "@removeYourAvatar": { + "type": "text", + "placeholders": {} + }, + "singlesignon": "單一登入", + "@singlesignon": { + "type": "text", + "placeholders": {} + }, + "presenceStyle": "目前狀態:", + "@presenceStyle": { + "type": "text", + "placeholders": {} + }, + "presencesToggle": "顯示其他使用者的狀態訊息", + "@presencesToggle": { + "type": "text", + "placeholders": {} + }, + "spaceIsPublic": "空間是公開的", + "@spaceIsPublic": { + "type": "text", + "placeholders": {} + }, + "dismiss": "解散", + "@dismiss": {}, + "reactedWith": "{sender} 以 {reaction} 回應", + "@reactedWith": { + "type": "text", + "placeholders": { + "sender": {}, + "reaction": {} + } + }, + "confirmEventUnpin": "您確定要永久取消釘選該事件嗎?", + "@confirmEventUnpin": {}, + "switchToAccount": "切換到帳戶 {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": {} + } + }, + "widgetEtherpad": "文字筆記", + "@widgetEtherpad": {}, + "noOneCanJoin": "沒有人可以加入", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} 想要加入聊天室。", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": {} + } + }, + "noPublicLinkHasBeenCreatedYet": "尚未建立公開網址", + "@noPublicLinkHasBeenCreatedYet": {}, + "saveKeyManuallyDescription": "通過觸發系統分享對話框或剪貼板手動保存此密鑰。", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "存儲在 Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "存儲在 Apple KeyChain", + "@storeInAppleKeyChain": {}, + "foregroundServiceRunning": "當前景服務正在運行時會顯示此通知。", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "螢幕分享", + "@screenSharingTitle": {}, + "wasDirectChatDisplayName": "空的聊天室(原名稱為 {oldDisplayName} )", + "@wasDirectChatDisplayName": { + "type": "text", + "placeholders": { + "oldDisplayName": {} + } + }, + "otherCallingPermissions": "麥克風、相機和其他 FluffyChat 權限", + "@otherCallingPermissions": {}, + "disableEncryptionWarning": "出於安全原因,您不能在之前已加密的聊天室中停用加密。", + "@disableEncryptionWarning": {}, + "deviceKeys": "裝置密鑰:", + "@deviceKeys": {}, + "fileIsTooBigForServer": "伺服器報告該文件太大,無法傳送。", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "文件已保存在 {path}", + "@fileHasBeenSavedAt": { + "type": "text", + "placeholders": { + "path": {} + } + }, + "jumpToLastReadMessage": "跳至最後讀取的訊息", + "@jumpToLastReadMessage": {}, + "openLinkInBrowser": "在瀏覽器中開啟連結", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 哦不。出了些問題。如果您願意,可以將此錯誤報告給開發者。", + "@reportErrorDescription": {}, + "readUpToHere": "讀到這裡", + "@readUpToHere": {}, + "report": "報告", + "@report": {}, + "pleaseEnterANumber": "請輸入大於 0 的數字", + "@pleaseEnterANumber": {}, + "roomUpgradeDescription": "將使用新版本聊天室來重新建立聊天室。所有本聊天室的參與者都會收到通知,他們都需要換到新的聊天室裡。若您想知道有關新版本的更多資訊,請前往 https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "wrongRecoveryKey": "抱歉......這似乎不是正確的恢復密鑰。", + "@wrongRecoveryKey": {}, + "passwordsDoNotMatch": "密碼不匹配", + "@passwordsDoNotMatch": {}, + "publicSpaces": "公共空間", + "@publicSpaces": {}, + "subspace": "子空間", + "@subspace": {}, + "initAppError": "初始化應用時發生錯誤", + "@initAppError": {}, + "canceledKeyVerification": "{sender} 取消了密鑰驗證", + "@canceledKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "startedKeyVerification": "{sender} 開始了密鑰驗證", + "@startedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "transparent": "透明", + "@transparent": {}, + "incomingMessages": "收到的訊息", + "@incomingMessages": {}, + "databaseMigrationTitle": "資料庫已最佳化", + "@databaseMigrationTitle": {}, + "restoreSessionBody": "應用程式現在嘗試從備份中恢復您的會話。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@restoreSessionBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "stickers": "貼圖", + "@stickers": {}, + "joinSpace": "加入空間", + "@joinSpace": {}, + "noMoreChatsFound": "沒有更多聊天室了...", + "@noMoreChatsFound": {}, + "commandHint_op": "設定給定使用者的權限等級(預設:50)", + "@commandHint_op": { + "type": "text", + "description": "Usage hint for the command /op" + }, + "customEmojisAndStickers": "自訂表情符號和貼圖", + "@customEmojisAndStickers": {}, + "locationPermissionDeniedNotice": "位置權限被拒絕。請授予它們以能夠分享您的位置。", + "@locationPermissionDeniedNotice": { + "type": "text", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "您想邀請 {contact} 加入 「{groupName}」 聊天室嗎?", + "@inviteContactToGroupQuestion": {}, + "enableMultiAccounts": "(實驗性功能)在此裝置上啟用多個帳號", + "@enableMultiAccounts": {}, + "hideMemberChangesInPublicChats": "在公開聊天室中隱藏成員變動", + "@hideMemberChangesInPublicChats": {}, + "recoveryKeyLost": "遺失恢復金鑰?", + "@recoveryKeyLost": {}, + "sendAsText": "以文字傳送", + "@sendAsText": { + "type": "text" + }, + "sendSticker": "傳送貼圖", + "@sendSticker": { + "type": "text", + "placeholders": {} + }, + "unverified": "尚未驗證", + "@unverified": {}, + "time": "時間", + "@time": {}, + "chatCanBeDiscoveredViaSearchOnServer": "可以透過在 {server} 上的搜尋發現聊天室", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "text", + "placeholders": { + "server": {} + } + }, + "commandHint_sendraw": "傳送原始 json", + "@commandHint_sendraw": {}, + "newPassword": "新密碼", + "@newPassword": {}, + "createNewAddress": "建立新地址", + "@createNewAddress": {}, + "searchIn": "在聊天室「{chat}」中搜尋......", + "@searchIn": { + "type": "text", + "placeholders": { + "chat": {} + } + }, + "searchMore": "搜尋更多......", + "@searchMore": {}, + "gallery": "畫廊", + "@gallery": {}, + "databaseBuildErrorBody": "無法建立 SQLite 資料庫。應用程式目前嘗試使用遺留資料庫。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@databaseBuildErrorBody": { + "type": "text", + "placeholders": { + "url": {}, + "error": {} + } + }, + "sendReadReceiptsDescription": "聊天室中的其他參與者可以看到您已讀取一條訊息。", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "格式化訊息", + "@formattedMessages": {}, + "restricted": "受限", + "@restricted": {}, + "goToSpace": "前往空間:{space}", + "@goToSpace": { + "type": "text", + "space": {} + }, + "markAsUnread": "標示為未讀", + "@markAsUnread": {}, + "noDatabaseEncryption": "此平台不支援資料庫加密", + "@noDatabaseEncryption": {}, + "messageType": "訊息類型", + "@messageType": {}, + "openGallery": "開啟畫廊", + "@openGallery": {}, + "markAsRead": "標示為已讀", + "@markAsRead": {}, + "reportUser": "舉報使用者", + "@reportUser": {}, + "unsupportedAndroidVersionLong": "此功能需要較新的 Android 版本。請檢查更新或 Lineage OS 支持。", + "@unsupportedAndroidVersionLong": {}, + "emailOrUsername": "電子郵件或使用者名", + "@emailOrUsername": {}, + "indexedDbErrorTitle": "私密模式問題", + "@indexedDbErrorTitle": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "usersMustKnock": "使用者必須敲門", + "@usersMustKnock": {}, + "knock": "敲門", + "@knock": {}, + "storeInSecureStorageDescription": "將恢復密鑰存儲在此裝置的安全存儲中。", + "@storeInSecureStorageDescription": {}, + "appearOnTopDetails": "允許應用程式顯示在最上層(如果您已將 Fluffychat 設定為通話帳戶則不需要)", + "@appearOnTopDetails": {}, + "whyIsThisMessageEncrypted": "為什麼這條訊息無法讀取?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "如果訊息是在您登入此裝置之前傳送的,就可能會發生這種情況。\n\n也有可能是傳送者已經封鎖了您的裝置,或者網絡連接出了問題。\n\n如果您能在另一個會話中讀取該訊息,那麼您可以從中轉移訊息!前往設定 > 裝置,並確保您的裝置已相互驗證。當您下次打開房間且兩個會話都在前景時,密鑰將自動傳輸。\n\n不想在登出或切換裝置時丟失密鑰?請確保您已在設定中啟用了聊天室備份。", + "@noKeyForThisMessage": {}, + "newSpaceDescription": "空間允許您整合您的聊天室並建立私人或公開社群。", + "@newSpaceDescription": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "請稍後再試,或選擇不同的伺服器。", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "使用 {provider} 登入", + "@signInWith": { + "type": "text", + "placeholders": { + "provider": {} + } + }, + "invalidInput": "無效的輸入!", + "@invalidInput": {}, + "verifyOtherUser": "🔐 驗證其他使用者", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "如果您驗證了另一個使用者,您可以確定您真正與誰通信。💪\n\n當您開始驗證時,您和另一個使用者將在應用程式中看到一個彈出視窗。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。\n\n最好的方式是見面或開始視訊通話。👭", + "@verifyOtherUserDescription": {}, + "requestedKeyVerification": "{sender} 請求了密鑰驗證", + "@requestedKeyVerification": { + "type": "text", + "placeholders": { + "sender": {} + } + }, + "commandHint_ignore": "無視已提供的 Matrix ID", + "@commandHint_ignore": {}, + "countChatsAndCountParticipants": "{chats} 個聊天室和 {participants} 位參與者", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "joinedChats": "已加入的聊天室", + "@joinedChats": {}, + "unread": "未讀", + "@unread": {}, + "space": "空間", + "@space": {}, + "spaces": "空間", + "@spaces": {}, + "start": "開始", + "@start": {}, + "openChat": "開啟聊天室", + "@openChat": {}, + "unreadChatsInApp": "{appname}:{unread} 未讀聊天室", + "@unreadChatsInApp": { + "type": "text", + "placeholders": { + "appname": {}, + "unread": {} + } + }, + "adminLevel": "{level} - 管理員", + "@adminLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "userLevel": "{level} - 用戶", + "@userLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "moderatorLevel": "{level} - 管理員", + "@moderatorLevel": { + "type": "text", + "placeholders": { + "level": {} + } + }, + "invitedBy": "📩 由 {user} 邀請", + "@invitedBy": { + "placeholders": { + "user": {} + } + } } diff --git a/assets/login_wallpaper.png b/assets/login_wallpaper.png deleted file mode 100644 index 2ca8c39e66..0000000000 Binary files a/assets/login_wallpaper.png and /dev/null differ diff --git a/assets/logo_transparent.png b/assets/logo_transparent.png new file mode 100644 index 0000000000..5c0b083914 Binary files /dev/null and b/assets/logo_transparent.png differ diff --git a/assets/private_chat_wallpaper.png b/assets/private_chat_wallpaper.png deleted file mode 100644 index f8e7c732cf..0000000000 Binary files a/assets/private_chat_wallpaper.png and /dev/null differ diff --git a/assets/share.png b/assets/share.png deleted file mode 100644 index 7e96adaf6d..0000000000 Binary files a/assets/share.png and /dev/null differ diff --git a/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg b/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg deleted file mode 100644 index 3950f49039..0000000000 Binary files a/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg and /dev/null differ diff --git a/assets/sounds/notification.ogg b/assets/sounds/notification.ogg new file mode 100644 index 0000000000..390f2bf8ef Binary files /dev/null and b/assets/sounds/notification.ogg differ diff --git a/assets/typing.gif b/assets/typing.gif deleted file mode 100644 index 11ee05e16a..0000000000 Binary files a/assets/typing.gif and /dev/null differ diff --git a/assets/verification.png b/assets/verification.png deleted file mode 100644 index 8bc9979884..0000000000 Binary files a/assets/verification.png and /dev/null differ diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000000..fa0b357c4f --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/docs/.well-known/org.flathub.VerifiedApps.txt b/docs/.well-known/org.flathub.VerifiedApps.txt new file mode 100644 index 0000000000..a9a5eb471e --- /dev/null +++ b/docs/.well-known/org.flathub.VerifiedApps.txt @@ -0,0 +1,2 @@ +# im.fluffychat.Fluffychat +8b25b37b-f160-4350-b4f6-9a04554e8f9e \ No newline at end of file diff --git a/docs/ZenKurenaido-Regular.ttf b/docs/ZenKurenaido-Regular.ttf deleted file mode 100644 index fe08f0a85c..0000000000 Binary files a/docs/ZenKurenaido-Regular.ttf and /dev/null differ diff --git a/docs/bg.svg b/docs/bg.svg deleted file mode 100644 index 362754b44d..0000000000 --- a/docs/bg.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/code_style.md b/docs/code_style.md deleted file mode 100644 index 712830d545..0000000000 --- a/docs/code_style.md +++ /dev/null @@ -1,138 +0,0 @@ -# Code Style - -FluffyChat tries to be as minimal as possible even in the code style. We try to keep the code clean, simple and easy to read. The source code of the app is under `/lib` with the main entry point `/lib/main.dart`. - -### Directory Structure: - - -- /lib - - /config - - app_config.dart - - ...Constants, styles and other configurations - - /utils - - handy_function.dart - - ...Helper functions and extensions - - /pages - - /chat - - chat.dart - - chat_view.dart - - /chat_list - - chat_list.dart - - chat_list_view.dart - - ...The pages of the app separated in Controllers and Views - - /widgets - - /layouts - - ...Custom widgets created for this project - - main.dart - - -Most of the business model is in the Famedly Matrix Dart SDK. We try to not keep a model inside of the source code but extend it under `/utils`. - -### Separation of Controllers and Views - -We split views and controller logic with stateful widgets as controller where the build method just builds a stateless widget which receives the state as the only parameter. A common controller would look like this: - -```dart -// /lib/controller/enter_name_controller.dart -import 'package:flutter/material.dart'; - -class EnterName extends StatefulWidget { - @override - EnterNameController createState() => EnterNameController(); -} - -class EnterNameController extends State { - final TextEditingController textEditingController = TextEditingController(); - String name = 'Unknown'; - - /// Changes the name with the content in the textfield. If the textfield is - /// empty, this breaks up and displays a SnackBar. - void setNameAction() { - if (textEditingController.text.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('You have not entered your name'), - ), - ); - return; - } - setState(() => name = textEditingController.text); - } - - @override - Widget build(BuildContext context) => EnterNameView(this); -} -``` - -So we have a controller for a `EnterName` view which as a `TextEditingController`, a state `name` and an action `void setNameAction()`. Actions must always be methods of a type, that we dont need to pass parameters in the corresponding view class and must have dartdoc comments. - -The view class could look like this: - -```dart -// /lib/views/enter_name_view.dart -import 'package:flutter/material.dart'; - -class EnterNameView extends StatelessWidget { - final EnterNameController controller; - - const EnterNameView(this.controller, {Key key}) : super(key: key); - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Your name: ${controller.name}'), - ), - body: Center( - child: TextField( - controller: controller.textEditingController, - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: controller.setNameAction, - child: Icon(Icons.save), - ), - ); - } -} -``` - -Views should just contain code which describes the view. All other parameters or logic should be in the controller. The job of the view class is just to take the current state and build the widget tree and pipe the callbacks back. If there is any calulation necessary which is not solveable as a simple if-else or switch statement, it should be done in an external helper function unter `/lib/utils/`. - -All file names must be lower_snake_case. All views must have a `View` suffix and all controller must have a `Controller` suffix. Widgets may have a controller too but they should pass the callbacks back to the view where possible. Calling one line methods directly in the view is only recommended if there is no need to pass a parameter. - -To perform an action on state initialization we use the initState method: -```dart -@override - void initState() { - // TODO: implement initState - super.initState(); - } -``` - -And the dispose method to perform an action on disposing: -```dart -@override - void dispose() { - // TODO: implement dispose - super.dispose(); - } -``` - -To run code after the widget was created first we use the WidgetBindings in the initState: -```dart -@override - void initState() { - WidgetsBinding.instance!.addPostFrameCallback((_) { - // Do something when build is finished - }); - super.initState(); - } -``` - -### Formatting - -We do not allow code with wrong formatting. Please run `flutter format lib` if your IDE doesn't do this automatically. - -### Code Analyzis - -We do not allow codes with dart errors or warnings. We use the [pedantic](https://pub.dev/packages/pedantic) package for static code analysis with additional rules under `analysis_options.yaml`. diff --git a/docs/en/privacy.html b/docs/en/privacy.html deleted file mode 100644 index 6651972a13..0000000000 --- a/docs/en/privacy.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - -

Please follow this link.

- - \ No newline at end of file diff --git a/docs/fdroid_repo.md b/docs/fdroid_repo.md deleted file mode 100644 index 45f1267987..0000000000 --- a/docs/fdroid_repo.md +++ /dev/null @@ -1,60 +0,0 @@ -# F-Droid Repository - -Our own F-Droid repository contains the Google Services which is not possible in the main F-Droid repository. Release candidates -are also published on it. - -## Add Repository to F-Droid - -Easiest way to add the Repository is to either scan the QR-Code or if you are on your phone directly click it. - -{::nomarkdown} - - - -{:/} - - -### If the QR-Code doesn't work: - -First check if you have f-droid installed. If not you can get it from: [https://f-droid.org/](https://f-droid.org/). -After you made sure you installed it and you didn't have it installed before you can try again the QR-Code. -If this still isn't working follow the next steps: - -1. Open the f-droid App -2. Go to the `Settings` Tab in the Bottom bar -3. Click the `Repositories` Action -4. Click on the plus sign at the top. -5. Fill in `https://fdroid.fluffychat.im` into the top field and `8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB` in the bottom field. - -## What is the fingerprint? - -The fingerprint of the Repository is: `8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB` - -# Nightly Repository - -## Add Repository to F-Droid - -Easiest way to add the Repository is to either scan the QR-Code or if you are on your phone directly click it. - -{::nomarkdown} - - - -{:/} - - -### If the QR-Code doesn't work: - -First check if you have f-droid installed. If not you can get it from: [https://f-droid.org/](https://f-droid.org/). -After you made sure you installed it and you didn't have it installed before you can try again the QR-Code. -If this still isn't working follow the next steps: - -1. Open the f-droid App -2. Go to the `Settings` Tab in the Bottom bar -3. Click the `Repositories` Action -4. Click on the plus sign at the top. -5. Fill in `https://nightly.fdroid.fluffychat.im` into the top field and `21A469657300576478B623DF99D8EB889A80BCD939ACA60A4074741BEAEC397D` in the bottom field. - -## What is the fingerprint? - -The fingerprint of the Repository is: `21A469657300576478B623DF99D8EB889A80BCD939ACA60A4074741BEAEC397D` diff --git a/docs/feature1.gif b/docs/feature1.gif new file mode 100644 index 0000000000..db6c8beb8a Binary files /dev/null and b/docs/feature1.gif differ diff --git a/docs/feature2.gif b/docs/feature2.gif new file mode 100644 index 0000000000..d6cf974b23 Binary files /dev/null and b/docs/feature2.gif differ diff --git a/docs/feature3.gif b/docs/feature3.gif new file mode 100644 index 0000000000..cd56dc5328 Binary files /dev/null and b/docs/feature3.gif differ diff --git a/docs/feature4.gif b/docs/feature4.gif new file mode 100644 index 0000000000..4f1c35dfdd Binary files /dev/null and b/docs/feature4.gif differ diff --git a/docs/feature5.gif b/docs/feature5.gif new file mode 100644 index 0000000000..b301d8fa0c Binary files /dev/null and b/docs/feature5.gif differ diff --git a/docs/feature6.gif b/docs/feature6.gif new file mode 100644 index 0000000000..d9fdba8d3e Binary files /dev/null and b/docs/feature6.gif differ diff --git a/docs/feature7.gif b/docs/feature7.gif new file mode 100644 index 0000000000..ced2184e1a Binary files /dev/null and b/docs/feature7.gif differ diff --git a/docs/feature8.gif b/docs/feature8.gif new file mode 100644 index 0000000000..95bf4e8171 Binary files /dev/null and b/docs/feature8.gif differ diff --git a/docs/feature9.gif b/docs/feature9.gif new file mode 100644 index 0000000000..a05001d089 Binary files /dev/null and b/docs/feature9.gif differ diff --git a/docs/how_to_fork.md b/docs/how_to_fork.md deleted file mode 100644 index 2452c13fdb..0000000000 --- a/docs/how_to_fork.md +++ /dev/null @@ -1,39 +0,0 @@ -# How to create your own FluffyChat fork - -## 1. License -FluffyChat is licensed under AGPL. Read the license -(https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/LICENSE) and -make sure that your fork is open source under the same license and that you -fulfill all requirements. Maybe you should consider contacting a lawyer **before** -you publish your fork. - -## 2. Disable end-to-end encryption! -Due to US export regulations you are not allowed to publish your app in -a store or anywhere on a US server before you have removed everything regarding -the encryption or fulfill the regulations. - -Learn more: -https://www.bis.doc.gov/index.php/policy-guidance/encryption - -If you need help from us with using E2EE in your fork read more below under the -topic "**Official Support**". - -## 3. Stay up to date! -FluffyChat contains security related stuff. If we find a security bug, we will -try to fix it as soon as possible and ship it with a new version. But this -means that your fork is out of date and a security risk. You can't be awake -24 hours a day so you must decide how you protect your users by chosing one -of the following methods: - -1. Make your fork as minimal as possible and enable repository mirroring. Set -up a CI which publishes new versions automatically if FluffyChat publishes a -bug fix. -2. Never sleep and pay a big team where one guy at least is never sleeping. -3. Contact [famedly.com](https://famedly.com) to buy official support. - -## 4. Official Support -FluffyChat is free as in free speech and not free beer! Please contact -my company [famedly.com](https://famedly.com) for offers and official support -and take in mind that it costs a lot of work and time to maintain FluffyChat -or the Famedly Matrix SDK. So we can't give you support for free. So please -expect around 1$ per month per user of your fork. diff --git a/docs/index.html b/docs/index.html index 482110f6ef..fef1124fda 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,571 +1,177 @@ + - - - - FluffyChat - Official Website - - - - - - - - - - - - - - - + + FluffyChat Official Website + + + + + + + + + + + + + +
+ +
+ FluffyChat Logo +

The cutest messenger in [matrix] +

+ + Mobile and desktop screenshots + +
+ + + + + + + + +
- - - - -
- -
- - - +
+
+ Animated dancing woman +

Easy to use

+

FluffyChat is designed to be as easy to use as possible. No one + should be left behind.

+
+
+ Animated pencil +

Material You

+

The well polished design is based on Material You and works great on + all platforms.

+
+
+ Animated mechanical arm +

Secure

+

With end-to-end encryption, cross-signing and encrypted backups, + FluffyChat is one of the most secure messenger out there.

- -
- - -
-

- Open. Nonprofit. Cute.

-

- Easy to use (matrix) messenger. Secure and decentralized.

- -

Mobile app:

-
- - - - -
-

Desktop app:

-
- - - - -
- -
- -
- -
+
+ Animated planet earth +

Decentral

+

You can choose the server you want to use or + even self-host your own!

+
+
+ Animated bell +

Push Notifications

+

You can choose between Firebase Cloud Messaging or the more privacy + focused Unified Push.

+
+
+ Animated rocket +

Spaces

+

With spaces you can join or create a community which organizes chats + and users. Using sub-spaces you can even nest your communities.

+
- - +
+ Animated glass sphere +

Video calls

+

Still an experimental feature but you can already try out video and + audio calls, compatible with other [matrix] clients.

+
+ Animated chick +

Stickers

+

Create your own sticker sets and share them with your friends. You + can even use them as inline emojis.

+
+
+ Animated whoa emoji +

Compatible

+

FluffyChat is compatible with any other [matrix] client like Element, + Nheko, Cinny + or NeoChat. +

+
+
- + +
+
diff --git a/docs/info-logo.png b/docs/info-logo.png new file mode 100644 index 0000000000..ceb42f09b5 Binary files /dev/null and b/docs/info-logo.png differ diff --git a/docs/kofi_button_dark.png b/docs/kofi_button_dark.png new file mode 100644 index 0000000000..b005e7a392 Binary files /dev/null and b/docs/kofi_button_dark.png differ diff --git a/docs/mastodon.svg b/docs/mastodon.svg new file mode 100644 index 0000000000..0f8baebfc9 --- /dev/null +++ b/docs/mastodon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/qr-code-nightly.svg b/docs/qr-code-nightly.svg deleted file mode 100644 index d36a2844bd..0000000000 --- a/docs/qr-code-nightly.svg +++ /dev/null @@ -1,3431 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/qr-code.svg b/docs/qr-code.svg deleted file mode 100644 index b12c1e5871..0000000000 --- a/docs/qr-code.svg +++ /dev/null @@ -1,2831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/snap-store-badge.svg b/docs/snap-store-badge.svg new file mode 100644 index 0000000000..294d8737f1 --- /dev/null +++ b/docs/snap-store-badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/tailwind.css b/docs/tailwind.css deleted file mode 100644 index 4c689171bc..0000000000 --- a/docs/tailwind.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:initial;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:-moz-focusring{outline:auto}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.inset-auto{top:auto;right:auto;bottom:auto;left:auto}.inset-px{top:1px;right:1px;bottom:1px;left:1px}.inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.-inset-0{top:0;right:0;bottom:0;left:0}.-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.inset-full{top:100%;right:100%;bottom:100%;left:100%}.-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.inset-x-0{left:0;right:0}.inset-x-1{left:.25rem;right:.25rem}.inset-x-2{left:.5rem;right:.5rem}.inset-x-3{left:.75rem;right:.75rem}.inset-x-4{left:1rem;right:1rem}.inset-x-5{left:1.25rem;right:1.25rem}.inset-x-6{left:1.5rem;right:1.5rem}.inset-x-7{left:1.75rem;right:1.75rem}.inset-x-8{left:2rem;right:2rem}.inset-x-9{left:2.25rem;right:2.25rem}.inset-x-10{left:2.5rem;right:2.5rem}.inset-x-11{left:2.75rem;right:2.75rem}.inset-x-12{left:3rem;right:3rem}.inset-x-14{left:3.5rem;right:3.5rem}.inset-x-16{left:4rem;right:4rem}.inset-x-20{left:5rem;right:5rem}.inset-x-24{left:6rem;right:6rem}.inset-x-28{left:7rem;right:7rem}.inset-x-32{left:8rem;right:8rem}.inset-x-36{left:9rem;right:9rem}.inset-x-40{left:10rem;right:10rem}.inset-x-44{left:11rem;right:11rem}.inset-x-48{left:12rem;right:12rem}.inset-x-52{left:13rem;right:13rem}.inset-x-56{left:14rem;right:14rem}.inset-x-60{left:15rem;right:15rem}.inset-x-64{left:16rem;right:16rem}.inset-x-72{left:18rem;right:18rem}.inset-x-80{left:20rem;right:20rem}.inset-x-96{left:24rem;right:24rem}.inset-x-auto{left:auto;right:auto}.inset-x-px{left:1px;right:1px}.inset-x-0\.5{left:.125rem;right:.125rem}.inset-x-1\.5{left:.375rem;right:.375rem}.inset-x-2\.5{left:.625rem;right:.625rem}.inset-x-3\.5{left:.875rem;right:.875rem}.-inset-x-0{left:0;right:0}.-inset-x-1{left:-.25rem;right:-.25rem}.-inset-x-2{left:-.5rem;right:-.5rem}.-inset-x-3{left:-.75rem;right:-.75rem}.-inset-x-4{left:-1rem;right:-1rem}.-inset-x-5{left:-1.25rem;right:-1.25rem}.-inset-x-6{left:-1.5rem;right:-1.5rem}.-inset-x-7{left:-1.75rem;right:-1.75rem}.-inset-x-8{left:-2rem;right:-2rem}.-inset-x-9{left:-2.25rem;right:-2.25rem}.-inset-x-10{left:-2.5rem;right:-2.5rem}.-inset-x-11{left:-2.75rem;right:-2.75rem}.-inset-x-12{left:-3rem;right:-3rem}.-inset-x-14{left:-3.5rem;right:-3.5rem}.-inset-x-16{left:-4rem;right:-4rem}.-inset-x-20{left:-5rem;right:-5rem}.-inset-x-24{left:-6rem;right:-6rem}.-inset-x-28{left:-7rem;right:-7rem}.-inset-x-32{left:-8rem;right:-8rem}.-inset-x-36{left:-9rem;right:-9rem}.-inset-x-40{left:-10rem;right:-10rem}.-inset-x-44{left:-11rem;right:-11rem}.-inset-x-48{left:-12rem;right:-12rem}.-inset-x-52{left:-13rem;right:-13rem}.-inset-x-56{left:-14rem;right:-14rem}.-inset-x-60{left:-15rem;right:-15rem}.-inset-x-64{left:-16rem;right:-16rem}.-inset-x-72{left:-18rem;right:-18rem}.-inset-x-80{left:-20rem;right:-20rem}.-inset-x-96{left:-24rem;right:-24rem}.-inset-x-px{left:-1px;right:-1px}.-inset-x-0\.5{left:-.125rem;right:-.125rem}.-inset-x-1\.5{left:-.375rem;right:-.375rem}.-inset-x-2\.5{left:-.625rem;right:-.625rem}.-inset-x-3\.5{left:-.875rem;right:-.875rem}.inset-x-1\/2{left:50%;right:50%}.inset-x-1\/3{left:33.333333%;right:33.333333%}.inset-x-2\/3{left:66.666667%;right:66.666667%}.inset-x-1\/4{left:25%;right:25%}.inset-x-2\/4{left:50%;right:50%}.inset-x-3\/4{left:75%;right:75%}.inset-x-full{left:100%;right:100%}.-inset-x-1\/2{left:-50%;right:-50%}.-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.-inset-x-1\/4{left:-25%;right:-25%}.-inset-x-2\/4{left:-50%;right:-50%}.-inset-x-3\/4{left:-75%;right:-75%}.-inset-x-full{left:-100%;right:-100%}.inset-y-0{top:0;bottom:0}.inset-y-1{top:.25rem;bottom:.25rem}.inset-y-2{top:.5rem;bottom:.5rem}.inset-y-3{top:.75rem;bottom:.75rem}.inset-y-4{top:1rem;bottom:1rem}.inset-y-5{top:1.25rem;bottom:1.25rem}.inset-y-6{top:1.5rem;bottom:1.5rem}.inset-y-7{top:1.75rem;bottom:1.75rem}.inset-y-8{top:2rem;bottom:2rem}.inset-y-9{top:2.25rem;bottom:2.25rem}.inset-y-10{top:2.5rem;bottom:2.5rem}.inset-y-11{top:2.75rem;bottom:2.75rem}.inset-y-12{top:3rem;bottom:3rem}.inset-y-14{top:3.5rem;bottom:3.5rem}.inset-y-16{top:4rem;bottom:4rem}.inset-y-20{top:5rem;bottom:5rem}.inset-y-24{top:6rem;bottom:6rem}.inset-y-28{top:7rem;bottom:7rem}.inset-y-32{top:8rem;bottom:8rem}.inset-y-36{top:9rem;bottom:9rem}.inset-y-40{top:10rem;bottom:10rem}.inset-y-44{top:11rem;bottom:11rem}.inset-y-48{top:12rem;bottom:12rem}.inset-y-52{top:13rem;bottom:13rem}.inset-y-56{top:14rem;bottom:14rem}.inset-y-60{top:15rem;bottom:15rem}.inset-y-64{top:16rem;bottom:16rem}.inset-y-72{top:18rem;bottom:18rem}.inset-y-80{top:20rem;bottom:20rem}.inset-y-96{top:24rem;bottom:24rem}.inset-y-auto{top:auto;bottom:auto}.inset-y-px{top:1px;bottom:1px}.inset-y-0\.5{top:.125rem;bottom:.125rem}.inset-y-1\.5{top:.375rem;bottom:.375rem}.inset-y-2\.5{top:.625rem;bottom:.625rem}.inset-y-3\.5{top:.875rem;bottom:.875rem}.-inset-y-0{top:0;bottom:0}.-inset-y-1{top:-.25rem;bottom:-.25rem}.-inset-y-2{top:-.5rem;bottom:-.5rem}.-inset-y-3{top:-.75rem;bottom:-.75rem}.-inset-y-4{top:-1rem;bottom:-1rem}.-inset-y-5{top:-1.25rem;bottom:-1.25rem}.-inset-y-6{top:-1.5rem;bottom:-1.5rem}.-inset-y-7{top:-1.75rem;bottom:-1.75rem}.-inset-y-8{top:-2rem;bottom:-2rem}.-inset-y-9{top:-2.25rem;bottom:-2.25rem}.-inset-y-10{top:-2.5rem;bottom:-2.5rem}.-inset-y-11{top:-2.75rem;bottom:-2.75rem}.-inset-y-12{top:-3rem;bottom:-3rem}.-inset-y-14{top:-3.5rem;bottom:-3.5rem}.-inset-y-16{top:-4rem;bottom:-4rem}.-inset-y-20{top:-5rem;bottom:-5rem}.-inset-y-24{top:-6rem;bottom:-6rem}.-inset-y-28{top:-7rem;bottom:-7rem}.-inset-y-32{top:-8rem;bottom:-8rem}.-inset-y-36{top:-9rem;bottom:-9rem}.-inset-y-40{top:-10rem;bottom:-10rem}.-inset-y-44{top:-11rem;bottom:-11rem}.-inset-y-48{top:-12rem;bottom:-12rem}.-inset-y-52{top:-13rem;bottom:-13rem}.-inset-y-56{top:-14rem;bottom:-14rem}.-inset-y-60{top:-15rem;bottom:-15rem}.-inset-y-64{top:-16rem;bottom:-16rem}.-inset-y-72{top:-18rem;bottom:-18rem}.-inset-y-80{top:-20rem;bottom:-20rem}.-inset-y-96{top:-24rem;bottom:-24rem}.-inset-y-px{top:-1px;bottom:-1px}.-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.inset-y-1\/2{top:50%;bottom:50%}.inset-y-1\/3{top:33.333333%;bottom:33.333333%}.inset-y-2\/3{top:66.666667%;bottom:66.666667%}.inset-y-1\/4{top:25%;bottom:25%}.inset-y-2\/4{top:50%;bottom:50%}.inset-y-3\/4{top:75%;bottom:75%}.inset-y-full{top:100%;bottom:100%}.-inset-y-1\/2{top:-50%;bottom:-50%}.-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.-inset-y-1\/4{top:-25%;bottom:-25%}.-inset-y-2\/4{top:-50%;bottom:-50%}.-inset-y-3\/4{top:-75%;bottom:-75%}.-inset-y-full{top:-100%;bottom:-100%}.top-0{top:0}.top-1{top:.25rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-6{top:1.5rem}.top-7{top:1.75rem}.top-8{top:2rem}.top-9{top:2.25rem}.top-10{top:2.5rem}.top-11{top:2.75rem}.top-12{top:3rem}.top-14{top:3.5rem}.top-16{top:4rem}.top-20{top:5rem}.top-24{top:6rem}.top-28{top:7rem}.top-32{top:8rem}.top-36{top:9rem}.top-40{top:10rem}.top-44{top:11rem}.top-48{top:12rem}.top-52{top:13rem}.top-56{top:14rem}.top-60{top:15rem}.top-64{top:16rem}.top-72{top:18rem}.top-80{top:20rem}.top-96{top:24rem}.top-auto{top:auto}.top-px{top:1px}.top-0\.5{top:.125rem}.top-1\.5{top:.375rem}.top-2\.5{top:.625rem}.top-3\.5{top:.875rem}.-top-0{top:0}.-top-1{top:-.25rem}.-top-2{top:-.5rem}.-top-3{top:-.75rem}.-top-4{top:-1rem}.-top-5{top:-1.25rem}.-top-6{top:-1.5rem}.-top-7{top:-1.75rem}.-top-8{top:-2rem}.-top-9{top:-2.25rem}.-top-10{top:-2.5rem}.-top-11{top:-2.75rem}.-top-12{top:-3rem}.-top-14{top:-3.5rem}.-top-16{top:-4rem}.-top-20{top:-5rem}.-top-24{top:-6rem}.-top-28{top:-7rem}.-top-32{top:-8rem}.-top-36{top:-9rem}.-top-40{top:-10rem}.-top-44{top:-11rem}.-top-48{top:-12rem}.-top-52{top:-13rem}.-top-56{top:-14rem}.-top-60{top:-15rem}.-top-64{top:-16rem}.-top-72{top:-18rem}.-top-80{top:-20rem}.-top-96{top:-24rem}.-top-px{top:-1px}.-top-0\.5{top:-.125rem}.-top-1\.5{top:-.375rem}.-top-2\.5{top:-.625rem}.-top-3\.5{top:-.875rem}.top-1\/2{top:50%}.top-1\/3{top:33.333333%}.top-2\/3{top:66.666667%}.top-1\/4{top:25%}.top-2\/4{top:50%}.top-3\/4{top:75%}.top-full{top:100%}.-top-1\/2{top:-50%}.-top-1\/3{top:-33.333333%}.-top-2\/3{top:-66.666667%}.-top-1\/4{top:-25%}.-top-2\/4{top:-50%}.-top-3\/4{top:-75%}.-top-full{top:-100%}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.right-7{right:1.75rem}.right-8{right:2rem}.right-9{right:2.25rem}.right-10{right:2.5rem}.right-11{right:2.75rem}.right-12{right:3rem}.right-14{right:3.5rem}.right-16{right:4rem}.right-20{right:5rem}.right-24{right:6rem}.right-28{right:7rem}.right-32{right:8rem}.right-36{right:9rem}.right-40{right:10rem}.right-44{right:11rem}.right-48{right:12rem}.right-52{right:13rem}.right-56{right:14rem}.right-60{right:15rem}.right-64{right:16rem}.right-72{right:18rem}.right-80{right:20rem}.right-96{right:24rem}.right-auto{right:auto}.right-px{right:1px}.right-0\.5{right:.125rem}.right-1\.5{right:.375rem}.right-2\.5{right:.625rem}.right-3\.5{right:.875rem}.-right-0{right:0}.-right-1{right:-.25rem}.-right-2{right:-.5rem}.-right-3{right:-.75rem}.-right-4{right:-1rem}.-right-5{right:-1.25rem}.-right-6{right:-1.5rem}.-right-7{right:-1.75rem}.-right-8{right:-2rem}.-right-9{right:-2.25rem}.-right-10{right:-2.5rem}.-right-11{right:-2.75rem}.-right-12{right:-3rem}.-right-14{right:-3.5rem}.-right-16{right:-4rem}.-right-20{right:-5rem}.-right-24{right:-6rem}.-right-28{right:-7rem}.-right-32{right:-8rem}.-right-36{right:-9rem}.-right-40{right:-10rem}.-right-44{right:-11rem}.-right-48{right:-12rem}.-right-52{right:-13rem}.-right-56{right:-14rem}.-right-60{right:-15rem}.-right-64{right:-16rem}.-right-72{right:-18rem}.-right-80{right:-20rem}.-right-96{right:-24rem}.-right-px{right:-1px}.-right-0\.5{right:-.125rem}.-right-1\.5{right:-.375rem}.-right-2\.5{right:-.625rem}.-right-3\.5{right:-.875rem}.right-1\/2{right:50%}.right-1\/3{right:33.333333%}.right-2\/3{right:66.666667%}.right-1\/4{right:25%}.right-2\/4{right:50%}.right-3\/4{right:75%}.right-full{right:100%}.-right-1\/2{right:-50%}.-right-1\/3{right:-33.333333%}.-right-2\/3{right:-66.666667%}.-right-1\/4{right:-25%}.-right-2\/4{right:-50%}.-right-3\/4{right:-75%}.-right-full{right:-100%}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-6{bottom:1.5rem}.bottom-7{bottom:1.75rem}.bottom-8{bottom:2rem}.bottom-9{bottom:2.25rem}.bottom-10{bottom:2.5rem}.bottom-11{bottom:2.75rem}.bottom-12{bottom:3rem}.bottom-14{bottom:3.5rem}.bottom-16{bottom:4rem}.bottom-20{bottom:5rem}.bottom-24{bottom:6rem}.bottom-28{bottom:7rem}.bottom-32{bottom:8rem}.bottom-36{bottom:9rem}.bottom-40{bottom:10rem}.bottom-44{bottom:11rem}.bottom-48{bottom:12rem}.bottom-52{bottom:13rem}.bottom-56{bottom:14rem}.bottom-60{bottom:15rem}.bottom-64{bottom:16rem}.bottom-72{bottom:18rem}.bottom-80{bottom:20rem}.bottom-96{bottom:24rem}.bottom-auto{bottom:auto}.bottom-px{bottom:1px}.bottom-0\.5{bottom:.125rem}.bottom-1\.5{bottom:.375rem}.bottom-2\.5{bottom:.625rem}.bottom-3\.5{bottom:.875rem}.-bottom-0{bottom:0}.-bottom-1{bottom:-.25rem}.-bottom-2{bottom:-.5rem}.-bottom-3{bottom:-.75rem}.-bottom-4{bottom:-1rem}.-bottom-5{bottom:-1.25rem}.-bottom-6{bottom:-1.5rem}.-bottom-7{bottom:-1.75rem}.-bottom-8{bottom:-2rem}.-bottom-9{bottom:-2.25rem}.-bottom-10{bottom:-2.5rem}.-bottom-11{bottom:-2.75rem}.-bottom-12{bottom:-3rem}.-bottom-14{bottom:-3.5rem}.-bottom-16{bottom:-4rem}.-bottom-20{bottom:-5rem}.-bottom-24{bottom:-6rem}.-bottom-28{bottom:-7rem}.-bottom-32{bottom:-8rem}.-bottom-36{bottom:-9rem}.-bottom-40{bottom:-10rem}.-bottom-44{bottom:-11rem}.-bottom-48{bottom:-12rem}.-bottom-52{bottom:-13rem}.-bottom-56{bottom:-14rem}.-bottom-60{bottom:-15rem}.-bottom-64{bottom:-16rem}.-bottom-72{bottom:-18rem}.-bottom-80{bottom:-20rem}.-bottom-96{bottom:-24rem}.-bottom-px{bottom:-1px}.-bottom-0\.5{bottom:-.125rem}.-bottom-1\.5{bottom:-.375rem}.-bottom-2\.5{bottom:-.625rem}.-bottom-3\.5{bottom:-.875rem}.bottom-1\/2{bottom:50%}.bottom-1\/3{bottom:33.333333%}.bottom-2\/3{bottom:66.666667%}.bottom-1\/4{bottom:25%}.bottom-2\/4{bottom:50%}.bottom-3\/4{bottom:75%}.bottom-full{bottom:100%}.-bottom-1\/2{bottom:-50%}.-bottom-1\/3{bottom:-33.333333%}.-bottom-2\/3{bottom:-66.666667%}.-bottom-1\/4{bottom:-25%}.-bottom-2\/4{bottom:-50%}.-bottom-3\/4{bottom:-75%}.-bottom-full{bottom:-100%}.left-0{left:0}.left-1{left:.25rem}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.left-5{left:1.25rem}.left-6{left:1.5rem}.left-7{left:1.75rem}.left-8{left:2rem}.left-9{left:2.25rem}.left-10{left:2.5rem}.left-11{left:2.75rem}.left-12{left:3rem}.left-14{left:3.5rem}.left-16{left:4rem}.left-20{left:5rem}.left-24{left:6rem}.left-28{left:7rem}.left-32{left:8rem}.left-36{left:9rem}.left-40{left:10rem}.left-44{left:11rem}.left-48{left:12rem}.left-52{left:13rem}.left-56{left:14rem}.left-60{left:15rem}.left-64{left:16rem}.left-72{left:18rem}.left-80{left:20rem}.left-96{left:24rem}.left-auto{left:auto}.left-px{left:1px}.left-0\.5{left:.125rem}.left-1\.5{left:.375rem}.left-2\.5{left:.625rem}.left-3\.5{left:.875rem}.-left-0{left:0}.-left-1{left:-.25rem}.-left-2{left:-.5rem}.-left-3{left:-.75rem}.-left-4{left:-1rem}.-left-5{left:-1.25rem}.-left-6{left:-1.5rem}.-left-7{left:-1.75rem}.-left-8{left:-2rem}.-left-9{left:-2.25rem}.-left-10{left:-2.5rem}.-left-11{left:-2.75rem}.-left-12{left:-3rem}.-left-14{left:-3.5rem}.-left-16{left:-4rem}.-left-20{left:-5rem}.-left-24{left:-6rem}.-left-28{left:-7rem}.-left-32{left:-8rem}.-left-36{left:-9rem}.-left-40{left:-10rem}.-left-44{left:-11rem}.-left-48{left:-12rem}.-left-52{left:-13rem}.-left-56{left:-14rem}.-left-60{left:-15rem}.-left-64{left:-16rem}.-left-72{left:-18rem}.-left-80{left:-20rem}.-left-96{left:-24rem}.-left-px{left:-1px}.-left-0\.5{left:-.125rem}.-left-1\.5{left:-.375rem}.-left-2\.5{left:-.625rem}.-left-3\.5{left:-.875rem}.left-1\/2{left:50%}.left-1\/3{left:33.333333%}.left-2\/3{left:66.666667%}.left-1\/4{left:25%}.left-2\/4{left:50%}.left-3\/4{left:75%}.left-full{left:100%}.-left-1\/2{left:-50%}.-left-1\/3{left:-33.333333%}.-left-2\/3{left:-66.666667%}.-left-1\/4{left:-25%}.-left-2\/4{left:-50%}.-left-3\/4{left:-75%}.-left-full{left:-100%}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.focus-within\:z-0:focus-within{z-index:0}.focus-within\:z-10:focus-within{z-index:10}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:z-30:focus-within{z-index:30}.focus-within\:z-40:focus-within{z-index:40}.focus-within\:z-50:focus-within{z-index:50}.focus-within\:z-auto:focus-within{z-index:auto}.focus\:z-0:focus{z-index:0}.focus\:z-10:focus{z-index:10}.focus\:z-20:focus{z-index:20}.focus\:z-30:focus{z-index:30}.focus\:z-40:focus{z-index:40}.focus\:z-50:focus{z-index:50}.focus\:z-auto:focus{z-index:auto}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.col-start-5{grid-column-start:5}.col-start-6{grid-column-start:6}.col-start-7{grid-column-start:7}.col-start-8{grid-column-start:8}.col-start-9{grid-column-start:9}.col-start-10{grid-column-start:10}.col-start-11{grid-column-start:11}.col-start-12{grid-column-start:12}.col-start-13{grid-column-start:13}.col-start-auto{grid-column-start:auto}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.col-end-3{grid-column-end:3}.col-end-4{grid-column-end:4}.col-end-5{grid-column-end:5}.col-end-6{grid-column-end:6}.col-end-7{grid-column-end:7}.col-end-8{grid-column-end:8}.col-end-9{grid-column-end:9}.col-end-10{grid-column-end:10}.col-end-11{grid-column-end:11}.col-end-12{grid-column-end:12}.col-end-13{grid-column-end:13}.col-end-auto{grid-column-end:auto}.row-auto{grid-row:auto}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.row-start-4{grid-row-start:4}.row-start-5{grid-row-start:5}.row-start-6{grid-row-start:6}.row-start-7{grid-row-start:7}.row-start-auto{grid-row-start:auto}.row-end-1{grid-row-end:1}.row-end-2{grid-row-end:2}.row-end-3{grid-row-end:3}.row-end-4{grid-row-end:4}.row-end-5{grid-row-end:5}.row-end-6{grid-row-end:6}.row-end-7{grid-row-end:7}.row-end-auto{grid-row-end:auto}.float-right{float:right}.float-left{float:left}.float-none{float:none}.clear-left{clear:left}.clear-right{clear:right}.clear-both{clear:both}.clear-none{clear:none}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-7{margin:1.75rem}.m-8{margin:2rem}.m-9{margin:2.25rem}.m-10{margin:2.5rem}.m-11{margin:2.75rem}.m-12{margin:3rem}.m-14{margin:3.5rem}.m-16{margin:4rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-28{margin:7rem}.m-32{margin:8rem}.m-36{margin:9rem}.m-40{margin:10rem}.m-44{margin:11rem}.m-48{margin:12rem}.m-52{margin:13rem}.m-56{margin:14rem}.m-60{margin:15rem}.m-64{margin:16rem}.m-72{margin:18rem}.m-80{margin:20rem}.m-96{margin:24rem}.m-auto{margin:auto}.m-px{margin:1px}.m-0\.5{margin:.125rem}.m-1\.5{margin:.375rem}.m-2\.5{margin:.625rem}.m-3\.5{margin:.875rem}.-m-0{margin:0}.-m-1{margin:-.25rem}.-m-2{margin:-.5rem}.-m-3{margin:-.75rem}.-m-4{margin:-1rem}.-m-5{margin:-1.25rem}.-m-6{margin:-1.5rem}.-m-7{margin:-1.75rem}.-m-8{margin:-2rem}.-m-9{margin:-2.25rem}.-m-10{margin:-2.5rem}.-m-11{margin:-2.75rem}.-m-12{margin:-3rem}.-m-14{margin:-3.5rem}.-m-16{margin:-4rem}.-m-20{margin:-5rem}.-m-24{margin:-6rem}.-m-28{margin:-7rem}.-m-32{margin:-8rem}.-m-36{margin:-9rem}.-m-40{margin:-10rem}.-m-44{margin:-11rem}.-m-48{margin:-12rem}.-m-52{margin:-13rem}.-m-56{margin:-14rem}.-m-60{margin:-15rem}.-m-64{margin:-16rem}.-m-72{margin:-18rem}.-m-80{margin:-20rem}.-m-96{margin:-24rem}.-m-px{margin:-1px}.-m-0\.5{margin:-.125rem}.-m-1\.5{margin:-.375rem}.-m-2\.5{margin:-.625rem}.-m-3\.5{margin:-.875rem}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-11{margin-left:2.75rem;margin-right:2.75rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-14{margin-left:3.5rem;margin-right:3.5rem}.mx-16{margin-left:4rem;margin-right:4rem}.mx-20{margin-left:5rem;margin-right:5rem}.mx-24{margin-left:6rem;margin-right:6rem}.mx-28{margin-left:7rem;margin-right:7rem}.mx-32{margin-left:8rem;margin-right:8rem}.mx-36{margin-left:9rem;margin-right:9rem}.mx-40{margin-left:10rem;margin-right:10rem}.mx-44{margin-left:11rem;margin-right:11rem}.mx-48{margin-left:12rem;margin-right:12rem}.mx-52{margin-left:13rem;margin-right:13rem}.mx-56{margin-left:14rem;margin-right:14rem}.mx-60{margin-left:15rem;margin-right:15rem}.mx-64{margin-left:16rem;margin-right:16rem}.mx-72{margin-left:18rem;margin-right:18rem}.mx-80{margin-left:20rem;margin-right:20rem}.mx-96{margin-left:24rem;margin-right:24rem}.mx-auto{margin-left:auto;margin-right:auto}.mx-px{margin-left:1px;margin-right:1px}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.-mx-0{margin-left:0;margin-right:0}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.-mx-12{margin-left:-3rem;margin-right:-3rem}.-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.-mx-16{margin-left:-4rem;margin-right:-4rem}.-mx-20{margin-left:-5rem;margin-right:-5rem}.-mx-24{margin-left:-6rem;margin-right:-6rem}.-mx-28{margin-left:-7rem;margin-right:-7rem}.-mx-32{margin-left:-8rem;margin-right:-8rem}.-mx-36{margin-left:-9rem;margin-right:-9rem}.-mx-40{margin-left:-10rem;margin-right:-10rem}.-mx-44{margin-left:-11rem;margin-right:-11rem}.-mx-48{margin-left:-12rem;margin-right:-12rem}.-mx-52{margin-left:-13rem;margin-right:-13rem}.-mx-56{margin-left:-14rem;margin-right:-14rem}.-mx-60{margin-left:-15rem;margin-right:-15rem}.-mx-64{margin-left:-16rem;margin-right:-16rem}.-mx-72{margin-left:-18rem;margin-right:-18rem}.-mx-80{margin-left:-20rem;margin-right:-20rem}.-mx-96{margin-left:-24rem;margin-right:-24rem}.-mx-px{margin-left:-1px;margin-right:-1px}.-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-7{margin-top:1.75rem;margin-bottom:1.75rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-9{margin-top:2.25rem;margin-bottom:2.25rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-11{margin-top:2.75rem;margin-bottom:2.75rem}.my-12{margin-top:3rem;margin-bottom:3rem}.my-14{margin-top:3.5rem;margin-bottom:3.5rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-20{margin-top:5rem;margin-bottom:5rem}.my-24{margin-top:6rem;margin-bottom:6rem}.my-28{margin-top:7rem;margin-bottom:7rem}.my-32{margin-top:8rem;margin-bottom:8rem}.my-36{margin-top:9rem;margin-bottom:9rem}.my-40{margin-top:10rem;margin-bottom:10rem}.my-44{margin-top:11rem;margin-bottom:11rem}.my-48{margin-top:12rem;margin-bottom:12rem}.my-52{margin-top:13rem;margin-bottom:13rem}.my-56{margin-top:14rem;margin-bottom:14rem}.my-60{margin-top:15rem;margin-bottom:15rem}.my-64{margin-top:16rem;margin-bottom:16rem}.my-72{margin-top:18rem;margin-bottom:18rem}.my-80{margin-top:20rem;margin-bottom:20rem}.my-96{margin-top:24rem;margin-bottom:24rem}.my-auto{margin-top:auto;margin-bottom:auto}.my-px{margin-top:1px;margin-bottom:1px}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.-my-0{margin-top:0;margin-bottom:0}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.-my-8{margin-top:-2rem;margin-bottom:-2rem}.-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.-my-12{margin-top:-3rem;margin-bottom:-3rem}.-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.-my-16{margin-top:-4rem;margin-bottom:-4rem}.-my-20{margin-top:-5rem;margin-bottom:-5rem}.-my-24{margin-top:-6rem;margin-bottom:-6rem}.-my-28{margin-top:-7rem;margin-bottom:-7rem}.-my-32{margin-top:-8rem;margin-bottom:-8rem}.-my-36{margin-top:-9rem;margin-bottom:-9rem}.-my-40{margin-top:-10rem;margin-bottom:-10rem}.-my-44{margin-top:-11rem;margin-bottom:-11rem}.-my-48{margin-top:-12rem;margin-bottom:-12rem}.-my-52{margin-top:-13rem;margin-bottom:-13rem}.-my-56{margin-top:-14rem;margin-bottom:-14rem}.-my-60{margin-top:-15rem;margin-bottom:-15rem}.-my-64{margin-top:-16rem;margin-bottom:-16rem}.-my-72{margin-top:-18rem;margin-bottom:-18rem}.-my-80{margin-top:-20rem;margin-bottom:-20rem}.-my-96{margin-top:-24rem;margin-bottom:-24rem}.-my-px{margin-top:-1px;margin-bottom:-1px}.-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.mt-9{margin-top:2.25rem}.mt-10{margin-top:2.5rem}.mt-11{margin-top:2.75rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mt-24{margin-top:6rem}.mt-28{margin-top:7rem}.mt-32{margin-top:8rem}.mt-36{margin-top:9rem}.mt-40{margin-top:10rem}.mt-44{margin-top:11rem}.mt-48{margin-top:12rem}.mt-52{margin-top:13rem}.mt-56{margin-top:14rem}.mt-60{margin-top:15rem}.mt-64{margin-top:16rem}.mt-72{margin-top:18rem}.mt-80{margin-top:20rem}.mt-96{margin-top:24rem}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mt-2\.5{margin-top:.625rem}.mt-3\.5{margin-top:.875rem}.-mt-0{margin-top:0}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-4{margin-top:-1rem}.-mt-5{margin-top:-1.25rem}.-mt-6{margin-top:-1.5rem}.-mt-7{margin-top:-1.75rem}.-mt-8{margin-top:-2rem}.-mt-9{margin-top:-2.25rem}.-mt-10{margin-top:-2.5rem}.-mt-11{margin-top:-2.75rem}.-mt-12{margin-top:-3rem}.-mt-14{margin-top:-3.5rem}.-mt-16{margin-top:-4rem}.-mt-20{margin-top:-5rem}.-mt-24{margin-top:-6rem}.-mt-28{margin-top:-7rem}.-mt-32{margin-top:-8rem}.-mt-36{margin-top:-9rem}.-mt-40{margin-top:-10rem}.-mt-44{margin-top:-11rem}.-mt-48{margin-top:-12rem}.-mt-52{margin-top:-13rem}.-mt-56{margin-top:-14rem}.-mt-60{margin-top:-15rem}.-mt-64{margin-top:-16rem}.-mt-72{margin-top:-18rem}.-mt-80{margin-top:-20rem}.-mt-96{margin-top:-24rem}.-mt-px{margin-top:-1px}.-mt-0\.5{margin-top:-.125rem}.-mt-1\.5{margin-top:-.375rem}.-mt-2\.5{margin-top:-.625rem}.-mt-3\.5{margin-top:-.875rem}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-6{margin-right:1.5rem}.mr-7{margin-right:1.75rem}.mr-8{margin-right:2rem}.mr-9{margin-right:2.25rem}.mr-10{margin-right:2.5rem}.mr-11{margin-right:2.75rem}.mr-12{margin-right:3rem}.mr-14{margin-right:3.5rem}.mr-16{margin-right:4rem}.mr-20{margin-right:5rem}.mr-24{margin-right:6rem}.mr-28{margin-right:7rem}.mr-32{margin-right:8rem}.mr-36{margin-right:9rem}.mr-40{margin-right:10rem}.mr-44{margin-right:11rem}.mr-48{margin-right:12rem}.mr-52{margin-right:13rem}.mr-56{margin-right:14rem}.mr-60{margin-right:15rem}.mr-64{margin-right:16rem}.mr-72{margin-right:18rem}.mr-80{margin-right:20rem}.mr-96{margin-right:24rem}.mr-auto{margin-right:auto}.mr-px{margin-right:1px}.mr-0\.5{margin-right:.125rem}.mr-1\.5{margin-right:.375rem}.mr-2\.5{margin-right:.625rem}.mr-3\.5{margin-right:.875rem}.-mr-0{margin-right:0}.-mr-1{margin-right:-.25rem}.-mr-2{margin-right:-.5rem}.-mr-3{margin-right:-.75rem}.-mr-4{margin-right:-1rem}.-mr-5{margin-right:-1.25rem}.-mr-6{margin-right:-1.5rem}.-mr-7{margin-right:-1.75rem}.-mr-8{margin-right:-2rem}.-mr-9{margin-right:-2.25rem}.-mr-10{margin-right:-2.5rem}.-mr-11{margin-right:-2.75rem}.-mr-12{margin-right:-3rem}.-mr-14{margin-right:-3.5rem}.-mr-16{margin-right:-4rem}.-mr-20{margin-right:-5rem}.-mr-24{margin-right:-6rem}.-mr-28{margin-right:-7rem}.-mr-32{margin-right:-8rem}.-mr-36{margin-right:-9rem}.-mr-40{margin-right:-10rem}.-mr-44{margin-right:-11rem}.-mr-48{margin-right:-12rem}.-mr-52{margin-right:-13rem}.-mr-56{margin-right:-14rem}.-mr-60{margin-right:-15rem}.-mr-64{margin-right:-16rem}.-mr-72{margin-right:-18rem}.-mr-80{margin-right:-20rem}.-mr-96{margin-right:-24rem}.-mr-px{margin-right:-1px}.-mr-0\.5{margin-right:-.125rem}.-mr-1\.5{margin-right:-.375rem}.-mr-2\.5{margin-right:-.625rem}.-mr-3\.5{margin-right:-.875rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.mb-8{margin-bottom:2rem}.mb-9{margin-bottom:2.25rem}.mb-10{margin-bottom:2.5rem}.mb-11{margin-bottom:2.75rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-16{margin-bottom:4rem}.mb-20{margin-bottom:5rem}.mb-24{margin-bottom:6rem}.mb-28{margin-bottom:7rem}.mb-32{margin-bottom:8rem}.mb-36{margin-bottom:9rem}.mb-40{margin-bottom:10rem}.mb-44{margin-bottom:11rem}.mb-48{margin-bottom:12rem}.mb-52{margin-bottom:13rem}.mb-56{margin-bottom:14rem}.mb-60{margin-bottom:15rem}.mb-64{margin-bottom:16rem}.mb-72{margin-bottom:18rem}.mb-80{margin-bottom:20rem}.mb-96{margin-bottom:24rem}.mb-auto{margin-bottom:auto}.mb-px{margin-bottom:1px}.mb-0\.5{margin-bottom:.125rem}.mb-1\.5{margin-bottom:.375rem}.mb-2\.5{margin-bottom:.625rem}.mb-3\.5{margin-bottom:.875rem}.-mb-0{margin-bottom:0}.-mb-1{margin-bottom:-.25rem}.-mb-2{margin-bottom:-.5rem}.-mb-3{margin-bottom:-.75rem}.-mb-4{margin-bottom:-1rem}.-mb-5{margin-bottom:-1.25rem}.-mb-6{margin-bottom:-1.5rem}.-mb-7{margin-bottom:-1.75rem}.-mb-8{margin-bottom:-2rem}.-mb-9{margin-bottom:-2.25rem}.-mb-10{margin-bottom:-2.5rem}.-mb-11{margin-bottom:-2.75rem}.-mb-12{margin-bottom:-3rem}.-mb-14{margin-bottom:-3.5rem}.-mb-16{margin-bottom:-4rem}.-mb-20{margin-bottom:-5rem}.-mb-24{margin-bottom:-6rem}.-mb-28{margin-bottom:-7rem}.-mb-32{margin-bottom:-8rem}.-mb-36{margin-bottom:-9rem}.-mb-40{margin-bottom:-10rem}.-mb-44{margin-bottom:-11rem}.-mb-48{margin-bottom:-12rem}.-mb-52{margin-bottom:-13rem}.-mb-56{margin-bottom:-14rem}.-mb-60{margin-bottom:-15rem}.-mb-64{margin-bottom:-16rem}.-mb-72{margin-bottom:-18rem}.-mb-80{margin-bottom:-20rem}.-mb-96{margin-bottom:-24rem}.-mb-px{margin-bottom:-1px}.-mb-0\.5{margin-bottom:-.125rem}.-mb-1\.5{margin-bottom:-.375rem}.-mb-2\.5{margin-bottom:-.625rem}.-mb-3\.5{margin-bottom:-.875rem}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-10{margin-left:2.5rem}.ml-11{margin-left:2.75rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.ml-16{margin-left:4rem}.ml-20{margin-left:5rem}.ml-24{margin-left:6rem}.ml-28{margin-left:7rem}.ml-32{margin-left:8rem}.ml-36{margin-left:9rem}.ml-40{margin-left:10rem}.ml-44{margin-left:11rem}.ml-48{margin-left:12rem}.ml-52{margin-left:13rem}.ml-56{margin-left:14rem}.ml-60{margin-left:15rem}.ml-64{margin-left:16rem}.ml-72{margin-left:18rem}.ml-80{margin-left:20rem}.ml-96{margin-left:24rem}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.ml-0\.5{margin-left:.125rem}.ml-1\.5{margin-left:.375rem}.ml-2\.5{margin-left:.625rem}.ml-3\.5{margin-left:.875rem}.-ml-0{margin-left:0}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.-ml-3{margin-left:-.75rem}.-ml-4{margin-left:-1rem}.-ml-5{margin-left:-1.25rem}.-ml-6{margin-left:-1.5rem}.-ml-7{margin-left:-1.75rem}.-ml-8{margin-left:-2rem}.-ml-9{margin-left:-2.25rem}.-ml-10{margin-left:-2.5rem}.-ml-11{margin-left:-2.75rem}.-ml-12{margin-left:-3rem}.-ml-14{margin-left:-3.5rem}.-ml-16{margin-left:-4rem}.-ml-20{margin-left:-5rem}.-ml-24{margin-left:-6rem}.-ml-28{margin-left:-7rem}.-ml-32{margin-left:-8rem}.-ml-36{margin-left:-9rem}.-ml-40{margin-left:-10rem}.-ml-44{margin-left:-11rem}.-ml-48{margin-left:-12rem}.-ml-52{margin-left:-13rem}.-ml-56{margin-left:-14rem}.-ml-60{margin-left:-15rem}.-ml-64{margin-left:-16rem}.-ml-72{margin-left:-18rem}.-ml-80{margin-left:-20rem}.-ml-96{margin-left:-24rem}.-ml-px{margin-left:-1px}.-ml-0\.5{margin-left:-.125rem}.-ml-1\.5{margin-left:-.375rem}.-ml-2\.5{margin-left:-.625rem}.-ml-3\.5{margin-left:-.875rem}.box-border{box-sizing:border-box}.box-content{box-sizing:initial}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.inline-table{display:inline-table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row-group{display:table-row-group}.table-row{display:table-row}.flow-root{display:flow-root}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.h-0{height:0}.h-1{height:.25rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-32{height:8rem}.h-36{height:9rem}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-52{height:13rem}.h-56{height:14rem}.h-60{height:15rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-96{height:24rem}.h-auto{height:auto}.h-px{height:1px}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-2\/3{height:66.666667%}.h-1\/4{height:25%}.h-2\/4{height:50%}.h-3\/4{height:75%}.h-1\/5{height:20%}.h-2\/5{height:40%}.h-3\/5{height:60%}.h-4\/5{height:80%}.h-1\/6{height:16.666667%}.h-2\/6{height:33.333333%}.h-3\/6{height:50%}.h-4\/6{height:66.666667%}.h-5\/6{height:83.333333%}.h-full{height:100%}.h-screen{height:100vh}.max-h-0{max-height:0}.max-h-1{max-height:.25rem}.max-h-2{max-height:.5rem}.max-h-3{max-height:.75rem}.max-h-4{max-height:1rem}.max-h-5{max-height:1.25rem}.max-h-6{max-height:1.5rem}.max-h-7{max-height:1.75rem}.max-h-8{max-height:2rem}.max-h-9{max-height:2.25rem}.max-h-10{max-height:2.5rem}.max-h-11{max-height:2.75rem}.max-h-12{max-height:3rem}.max-h-14{max-height:3.5rem}.max-h-16{max-height:4rem}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-28{max-height:7rem}.max-h-32{max-height:8rem}.max-h-36{max-height:9rem}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-px{max-height:1px}.max-h-0\.5{max-height:.125rem}.max-h-1\.5{max-height:.375rem}.max-h-2\.5{max-height:.625rem}.max-h-3\.5{max-height:.875rem}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-36{width:9rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-52{width:13rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-72{width:18rem}.w-80{width:20rem}.w-96{width:24rem}.w-auto{width:auto}.w-px{width:1px}.w-0\.5{width:.125rem}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-3\.5{width:.875rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-6\/12{width:50%}.w-7\/12{width:58.333333%}.w-8\/12{width:66.666667%}.w-9\/12{width:75%}.w-10\/12{width:83.333333%}.w-11\/12{width:91.666667%}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.max-w-0{max-width:0}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.max-w-prose{max-width:65ch}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.max-w-screen-2xl{max-width:1536px}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.flex-grow-0{flex-grow:0}.flex-grow{flex-grow:1}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:initial}.origin-center{transform-origin:center}.origin-top{transform-origin:top}.origin-top-right{transform-origin:top right}.origin-right{transform-origin:right}.origin-bottom-right{transform-origin:bottom right}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:bottom left}.origin-left{transform-origin:left}.origin-top-left{transform-origin:top left}.transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform,.transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-none{transform:none}.translate-x-0{--tw-translate-x:0px}.translate-x-1{--tw-translate-x:0.25rem}.translate-x-2{--tw-translate-x:0.5rem}.translate-x-3{--tw-translate-x:0.75rem}.translate-x-4{--tw-translate-x:1rem}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-6{--tw-translate-x:1.5rem}.translate-x-7{--tw-translate-x:1.75rem}.translate-x-8{--tw-translate-x:2rem}.translate-x-9{--tw-translate-x:2.25rem}.translate-x-10{--tw-translate-x:2.5rem}.translate-x-11{--tw-translate-x:2.75rem}.translate-x-12{--tw-translate-x:3rem}.translate-x-14{--tw-translate-x:3.5rem}.translate-x-16{--tw-translate-x:4rem}.translate-x-20{--tw-translate-x:5rem}.translate-x-24{--tw-translate-x:6rem}.translate-x-28{--tw-translate-x:7rem}.translate-x-32{--tw-translate-x:8rem}.translate-x-36{--tw-translate-x:9rem}.translate-x-40{--tw-translate-x:10rem}.translate-x-44{--tw-translate-x:11rem}.translate-x-48{--tw-translate-x:12rem}.translate-x-52{--tw-translate-x:13rem}.translate-x-56{--tw-translate-x:14rem}.translate-x-60{--tw-translate-x:15rem}.translate-x-64{--tw-translate-x:16rem}.translate-x-72{--tw-translate-x:18rem}.translate-x-80{--tw-translate-x:20rem}.translate-x-96{--tw-translate-x:24rem}.translate-x-px{--tw-translate-x:1px}.translate-x-0\.5{--tw-translate-x:0.125rem}.translate-x-1\.5{--tw-translate-x:0.375rem}.translate-x-2\.5{--tw-translate-x:0.625rem}.translate-x-3\.5{--tw-translate-x:0.875rem}.-translate-x-0{--tw-translate-x:0px}.-translate-x-1{--tw-translate-x:-0.25rem}.-translate-x-2{--tw-translate-x:-0.5rem}.-translate-x-3{--tw-translate-x:-0.75rem}.-translate-x-4{--tw-translate-x:-1rem}.-translate-x-5{--tw-translate-x:-1.25rem}.-translate-x-6{--tw-translate-x:-1.5rem}.-translate-x-7{--tw-translate-x:-1.75rem}.-translate-x-8{--tw-translate-x:-2rem}.-translate-x-9{--tw-translate-x:-2.25rem}.-translate-x-10{--tw-translate-x:-2.5rem}.-translate-x-11{--tw-translate-x:-2.75rem}.-translate-x-12{--tw-translate-x:-3rem}.-translate-x-14{--tw-translate-x:-3.5rem}.-translate-x-16{--tw-translate-x:-4rem}.-translate-x-20{--tw-translate-x:-5rem}.-translate-x-24{--tw-translate-x:-6rem}.-translate-x-28{--tw-translate-x:-7rem}.-translate-x-32{--tw-translate-x:-8rem}.-translate-x-36{--tw-translate-x:-9rem}.-translate-x-40{--tw-translate-x:-10rem}.-translate-x-44{--tw-translate-x:-11rem}.-translate-x-48{--tw-translate-x:-12rem}.-translate-x-52{--tw-translate-x:-13rem}.-translate-x-56{--tw-translate-x:-14rem}.-translate-x-60{--tw-translate-x:-15rem}.-translate-x-64{--tw-translate-x:-16rem}.-translate-x-72{--tw-translate-x:-18rem}.-translate-x-80{--tw-translate-x:-20rem}.-translate-x-96{--tw-translate-x:-24rem}.-translate-x-px{--tw-translate-x:-1px}.-translate-x-0\.5{--tw-translate-x:-0.125rem}.-translate-x-1\.5{--tw-translate-x:-0.375rem}.-translate-x-2\.5{--tw-translate-x:-0.625rem}.-translate-x-3\.5{--tw-translate-x:-0.875rem}.translate-x-1\/2{--tw-translate-x:50%}.translate-x-1\/3{--tw-translate-x:33.333333%}.translate-x-2\/3{--tw-translate-x:66.666667%}.translate-x-1\/4{--tw-translate-x:25%}.translate-x-2\/4{--tw-translate-x:50%}.translate-x-3\/4{--tw-translate-x:75%}.translate-x-full{--tw-translate-x:100%}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/3{--tw-translate-x:-33.333333%}.-translate-x-2\/3{--tw-translate-x:-66.666667%}.-translate-x-1\/4{--tw-translate-x:-25%}.-translate-x-2\/4{--tw-translate-x:-50%}.-translate-x-3\/4{--tw-translate-x:-75%}.-translate-x-full{--tw-translate-x:-100%}.translate-y-0{--tw-translate-y:0px}.translate-y-1{--tw-translate-y:0.25rem}.translate-y-2{--tw-translate-y:0.5rem}.translate-y-3{--tw-translate-y:0.75rem}.translate-y-4{--tw-translate-y:1rem}.translate-y-5{--tw-translate-y:1.25rem}.translate-y-6{--tw-translate-y:1.5rem}.translate-y-7{--tw-translate-y:1.75rem}.translate-y-8{--tw-translate-y:2rem}.translate-y-9{--tw-translate-y:2.25rem}.translate-y-10{--tw-translate-y:2.5rem}.translate-y-11{--tw-translate-y:2.75rem}.translate-y-12{--tw-translate-y:3rem}.translate-y-14{--tw-translate-y:3.5rem}.translate-y-16{--tw-translate-y:4rem}.translate-y-20{--tw-translate-y:5rem}.translate-y-24{--tw-translate-y:6rem}.translate-y-28{--tw-translate-y:7rem}.translate-y-32{--tw-translate-y:8rem}.translate-y-36{--tw-translate-y:9rem}.translate-y-40{--tw-translate-y:10rem}.translate-y-44{--tw-translate-y:11rem}.translate-y-48{--tw-translate-y:12rem}.translate-y-52{--tw-translate-y:13rem}.translate-y-56{--tw-translate-y:14rem}.translate-y-60{--tw-translate-y:15rem}.translate-y-64{--tw-translate-y:16rem}.translate-y-72{--tw-translate-y:18rem}.translate-y-80{--tw-translate-y:20rem}.translate-y-96{--tw-translate-y:24rem}.translate-y-px{--tw-translate-y:1px}.translate-y-0\.5{--tw-translate-y:0.125rem}.translate-y-1\.5{--tw-translate-y:0.375rem}.translate-y-2\.5{--tw-translate-y:0.625rem}.translate-y-3\.5{--tw-translate-y:0.875rem}.-translate-y-0{--tw-translate-y:0px}.-translate-y-1{--tw-translate-y:-0.25rem}.-translate-y-2{--tw-translate-y:-0.5rem}.-translate-y-3{--tw-translate-y:-0.75rem}.-translate-y-4{--tw-translate-y:-1rem}.-translate-y-5{--tw-translate-y:-1.25rem}.-translate-y-6{--tw-translate-y:-1.5rem}.-translate-y-7{--tw-translate-y:-1.75rem}.-translate-y-8{--tw-translate-y:-2rem}.-translate-y-9{--tw-translate-y:-2.25rem}.-translate-y-10{--tw-translate-y:-2.5rem}.-translate-y-11{--tw-translate-y:-2.75rem}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-14{--tw-translate-y:-3.5rem}.-translate-y-16{--tw-translate-y:-4rem}.-translate-y-20{--tw-translate-y:-5rem}.-translate-y-24{--tw-translate-y:-6rem}.-translate-y-28{--tw-translate-y:-7rem}.-translate-y-32{--tw-translate-y:-8rem}.-translate-y-36{--tw-translate-y:-9rem}.-translate-y-40{--tw-translate-y:-10rem}.-translate-y-44{--tw-translate-y:-11rem}.-translate-y-48{--tw-translate-y:-12rem}.-translate-y-52{--tw-translate-y:-13rem}.-translate-y-56{--tw-translate-y:-14rem}.-translate-y-60{--tw-translate-y:-15rem}.-translate-y-64{--tw-translate-y:-16rem}.-translate-y-72{--tw-translate-y:-18rem}.-translate-y-80{--tw-translate-y:-20rem}.-translate-y-96{--tw-translate-y:-24rem}.-translate-y-px{--tw-translate-y:-1px}.-translate-y-0\.5{--tw-translate-y:-0.125rem}.-translate-y-1\.5{--tw-translate-y:-0.375rem}.-translate-y-2\.5{--tw-translate-y:-0.625rem}.-translate-y-3\.5{--tw-translate-y:-0.875rem}.translate-y-1\/2{--tw-translate-y:50%}.translate-y-1\/3{--tw-translate-y:33.333333%}.translate-y-2\/3{--tw-translate-y:66.666667%}.translate-y-1\/4{--tw-translate-y:25%}.translate-y-2\/4{--tw-translate-y:50%}.translate-y-3\/4{--tw-translate-y:75%}.translate-y-full{--tw-translate-y:100%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/3{--tw-translate-y:-33.333333%}.-translate-y-2\/3{--tw-translate-y:-66.666667%}.-translate-y-1\/4{--tw-translate-y:-25%}.-translate-y-2\/4{--tw-translate-y:-50%}.-translate-y-3\/4{--tw-translate-y:-75%}.-translate-y-full{--tw-translate-y:-100%}.hover\:translate-x-0:hover{--tw-translate-x:0px}.hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.hover\:translate-x-4:hover{--tw-translate-x:1rem}.hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.hover\:translate-x-8:hover{--tw-translate-x:2rem}.hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.hover\:translate-x-12:hover{--tw-translate-x:3rem}.hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.hover\:translate-x-16:hover{--tw-translate-x:4rem}.hover\:translate-x-20:hover{--tw-translate-x:5rem}.hover\:translate-x-24:hover{--tw-translate-x:6rem}.hover\:translate-x-28:hover{--tw-translate-x:7rem}.hover\:translate-x-32:hover{--tw-translate-x:8rem}.hover\:translate-x-36:hover{--tw-translate-x:9rem}.hover\:translate-x-40:hover{--tw-translate-x:10rem}.hover\:translate-x-44:hover{--tw-translate-x:11rem}.hover\:translate-x-48:hover{--tw-translate-x:12rem}.hover\:translate-x-52:hover{--tw-translate-x:13rem}.hover\:translate-x-56:hover{--tw-translate-x:14rem}.hover\:translate-x-60:hover{--tw-translate-x:15rem}.hover\:translate-x-64:hover{--tw-translate-x:16rem}.hover\:translate-x-72:hover{--tw-translate-x:18rem}.hover\:translate-x-80:hover{--tw-translate-x:20rem}.hover\:translate-x-96:hover{--tw-translate-x:24rem}.hover\:translate-x-px:hover{--tw-translate-x:1px}.hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.hover\:-translate-x-0:hover{--tw-translate-x:0px}.hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.hover\:-translate-x-px:hover{--tw-translate-x:-1px}.hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.hover\:translate-x-full:hover{--tw-translate-x:100%}.hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.hover\:-translate-x-full:hover{--tw-translate-x:-100%}.hover\:translate-y-0:hover{--tw-translate-y:0px}.hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.hover\:translate-y-4:hover{--tw-translate-y:1rem}.hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.hover\:translate-y-8:hover{--tw-translate-y:2rem}.hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.hover\:translate-y-12:hover{--tw-translate-y:3rem}.hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.hover\:translate-y-16:hover{--tw-translate-y:4rem}.hover\:translate-y-20:hover{--tw-translate-y:5rem}.hover\:translate-y-24:hover{--tw-translate-y:6rem}.hover\:translate-y-28:hover{--tw-translate-y:7rem}.hover\:translate-y-32:hover{--tw-translate-y:8rem}.hover\:translate-y-36:hover{--tw-translate-y:9rem}.hover\:translate-y-40:hover{--tw-translate-y:10rem}.hover\:translate-y-44:hover{--tw-translate-y:11rem}.hover\:translate-y-48:hover{--tw-translate-y:12rem}.hover\:translate-y-52:hover{--tw-translate-y:13rem}.hover\:translate-y-56:hover{--tw-translate-y:14rem}.hover\:translate-y-60:hover{--tw-translate-y:15rem}.hover\:translate-y-64:hover{--tw-translate-y:16rem}.hover\:translate-y-72:hover{--tw-translate-y:18rem}.hover\:translate-y-80:hover{--tw-translate-y:20rem}.hover\:translate-y-96:hover{--tw-translate-y:24rem}.hover\:translate-y-px:hover{--tw-translate-y:1px}.hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.hover\:-translate-y-0:hover{--tw-translate-y:0px}.hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.hover\:-translate-y-px:hover{--tw-translate-y:-1px}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.hover\:translate-y-full:hover{--tw-translate-y:100%}.hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.hover\:-translate-y-full:hover{--tw-translate-y:-100%}.focus\:translate-x-0:focus{--tw-translate-x:0px}.focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.focus\:translate-x-4:focus{--tw-translate-x:1rem}.focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.focus\:translate-x-8:focus{--tw-translate-x:2rem}.focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.focus\:translate-x-12:focus{--tw-translate-x:3rem}.focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.focus\:translate-x-16:focus{--tw-translate-x:4rem}.focus\:translate-x-20:focus{--tw-translate-x:5rem}.focus\:translate-x-24:focus{--tw-translate-x:6rem}.focus\:translate-x-28:focus{--tw-translate-x:7rem}.focus\:translate-x-32:focus{--tw-translate-x:8rem}.focus\:translate-x-36:focus{--tw-translate-x:9rem}.focus\:translate-x-40:focus{--tw-translate-x:10rem}.focus\:translate-x-44:focus{--tw-translate-x:11rem}.focus\:translate-x-48:focus{--tw-translate-x:12rem}.focus\:translate-x-52:focus{--tw-translate-x:13rem}.focus\:translate-x-56:focus{--tw-translate-x:14rem}.focus\:translate-x-60:focus{--tw-translate-x:15rem}.focus\:translate-x-64:focus{--tw-translate-x:16rem}.focus\:translate-x-72:focus{--tw-translate-x:18rem}.focus\:translate-x-80:focus{--tw-translate-x:20rem}.focus\:translate-x-96:focus{--tw-translate-x:24rem}.focus\:translate-x-px:focus{--tw-translate-x:1px}.focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.focus\:-translate-x-0:focus{--tw-translate-x:0px}.focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.focus\:-translate-x-px:focus{--tw-translate-x:-1px}.focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.focus\:translate-x-full:focus{--tw-translate-x:100%}.focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.focus\:-translate-x-full:focus{--tw-translate-x:-100%}.focus\:translate-y-0:focus{--tw-translate-y:0px}.focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.focus\:translate-y-4:focus{--tw-translate-y:1rem}.focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.focus\:translate-y-8:focus{--tw-translate-y:2rem}.focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.focus\:translate-y-12:focus{--tw-translate-y:3rem}.focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.focus\:translate-y-16:focus{--tw-translate-y:4rem}.focus\:translate-y-20:focus{--tw-translate-y:5rem}.focus\:translate-y-24:focus{--tw-translate-y:6rem}.focus\:translate-y-28:focus{--tw-translate-y:7rem}.focus\:translate-y-32:focus{--tw-translate-y:8rem}.focus\:translate-y-36:focus{--tw-translate-y:9rem}.focus\:translate-y-40:focus{--tw-translate-y:10rem}.focus\:translate-y-44:focus{--tw-translate-y:11rem}.focus\:translate-y-48:focus{--tw-translate-y:12rem}.focus\:translate-y-52:focus{--tw-translate-y:13rem}.focus\:translate-y-56:focus{--tw-translate-y:14rem}.focus\:translate-y-60:focus{--tw-translate-y:15rem}.focus\:translate-y-64:focus{--tw-translate-y:16rem}.focus\:translate-y-72:focus{--tw-translate-y:18rem}.focus\:translate-y-80:focus{--tw-translate-y:20rem}.focus\:translate-y-96:focus{--tw-translate-y:24rem}.focus\:translate-y-px:focus{--tw-translate-y:1px}.focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.focus\:-translate-y-0:focus{--tw-translate-y:0px}.focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.focus\:-translate-y-px:focus{--tw-translate-y:-1px}.focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.focus\:translate-y-full:focus{--tw-translate-y:100%}.focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.focus\:-translate-y-full:focus{--tw-translate-y:-100%}.rotate-0{--tw-rotate:0deg}.rotate-1{--tw-rotate:1deg}.rotate-2{--tw-rotate:2deg}.rotate-3{--tw-rotate:3deg}.rotate-6{--tw-rotate:6deg}.rotate-12{--tw-rotate:12deg}.rotate-45{--tw-rotate:45deg}.rotate-90{--tw-rotate:90deg}.rotate-180{--tw-rotate:180deg}.-rotate-180{--tw-rotate:-180deg}.-rotate-90{--tw-rotate:-90deg}.-rotate-45{--tw-rotate:-45deg}.-rotate-12{--tw-rotate:-12deg}.-rotate-6{--tw-rotate:-6deg}.-rotate-3{--tw-rotate:-3deg}.-rotate-2{--tw-rotate:-2deg}.-rotate-1{--tw-rotate:-1deg}.hover\:rotate-0:hover{--tw-rotate:0deg}.hover\:rotate-1:hover{--tw-rotate:1deg}.hover\:rotate-2:hover{--tw-rotate:2deg}.hover\:rotate-3:hover{--tw-rotate:3deg}.hover\:rotate-6:hover{--tw-rotate:6deg}.hover\:rotate-12:hover{--tw-rotate:12deg}.hover\:rotate-45:hover{--tw-rotate:45deg}.hover\:rotate-90:hover{--tw-rotate:90deg}.hover\:rotate-180:hover{--tw-rotate:180deg}.hover\:-rotate-180:hover{--tw-rotate:-180deg}.hover\:-rotate-90:hover{--tw-rotate:-90deg}.hover\:-rotate-45:hover{--tw-rotate:-45deg}.hover\:-rotate-12:hover{--tw-rotate:-12deg}.hover\:-rotate-6:hover{--tw-rotate:-6deg}.hover\:-rotate-3:hover{--tw-rotate:-3deg}.hover\:-rotate-2:hover{--tw-rotate:-2deg}.hover\:-rotate-1:hover{--tw-rotate:-1deg}.focus\:rotate-0:focus{--tw-rotate:0deg}.focus\:rotate-1:focus{--tw-rotate:1deg}.focus\:rotate-2:focus{--tw-rotate:2deg}.focus\:rotate-3:focus{--tw-rotate:3deg}.focus\:rotate-6:focus{--tw-rotate:6deg}.focus\:rotate-12:focus{--tw-rotate:12deg}.focus\:rotate-45:focus{--tw-rotate:45deg}.focus\:rotate-90:focus{--tw-rotate:90deg}.focus\:rotate-180:focus{--tw-rotate:180deg}.focus\:-rotate-180:focus{--tw-rotate:-180deg}.focus\:-rotate-90:focus{--tw-rotate:-90deg}.focus\:-rotate-45:focus{--tw-rotate:-45deg}.focus\:-rotate-12:focus{--tw-rotate:-12deg}.focus\:-rotate-6:focus{--tw-rotate:-6deg}.focus\:-rotate-3:focus{--tw-rotate:-3deg}.focus\:-rotate-2:focus{--tw-rotate:-2deg}.focus\:-rotate-1:focus{--tw-rotate:-1deg}.skew-x-0{--tw-skew-x:0deg}.skew-x-1{--tw-skew-x:1deg}.skew-x-2{--tw-skew-x:2deg}.skew-x-3{--tw-skew-x:3deg}.skew-x-6{--tw-skew-x:6deg}.skew-x-12{--tw-skew-x:12deg}.-skew-x-12{--tw-skew-x:-12deg}.-skew-x-6{--tw-skew-x:-6deg}.-skew-x-3{--tw-skew-x:-3deg}.-skew-x-2{--tw-skew-x:-2deg}.-skew-x-1{--tw-skew-x:-1deg}.skew-y-0{--tw-skew-y:0deg}.skew-y-1{--tw-skew-y:1deg}.skew-y-2{--tw-skew-y:2deg}.skew-y-3{--tw-skew-y:3deg}.skew-y-6{--tw-skew-y:6deg}.skew-y-12{--tw-skew-y:12deg}.-skew-y-12{--tw-skew-y:-12deg}.-skew-y-6{--tw-skew-y:-6deg}.-skew-y-3{--tw-skew-y:-3deg}.-skew-y-2{--tw-skew-y:-2deg}.-skew-y-1{--tw-skew-y:-1deg}.hover\:skew-x-0:hover{--tw-skew-x:0deg}.hover\:skew-x-1:hover{--tw-skew-x:1deg}.hover\:skew-x-2:hover{--tw-skew-x:2deg}.hover\:skew-x-3:hover{--tw-skew-x:3deg}.hover\:skew-x-6:hover{--tw-skew-x:6deg}.hover\:skew-x-12:hover{--tw-skew-x:12deg}.hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.hover\:skew-y-0:hover{--tw-skew-y:0deg}.hover\:skew-y-1:hover{--tw-skew-y:1deg}.hover\:skew-y-2:hover{--tw-skew-y:2deg}.hover\:skew-y-3:hover{--tw-skew-y:3deg}.hover\:skew-y-6:hover{--tw-skew-y:6deg}.hover\:skew-y-12:hover{--tw-skew-y:12deg}.hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.focus\:skew-x-0:focus{--tw-skew-x:0deg}.focus\:skew-x-1:focus{--tw-skew-x:1deg}.focus\:skew-x-2:focus{--tw-skew-x:2deg}.focus\:skew-x-3:focus{--tw-skew-x:3deg}.focus\:skew-x-6:focus{--tw-skew-x:6deg}.focus\:skew-x-12:focus{--tw-skew-x:12deg}.focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.focus\:skew-y-0:focus{--tw-skew-y:0deg}.focus\:skew-y-1:focus{--tw-skew-y:1deg}.focus\:skew-y-2:focus{--tw-skew-y:2deg}.focus\:skew-y-3:focus{--tw-skew-y:3deg}.focus\:skew-y-6:focus{--tw-skew-y:6deg}.focus\:skew-y-12:focus{--tw-skew-y:12deg}.focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.scale-x-0{--tw-scale-x:0}.scale-x-50{--tw-scale-x:.5}.scale-x-75{--tw-scale-x:.75}.scale-x-90{--tw-scale-x:.9}.scale-x-95{--tw-scale-x:.95}.scale-x-100{--tw-scale-x:1}.scale-x-105{--tw-scale-x:1.05}.scale-x-110{--tw-scale-x:1.1}.scale-x-125{--tw-scale-x:1.25}.scale-x-150{--tw-scale-x:1.5}.scale-y-0{--tw-scale-y:0}.scale-y-50{--tw-scale-y:.5}.scale-y-75{--tw-scale-y:.75}.scale-y-90{--tw-scale-y:.9}.scale-y-95{--tw-scale-y:.95}.scale-y-100{--tw-scale-y:1}.scale-y-105{--tw-scale-y:1.05}.scale-y-110{--tw-scale-y:1.1}.scale-y-125{--tw-scale-y:1.25}.scale-y-150{--tw-scale-y:1.5}.hover\:scale-x-0:hover{--tw-scale-x:0}.hover\:scale-x-50:hover{--tw-scale-x:.5}.hover\:scale-x-75:hover{--tw-scale-x:.75}.hover\:scale-x-90:hover{--tw-scale-x:.9}.hover\:scale-x-95:hover{--tw-scale-x:.95}.hover\:scale-x-100:hover{--tw-scale-x:1}.hover\:scale-x-105:hover{--tw-scale-x:1.05}.hover\:scale-x-110:hover{--tw-scale-x:1.1}.hover\:scale-x-125:hover{--tw-scale-x:1.25}.hover\:scale-x-150:hover{--tw-scale-x:1.5}.hover\:scale-y-0:hover{--tw-scale-y:0}.hover\:scale-y-50:hover{--tw-scale-y:.5}.hover\:scale-y-75:hover{--tw-scale-y:.75}.hover\:scale-y-90:hover{--tw-scale-y:.9}.hover\:scale-y-95:hover{--tw-scale-y:.95}.hover\:scale-y-100:hover{--tw-scale-y:1}.hover\:scale-y-105:hover{--tw-scale-y:1.05}.hover\:scale-y-110:hover{--tw-scale-y:1.1}.hover\:scale-y-125:hover{--tw-scale-y:1.25}.hover\:scale-y-150:hover{--tw-scale-y:1.5}.focus\:scale-x-0:focus{--tw-scale-x:0}.focus\:scale-x-50:focus{--tw-scale-x:.5}.focus\:scale-x-75:focus{--tw-scale-x:.75}.focus\:scale-x-90:focus{--tw-scale-x:.9}.focus\:scale-x-95:focus{--tw-scale-x:.95}.focus\:scale-x-100:focus{--tw-scale-x:1}.focus\:scale-x-105:focus{--tw-scale-x:1.05}.focus\:scale-x-110:focus{--tw-scale-x:1.1}.focus\:scale-x-125:focus{--tw-scale-x:1.25}.focus\:scale-x-150:focus{--tw-scale-x:1.5}.focus\:scale-y-0:focus{--tw-scale-y:0}.focus\:scale-y-50:focus{--tw-scale-y:.5}.focus\:scale-y-75:focus{--tw-scale-y:.75}.focus\:scale-y-90:focus{--tw-scale-y:.9}.focus\:scale-y-95:focus{--tw-scale-y:.95}.focus\:scale-y-100:focus{--tw-scale-y:1}.focus\:scale-y-105:focus{--tw-scale-y:1.05}.focus\:scale-y-110:focus{--tw-scale-y:1.1}.focus\:scale-y-125:focus{--tw-scale-y:1.25}.focus\:scale-y-150:focus{--tw-scale-y:1.5}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-none{-webkit-animation:none;animation:none}.animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.resize-none{resize:none}.resize-y{resize:vertical}.resize-x{resize:horizontal}.resize{resize:both}.list-inside{list-style-position:inside}.list-outside{list-style-position:outside}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.auto-cols-auto{grid-auto-columns:auto}.auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.grid-flow-row{grid-auto-flow:row}.grid-flow-col{grid-auto-flow:column}.grid-flow-row-dense{grid-auto-flow:row dense}.grid-flow-col-dense{grid-auto-flow:column dense}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid-rows-none{grid-template-rows:none}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-end{place-content:end}.place-content-between{place-content:space-between}.place-content-around{place-content:space-around}.place-content-evenly{place-content:space-evenly}.place-content-stretch{place-content:stretch}.place-items-start{place-items:start}.place-items-end{place-items:end}.place-items-center{place-items:center}.place-items-stretch{place-items:stretch}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-items-start{justify-items:start}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.justify-items-stretch{justify-items:stretch}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-7{gap:1.75rem}.gap-8{gap:2rem}.gap-9{gap:2.25rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-12{gap:3rem}.gap-14{gap:3.5rem}.gap-16{gap:4rem}.gap-20{gap:5rem}.gap-24{gap:6rem}.gap-28{gap:7rem}.gap-32{gap:8rem}.gap-36{gap:9rem}.gap-40{gap:10rem}.gap-44{gap:11rem}.gap-48{gap:12rem}.gap-52{gap:13rem}.gap-56{gap:14rem}.gap-60{gap:15rem}.gap-64{gap:16rem}.gap-72{gap:18rem}.gap-80{gap:20rem}.gap-96{gap:24rem}.gap-px{gap:1px}.gap-0\.5{gap:.125rem}.gap-1\.5{gap:.375rem}.gap-2\.5{gap:.625rem}.gap-3\.5{gap:.875rem}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.gap-x-px{-moz-column-gap:1px;column-gap:1px}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-y-0{row-gap:0}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-5{row-gap:1.25rem}.gap-y-6{row-gap:1.5rem}.gap-y-7{row-gap:1.75rem}.gap-y-8{row-gap:2rem}.gap-y-9{row-gap:2.25rem}.gap-y-10{row-gap:2.5rem}.gap-y-11{row-gap:2.75rem}.gap-y-12{row-gap:3rem}.gap-y-14{row-gap:3.5rem}.gap-y-16{row-gap:4rem}.gap-y-20{row-gap:5rem}.gap-y-24{row-gap:6rem}.gap-y-28{row-gap:7rem}.gap-y-32{row-gap:8rem}.gap-y-36{row-gap:9rem}.gap-y-40{row-gap:10rem}.gap-y-44{row-gap:11rem}.gap-y-48{row-gap:12rem}.gap-y-52{row-gap:13rem}.gap-y-56{row-gap:14rem}.gap-y-60{row-gap:15rem}.gap-y-64{row-gap:16rem}.gap-y-72{row-gap:18rem}.gap-y-80{row-gap:20rem}.gap-y-96{row-gap:24rem}.gap-y-px{row-gap:1px}.gap-y-0\.5{row-gap:.125rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-3\.5{row-gap:.875rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.divide-double>:not([hidden])~:not([hidden]){border-style:double}.divide-none>:not([hidden])~:not([hidden]){border-style:none}.divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.place-self-auto{place-self:auto}.place-self-start{place-self:start}.place-self-end{place-self:end}.place-self-center{place-self:center}.place-self-stretch{place-self:stretch}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.justify-self-auto{justify-self:auto}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.justify-self-stretch{justify-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.overscroll-y-auto{overscroll-behavior-y:auto}.overscroll-y-contain{overscroll-behavior-y:contain}.overscroll-y-none{overscroll-behavior-y:none}.overscroll-x-auto{overscroll-behavior-x:auto}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-x-none{overscroll-behavior-x:none}.truncate{overflow:hidden;white-space:nowrap}.overflow-ellipsis,.truncate{text-overflow:ellipsis}.overflow-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-tl-none{border-top-left-radius:0}.rounded-tl-sm{border-top-left-radius:.125rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-tl-md{border-top-left-radius:.375rem}.rounded-tl-lg{border-top-left-radius:.5rem}.rounded-tl-xl{border-top-left-radius:.75rem}.rounded-tl-2xl{border-top-left-radius:1rem}.rounded-tl-3xl{border-top-left-radius:1.5rem}.rounded-tl-full{border-top-left-radius:9999px}.rounded-tr-none{border-top-right-radius:0}.rounded-tr-sm{border-top-right-radius:.125rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-tr-md{border-top-right-radius:.375rem}.rounded-tr-lg{border-top-right-radius:.5rem}.rounded-tr-xl{border-top-right-radius:.75rem}.rounded-tr-2xl{border-top-right-radius:1rem}.rounded-tr-3xl{border-top-right-radius:1.5rem}.rounded-tr-full{border-top-right-radius:9999px}.rounded-br-none{border-bottom-right-radius:0}.rounded-br-sm{border-bottom-right-radius:.125rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-md{border-bottom-right-radius:.375rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-br-xl{border-bottom-right-radius:.75rem}.rounded-br-2xl{border-bottom-right-radius:1rem}.rounded-br-3xl{border-bottom-right-radius:1.5rem}.rounded-br-full{border-bottom-right-radius:9999px}.rounded-bl-none{border-bottom-left-radius:0}.rounded-bl-sm{border-bottom-left-radius:.125rem}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-md{border-bottom-left-radius:.375rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-bl-xl{border-bottom-left-radius:.75rem}.rounded-bl-2xl{border-bottom-left-radius:1rem}.rounded-bl-3xl{border-bottom-left-radius:1.5rem}.rounded-bl-full{border-bottom-left-radius:9999px}.border-0{border-width:0}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-t-0{border-top-width:0}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-t-8{border-top-width:8px}.border-t{border-top-width:1px}.border-r-0{border-right-width:0}.border-r-2{border-right-width:2px}.border-r-4{border-right-width:4px}.border-r-8{border-right-width:8px}.border-r{border-right-width:1px}.border-b-0{border-bottom-width:0}.border-b-2{border-bottom-width:2px}.border-b-4{border-bottom-width:4px}.border-b-8{border-bottom-width:8px}.border-b{border-bottom-width:1px}.border-l-0{border-left-width:0}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-l-8{border-left-width:8px}.border-l{border-left-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-none{border-style:none}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .group-hover\:border-transparent{border-color:transparent}.group:hover .group-hover\:border-current{border-color:currentColor}.group:hover .group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.focus-within\:border-transparent:focus-within{border-color:transparent}.focus-within\:border-current:focus-within{border-color:currentColor}.focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-current:hover{border-color:currentColor}.hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.focus\:border-transparent:focus{border-color:transparent}.focus\:border-current:focus{border-color:currentColor}.focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.border-opacity-0{--tw-border-opacity:0}.border-opacity-5{--tw-border-opacity:0.05}.border-opacity-10{--tw-border-opacity:0.1}.border-opacity-20{--tw-border-opacity:0.2}.border-opacity-25{--tw-border-opacity:0.25}.border-opacity-30{--tw-border-opacity:0.3}.border-opacity-40{--tw-border-opacity:0.4}.border-opacity-50{--tw-border-opacity:0.5}.border-opacity-60{--tw-border-opacity:0.6}.border-opacity-70{--tw-border-opacity:0.7}.border-opacity-75{--tw-border-opacity:0.75}.border-opacity-80{--tw-border-opacity:0.8}.border-opacity-90{--tw-border-opacity:0.9}.border-opacity-95{--tw-border-opacity:0.95}.border-opacity-100{--tw-border-opacity:1}.group:hover .group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .group-hover\:border-opacity-100{--tw-border-opacity:1}.focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.hover\:border-opacity-0:hover{--tw-border-opacity:0}.hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.hover\:border-opacity-100:hover{--tw-border-opacity:1}.focus\:border-opacity-0:focus{--tw-border-opacity:0}.focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.focus\:border-opacity-100:focus{--tw-border-opacity:1}.bg-transparent{background-color:initial}.bg-current{background-color:currentColor}.bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-transparent{background-color:initial}.group:hover .group-hover\:bg-current{background-color:currentColor}.group:hover .group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.focus-within\:bg-transparent:focus-within{background-color:initial}.focus-within\:bg-current:focus-within{background-color:currentColor}.focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.hover\:bg-transparent:hover{background-color:initial}.hover\:bg-current:hover{background-color:currentColor}.hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.focus\:bg-transparent:focus{background-color:initial}.focus\:bg-current:focus{background-color:currentColor}.focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.bg-opacity-0{--tw-bg-opacity:0}.bg-opacity-5{--tw-bg-opacity:0.05}.bg-opacity-10{--tw-bg-opacity:0.1}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-opacity-25{--tw-bg-opacity:0.25}.bg-opacity-30{--tw-bg-opacity:0.3}.bg-opacity-40{--tw-bg-opacity:0.4}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-opacity-60{--tw-bg-opacity:0.6}.bg-opacity-70{--tw-bg-opacity:0.7}.bg-opacity-75{--tw-bg-opacity:0.75}.bg-opacity-80{--tw-bg-opacity:0.8}.bg-opacity-90{--tw-bg-opacity:0.9}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-opacity-100{--tw-bg-opacity:1}.group:hover .group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .group-hover\:bg-opacity-100{--tw-bg-opacity:1}.focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.bg-none{background-image:none}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.to-transparent{--tw-gradient-to:transparent}.to-current{--tw-gradient-to:currentColor}.to-black{--tw-gradient-to:#000}.to-white{--tw-gradient-to:#fff}.to-gray-50{--tw-gradient-to:#f9fafb}.to-gray-100{--tw-gradient-to:#f3f4f6}.to-gray-200{--tw-gradient-to:#e5e7eb}.to-gray-300{--tw-gradient-to:#d1d5db}.to-gray-400{--tw-gradient-to:#9ca3af}.to-gray-500{--tw-gradient-to:#6b7280}.to-gray-600{--tw-gradient-to:#4b5563}.to-gray-700{--tw-gradient-to:#374151}.to-gray-800{--tw-gradient-to:#1f2937}.to-gray-900{--tw-gradient-to:#111827}.to-red-50{--tw-gradient-to:#fef2f2}.to-red-100{--tw-gradient-to:#fee2e2}.to-red-200{--tw-gradient-to:#fecaca}.to-red-300{--tw-gradient-to:#fca5a5}.to-red-400{--tw-gradient-to:#f87171}.to-red-500{--tw-gradient-to:#ef4444}.to-red-600{--tw-gradient-to:#dc2626}.to-red-700{--tw-gradient-to:#b91c1c}.to-red-800{--tw-gradient-to:#991b1b}.to-red-900{--tw-gradient-to:#7f1d1d}.to-yellow-50{--tw-gradient-to:#fffbeb}.to-yellow-100{--tw-gradient-to:#fef3c7}.to-yellow-200{--tw-gradient-to:#fde68a}.to-yellow-300{--tw-gradient-to:#fcd34d}.to-yellow-400{--tw-gradient-to:#fbbf24}.to-yellow-500{--tw-gradient-to:#f59e0b}.to-yellow-600{--tw-gradient-to:#d97706}.to-yellow-700{--tw-gradient-to:#b45309}.to-yellow-800{--tw-gradient-to:#92400e}.to-yellow-900{--tw-gradient-to:#78350f}.to-green-50{--tw-gradient-to:#ecfdf5}.to-green-100{--tw-gradient-to:#d1fae5}.to-green-200{--tw-gradient-to:#a7f3d0}.to-green-300{--tw-gradient-to:#6ee7b7}.to-green-400{--tw-gradient-to:#34d399}.to-green-500{--tw-gradient-to:#10b981}.to-green-600{--tw-gradient-to:#059669}.to-green-700{--tw-gradient-to:#047857}.to-green-800{--tw-gradient-to:#065f46}.to-green-900{--tw-gradient-to:#064e3b}.to-blue-50{--tw-gradient-to:#eff6ff}.to-blue-100{--tw-gradient-to:#dbeafe}.to-blue-200{--tw-gradient-to:#bfdbfe}.to-blue-300{--tw-gradient-to:#93c5fd}.to-blue-400{--tw-gradient-to:#60a5fa}.to-blue-500{--tw-gradient-to:#3b82f6}.to-blue-600{--tw-gradient-to:#2563eb}.to-blue-700{--tw-gradient-to:#1d4ed8}.to-blue-800{--tw-gradient-to:#1e40af}.to-blue-900{--tw-gradient-to:#1e3a8a}.to-indigo-50{--tw-gradient-to:#eef2ff}.to-indigo-100{--tw-gradient-to:#e0e7ff}.to-indigo-200{--tw-gradient-to:#c7d2fe}.to-indigo-300{--tw-gradient-to:#a5b4fc}.to-indigo-400{--tw-gradient-to:#818cf8}.to-indigo-500{--tw-gradient-to:#6366f1}.to-indigo-600{--tw-gradient-to:#4f46e5}.to-indigo-700{--tw-gradient-to:#4338ca}.to-indigo-800{--tw-gradient-to:#3730a3}.to-indigo-900{--tw-gradient-to:#312e81}.to-purple-50{--tw-gradient-to:#f5f3ff}.to-purple-100{--tw-gradient-to:#ede9fe}.to-purple-200{--tw-gradient-to:#ddd6fe}.to-purple-300{--tw-gradient-to:#c4b5fd}.to-purple-400{--tw-gradient-to:#a78bfa}.to-purple-500{--tw-gradient-to:#8b5cf6}.to-purple-600{--tw-gradient-to:#7c3aed}.to-purple-700{--tw-gradient-to:#6d28d9}.to-purple-800{--tw-gradient-to:#5b21b6}.to-purple-900{--tw-gradient-to:#4c1d95}.to-pink-50{--tw-gradient-to:#fdf2f8}.to-pink-100{--tw-gradient-to:#fce7f3}.to-pink-200{--tw-gradient-to:#fbcfe8}.to-pink-300{--tw-gradient-to:#f9a8d4}.to-pink-400{--tw-gradient-to:#f472b6}.to-pink-500{--tw-gradient-to:#ec4899}.to-pink-600{--tw-gradient-to:#db2777}.to-pink-700{--tw-gradient-to:#be185d}.to-pink-800{--tw-gradient-to:#9d174d}.to-pink-900{--tw-gradient-to:#831843}.hover\:to-transparent:hover{--tw-gradient-to:transparent}.hover\:to-current:hover{--tw-gradient-to:currentColor}.hover\:to-black:hover{--tw-gradient-to:#000}.hover\:to-white:hover{--tw-gradient-to:#fff}.hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.hover\:to-gray-700:hover{--tw-gradient-to:#374151}.hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.hover\:to-gray-900:hover{--tw-gradient-to:#111827}.hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.hover\:to-red-400:hover{--tw-gradient-to:#f87171}.hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.hover\:to-green-400:hover{--tw-gradient-to:#34d399}.hover\:to-green-500:hover{--tw-gradient-to:#10b981}.hover\:to-green-600:hover{--tw-gradient-to:#059669}.hover\:to-green-700:hover{--tw-gradient-to:#047857}.hover\:to-green-800:hover{--tw-gradient-to:#065f46}.hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.hover\:to-pink-900:hover{--tw-gradient-to:#831843}.focus\:to-transparent:focus{--tw-gradient-to:transparent}.focus\:to-current:focus{--tw-gradient-to:currentColor}.focus\:to-black:focus{--tw-gradient-to:#000}.focus\:to-white:focus{--tw-gradient-to:#fff}.focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.focus\:to-gray-700:focus{--tw-gradient-to:#374151}.focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.focus\:to-gray-900:focus{--tw-gradient-to:#111827}.focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.focus\:to-red-400:focus{--tw-gradient-to:#f87171}.focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.focus\:to-green-400:focus{--tw-gradient-to:#34d399}.focus\:to-green-500:focus{--tw-gradient-to:#10b981}.focus\:to-green-600:focus{--tw-gradient-to:#059669}.focus\:to-green-700:focus{--tw-gradient-to:#047857}.focus\:to-green-800:focus{--tw-gradient-to:#065f46}.focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.focus\:to-pink-900:focus{--tw-gradient-to:#831843}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.bg-clip-border{background-clip:initial}.bg-clip-padding{background-clip:padding-box}.bg-clip-content{background-clip:content-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-bottom{background-position:bottom}.bg-center{background-position:50%}.bg-left{background-position:0}.bg-left-bottom{background-position:0 100%}.bg-left-top{background-position:0 0}.bg-right{background-position:100%}.bg-right-bottom{background-position:100% 100%}.bg-right-top{background-position:100% 0}.bg-top{background-position:top}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-origin-border{background-origin:border-box}.bg-origin-padding{background-origin:initial}.bg-origin-content{background-origin:content-box}.fill-current{fill:currentColor}.stroke-current{stroke:currentColor}.stroke-0{stroke-width:0}.stroke-1{stroke-width:1}.stroke-2{stroke-width:2}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-bottom{-o-object-position:bottom;object-position:bottom}.object-center{-o-object-position:center;object-position:center}.object-left{-o-object-position:left;object-position:left}.object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.object-left-top{-o-object-position:left top;object-position:left top}.object-right{-o-object-position:right;object-position:right}.object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.object-right-top{-o-object-position:right top;object-position:right top}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-9{padding:2.25rem}.p-10{padding:2.5rem}.p-11{padding:2.75rem}.p-12{padding:3rem}.p-14{padding:3.5rem}.p-16{padding:4rem}.p-20{padding:5rem}.p-24{padding:6rem}.p-28{padding:7rem}.p-32{padding:8rem}.p-36{padding:9rem}.p-40{padding:10rem}.p-44{padding:11rem}.p-48{padding:12rem}.p-52{padding:13rem}.p-56{padding:14rem}.p-60{padding:15rem}.p-64{padding:16rem}.p-72{padding:18rem}.p-80{padding:20rem}.p-96{padding:24rem}.p-px{padding:1px}.p-0\.5{padding:.125rem}.p-1\.5{padding:.375rem}.p-2\.5{padding:.625rem}.p-3\.5{padding:.875rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-11{padding-left:2.75rem;padding-right:2.75rem}.px-12{padding-left:3rem;padding-right:3rem}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-16{padding-left:4rem;padding-right:4rem}.px-20{padding-left:5rem;padding-right:5rem}.px-24{padding-left:6rem;padding-right:6rem}.px-28{padding-left:7rem;padding-right:7rem}.px-32{padding-left:8rem;padding-right:8rem}.px-36{padding-left:9rem;padding-right:9rem}.px-40{padding-left:10rem;padding-right:10rem}.px-44{padding-left:11rem;padding-right:11rem}.px-48{padding-left:12rem;padding-right:12rem}.px-52{padding-left:13rem;padding-right:13rem}.px-56{padding-left:14rem;padding-right:14rem}.px-60{padding-left:15rem;padding-right:15rem}.px-64{padding-left:16rem;padding-right:16rem}.px-72{padding-left:18rem;padding-right:18rem}.px-80{padding-left:20rem;padding-right:20rem}.px-96{padding-left:24rem;padding-right:24rem}.px-px{padding-left:1px;padding-right:1px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-9{padding-top:2.25rem;padding-bottom:2.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-11{padding-top:2.75rem;padding-bottom:2.75rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-28{padding-top:7rem;padding-bottom:7rem}.py-32{padding-top:8rem;padding-bottom:8rem}.py-36{padding-top:9rem;padding-bottom:9rem}.py-40{padding-top:10rem;padding-bottom:10rem}.py-44{padding-top:11rem;padding-bottom:11rem}.py-48{padding-top:12rem;padding-bottom:12rem}.py-52{padding-top:13rem;padding-bottom:13rem}.py-56{padding-top:14rem;padding-bottom:14rem}.py-60{padding-top:15rem;padding-bottom:15rem}.py-64{padding-top:16rem;padding-bottom:16rem}.py-72{padding-top:18rem;padding-bottom:18rem}.py-80{padding-top:20rem;padding-bottom:20rem}.py-96{padding-top:24rem;padding-bottom:24rem}.py-px{padding-top:1px;padding-bottom:1px}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pt-9{padding-top:2.25rem}.pt-10{padding-top:2.5rem}.pt-11{padding-top:2.75rem}.pt-12{padding-top:3rem}.pt-14{padding-top:3.5rem}.pt-16{padding-top:4rem}.pt-20{padding-top:5rem}.pt-24{padding-top:6rem}.pt-28{padding-top:7rem}.pt-32{padding-top:8rem}.pt-36{padding-top:9rem}.pt-40{padding-top:10rem}.pt-44{padding-top:11rem}.pt-48{padding-top:12rem}.pt-52{padding-top:13rem}.pt-56{padding-top:14rem}.pt-60{padding-top:15rem}.pt-64{padding-top:16rem}.pt-72{padding-top:18rem}.pt-80{padding-top:20rem}.pt-96{padding-top:24rem}.pt-px{padding-top:1px}.pt-0\.5{padding-top:.125rem}.pt-1\.5{padding-top:.375rem}.pt-2\.5{padding-top:.625rem}.pt-3\.5{padding-top:.875rem}.pr-0{padding-right:0}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pr-10{padding-right:2.5rem}.pr-11{padding-right:2.75rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-16{padding-right:4rem}.pr-20{padding-right:5rem}.pr-24{padding-right:6rem}.pr-28{padding-right:7rem}.pr-32{padding-right:8rem}.pr-36{padding-right:9rem}.pr-40{padding-right:10rem}.pr-44{padding-right:11rem}.pr-48{padding-right:12rem}.pr-52{padding-right:13rem}.pr-56{padding-right:14rem}.pr-60{padding-right:15rem}.pr-64{padding-right:16rem}.pr-72{padding-right:18rem}.pr-80{padding-right:20rem}.pr-96{padding-right:24rem}.pr-px{padding-right:1px}.pr-0\.5{padding-right:.125rem}.pr-1\.5{padding-right:.375rem}.pr-2\.5{padding-right:.625rem}.pr-3\.5{padding-right:.875rem}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-7{padding-bottom:1.75rem}.pb-8{padding-bottom:2rem}.pb-9{padding-bottom:2.25rem}.pb-10{padding-bottom:2.5rem}.pb-11{padding-bottom:2.75rem}.pb-12{padding-bottom:3rem}.pb-14{padding-bottom:3.5rem}.pb-16{padding-bottom:4rem}.pb-20{padding-bottom:5rem}.pb-24{padding-bottom:6rem}.pb-28{padding-bottom:7rem}.pb-32{padding-bottom:8rem}.pb-36{padding-bottom:9rem}.pb-40{padding-bottom:10rem}.pb-44{padding-bottom:11rem}.pb-48{padding-bottom:12rem}.pb-52{padding-bottom:13rem}.pb-56{padding-bottom:14rem}.pb-60{padding-bottom:15rem}.pb-64{padding-bottom:16rem}.pb-72{padding-bottom:18rem}.pb-80{padding-bottom:20rem}.pb-96{padding-bottom:24rem}.pb-px{padding-bottom:1px}.pb-0\.5{padding-bottom:.125rem}.pb-1\.5{padding-bottom:.375rem}.pb-2\.5{padding-bottom:.625rem}.pb-3\.5{padding-bottom:.875rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-12{padding-left:3rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-20{padding-left:5rem}.pl-24{padding-left:6rem}.pl-28{padding-left:7rem}.pl-32{padding-left:8rem}.pl-36{padding-left:9rem}.pl-40{padding-left:10rem}.pl-44{padding-left:11rem}.pl-48{padding-left:12rem}.pl-52{padding-left:13rem}.pl-56{padding-left:14rem}.pl-60{padding-left:15rem}.pl-64{padding-left:16rem}.pl-72{padding-left:18rem}.pl-80{padding-left:20rem}.pl-96{padding-left:24rem}.pl-px{padding-left:1px}.pl-0\.5{padding-left:.125rem}.pl-1\.5{padding-left:.375rem}.pl-2\.5{padding-left:.625rem}.pl-3\.5{padding-left:.875rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-baseline{vertical-align:initial}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.align-text-top{vertical-align:text-top}.align-text-bottom{vertical-align:text-bottom}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-7xl{font-size:4.5rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.font-thin{font-weight:100}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions,.lining-nums,.oldstyle-nums,.ordinal,.proportional-nums,.slashed-zero,.stacked-fractions,.tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.normal-nums{font-variant-numeric:normal}.ordinal{--tw-ordinal:ordinal}.slashed-zero{--tw-slashed-zero:slashed-zero}.lining-nums{--tw-numeric-figure:lining-nums}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.proportional-nums{--tw-numeric-spacing:proportional-nums}.tabular-nums{--tw-numeric-spacing:tabular-nums}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.stacked-fractions{--tw-numeric-fraction:stacked-fractions}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.tracking-tighter{letter-spacing:-.05em}.tracking-tight{letter-spacing:-.025em}.tracking-normal{letter-spacing:0}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-transparent{color:transparent}.text-current{color:currentColor}.text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .group-hover\:text-transparent{color:transparent}.group:hover .group-hover\:text-current{color:currentColor}.group:hover .group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.focus-within\:text-transparent:focus-within{color:transparent}.focus-within\:text-current:focus-within{color:currentColor}.focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.hover\:text-transparent:hover{color:transparent}.hover\:text-current:hover{color:currentColor}.hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.focus\:text-transparent:focus{color:transparent}.focus\:text-current:focus{color:currentColor}.focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.text-opacity-0{--tw-text-opacity:0}.text-opacity-5{--tw-text-opacity:0.05}.text-opacity-10{--tw-text-opacity:0.1}.text-opacity-20{--tw-text-opacity:0.2}.text-opacity-25{--tw-text-opacity:0.25}.text-opacity-30{--tw-text-opacity:0.3}.text-opacity-40{--tw-text-opacity:0.4}.text-opacity-50{--tw-text-opacity:0.5}.text-opacity-60{--tw-text-opacity:0.6}.text-opacity-70{--tw-text-opacity:0.7}.text-opacity-75{--tw-text-opacity:0.75}.text-opacity-80{--tw-text-opacity:0.8}.text-opacity-90{--tw-text-opacity:0.9}.text-opacity-95{--tw-text-opacity:0.95}.text-opacity-100{--tw-text-opacity:1}.group:hover .group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .group-hover\:text-opacity-100{--tw-text-opacity:1}.focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.hover\:text-opacity-0:hover{--tw-text-opacity:0}.hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.hover\:text-opacity-100:hover{--tw-text-opacity:1}.focus\:text-opacity-0:focus{--tw-text-opacity:0}.focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.focus\:text-opacity-100:focus{--tw-text-opacity:1}.underline{text-decoration:underline}.line-through{text-decoration:line-through}.no-underline{text-decoration:none}.group:hover .group-hover\:underline{text-decoration:underline}.group:hover .group-hover\:line-through{text-decoration:line-through}.group:hover .group-hover\:no-underline{text-decoration:none}.focus-within\:underline:focus-within{text-decoration:underline}.focus-within\:line-through:focus-within{text-decoration:line-through}.focus-within\:no-underline:focus-within{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.hover\:line-through:hover{text-decoration:line-through}.hover\:no-underline:hover{text-decoration:none}.focus\:underline:focus{text-decoration:underline}.focus\:line-through:focus{text-decoration:line-through}.focus\:no-underline:focus{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.placeholder-transparent::-moz-placeholder{color:transparent}.placeholder-transparent:-ms-input-placeholder{color:transparent}.placeholder-transparent::placeholder{color:transparent}.placeholder-current::-moz-placeholder{color:currentColor}.placeholder-current:-ms-input-placeholder{color:currentColor}.placeholder-current::placeholder{color:currentColor}.placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.focus\:placeholder-transparent:focus::placeholder{color:transparent}.focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.focus\:placeholder-current:focus::placeholder{color:currentColor}.focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.caret-transparent{caret-color:transparent}.caret-current{caret-color:currentColor}.caret-black{caret-color:#000}.caret-white{caret-color:#fff}.caret-gray-50{caret-color:#f9fafb}.caret-gray-100{caret-color:#f3f4f6}.caret-gray-200{caret-color:#e5e7eb}.caret-gray-300{caret-color:#d1d5db}.caret-gray-400{caret-color:#9ca3af}.caret-gray-500{caret-color:#6b7280}.caret-gray-600{caret-color:#4b5563}.caret-gray-700{caret-color:#374151}.caret-gray-800{caret-color:#1f2937}.caret-gray-900{caret-color:#111827}.caret-red-50{caret-color:#fef2f2}.caret-red-100{caret-color:#fee2e2}.caret-red-200{caret-color:#fecaca}.caret-red-300{caret-color:#fca5a5}.caret-red-400{caret-color:#f87171}.caret-red-500{caret-color:#ef4444}.caret-red-600{caret-color:#dc2626}.caret-red-700{caret-color:#b91c1c}.caret-red-800{caret-color:#991b1b}.caret-red-900{caret-color:#7f1d1d}.caret-yellow-50{caret-color:#fffbeb}.caret-yellow-100{caret-color:#fef3c7}.caret-yellow-200{caret-color:#fde68a}.caret-yellow-300{caret-color:#fcd34d}.caret-yellow-400{caret-color:#fbbf24}.caret-yellow-500{caret-color:#f59e0b}.caret-yellow-600{caret-color:#d97706}.caret-yellow-700{caret-color:#b45309}.caret-yellow-800{caret-color:#92400e}.caret-yellow-900{caret-color:#78350f}.caret-green-50{caret-color:#ecfdf5}.caret-green-100{caret-color:#d1fae5}.caret-green-200{caret-color:#a7f3d0}.caret-green-300{caret-color:#6ee7b7}.caret-green-400{caret-color:#34d399}.caret-green-500{caret-color:#10b981}.caret-green-600{caret-color:#059669}.caret-green-700{caret-color:#047857}.caret-green-800{caret-color:#065f46}.caret-green-900{caret-color:#064e3b}.caret-blue-50{caret-color:#eff6ff}.caret-blue-100{caret-color:#dbeafe}.caret-blue-200{caret-color:#bfdbfe}.caret-blue-300{caret-color:#93c5fd}.caret-blue-400{caret-color:#60a5fa}.caret-blue-500{caret-color:#3b82f6}.caret-blue-600{caret-color:#2563eb}.caret-blue-700{caret-color:#1d4ed8}.caret-blue-800{caret-color:#1e40af}.caret-blue-900{caret-color:#1e3a8a}.caret-indigo-50{caret-color:#eef2ff}.caret-indigo-100{caret-color:#e0e7ff}.caret-indigo-200{caret-color:#c7d2fe}.caret-indigo-300{caret-color:#a5b4fc}.caret-indigo-400{caret-color:#818cf8}.caret-indigo-500{caret-color:#6366f1}.caret-indigo-600{caret-color:#4f46e5}.caret-indigo-700{caret-color:#4338ca}.caret-indigo-800{caret-color:#3730a3}.caret-indigo-900{caret-color:#312e81}.caret-purple-50{caret-color:#f5f3ff}.caret-purple-100{caret-color:#ede9fe}.caret-purple-200{caret-color:#ddd6fe}.caret-purple-300{caret-color:#c4b5fd}.caret-purple-400{caret-color:#a78bfa}.caret-purple-500{caret-color:#8b5cf6}.caret-purple-600{caret-color:#7c3aed}.caret-purple-700{caret-color:#6d28d9}.caret-purple-800{caret-color:#5b21b6}.caret-purple-900{caret-color:#4c1d95}.caret-pink-50{caret-color:#fdf2f8}.caret-pink-100{caret-color:#fce7f3}.caret-pink-200{caret-color:#fbcfe8}.caret-pink-300{caret-color:#f9a8d4}.caret-pink-400{caret-color:#f472b6}.caret-pink-500{caret-color:#ec4899}.caret-pink-600{caret-color:#db2777}.caret-pink-700{caret-color:#be185d}.caret-pink-800{caret-color:#9d174d}.caret-pink-900{caret-color:#831843}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.group:hover .group-hover\:opacity-0{opacity:0}.group:hover .group-hover\:opacity-5{opacity:.05}.group:hover .group-hover\:opacity-10{opacity:.1}.group:hover .group-hover\:opacity-20{opacity:.2}.group:hover .group-hover\:opacity-25{opacity:.25}.group:hover .group-hover\:opacity-30{opacity:.3}.group:hover .group-hover\:opacity-40{opacity:.4}.group:hover .group-hover\:opacity-50{opacity:.5}.group:hover .group-hover\:opacity-60{opacity:.6}.group:hover .group-hover\:opacity-70{opacity:.7}.group:hover .group-hover\:opacity-75{opacity:.75}.group:hover .group-hover\:opacity-80{opacity:.8}.group:hover .group-hover\:opacity-90{opacity:.9}.group:hover .group-hover\:opacity-95{opacity:.95}.group:hover .group-hover\:opacity-100{opacity:1}.focus-within\:opacity-0:focus-within{opacity:0}.focus-within\:opacity-5:focus-within{opacity:.05}.focus-within\:opacity-10:focus-within{opacity:.1}.focus-within\:opacity-20:focus-within{opacity:.2}.focus-within\:opacity-25:focus-within{opacity:.25}.focus-within\:opacity-30:focus-within{opacity:.3}.focus-within\:opacity-40:focus-within{opacity:.4}.focus-within\:opacity-50:focus-within{opacity:.5}.focus-within\:opacity-60:focus-within{opacity:.6}.focus-within\:opacity-70:focus-within{opacity:.7}.focus-within\:opacity-75:focus-within{opacity:.75}.focus-within\:opacity-80:focus-within{opacity:.8}.focus-within\:opacity-90:focus-within{opacity:.9}.focus-within\:opacity-95:focus-within{opacity:.95}.focus-within\:opacity-100:focus-within{opacity:1}.hover\:opacity-0:hover{opacity:0}.hover\:opacity-5:hover{opacity:.05}.hover\:opacity-10:hover{opacity:.1}.hover\:opacity-20:hover{opacity:.2}.hover\:opacity-25:hover{opacity:.25}.hover\:opacity-30:hover{opacity:.3}.hover\:opacity-40:hover{opacity:.4}.hover\:opacity-50:hover{opacity:.5}.hover\:opacity-60:hover{opacity:.6}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-95:hover{opacity:.95}.hover\:opacity-100:hover{opacity:1}.focus\:opacity-0:focus{opacity:0}.focus\:opacity-5:focus{opacity:.05}.focus\:opacity-10:focus{opacity:.1}.focus\:opacity-20:focus{opacity:.2}.focus\:opacity-25:focus{opacity:.25}.focus\:opacity-30:focus{opacity:.3}.focus\:opacity-40:focus{opacity:.4}.focus\:opacity-50:focus{opacity:.5}.focus\:opacity-60:focus{opacity:.6}.focus\:opacity-70:focus{opacity:.7}.focus\:opacity-75:focus{opacity:.75}.focus\:opacity-80:focus{opacity:.8}.focus\:opacity-90:focus{opacity:.9}.focus\:opacity-95:focus{opacity:.95}.focus\:opacity-100:focus{opacity:1}.bg-blend-normal{background-blend-mode:normal}.bg-blend-multiply{background-blend-mode:multiply}.bg-blend-screen{background-blend-mode:screen}.bg-blend-overlay{background-blend-mode:overlay}.bg-blend-darken{background-blend-mode:darken}.bg-blend-lighten{background-blend-mode:lighten}.bg-blend-color-dodge{background-blend-mode:color-dodge}.bg-blend-color-burn{background-blend-mode:color-burn}.bg-blend-hard-light{background-blend-mode:hard-light}.bg-blend-soft-light{background-blend-mode:soft-light}.bg-blend-difference{background-blend-mode:difference}.bg-blend-exclusion{background-blend-mode:exclusion}.bg-blend-hue{background-blend-mode:hue}.bg-blend-saturation{background-blend-mode:saturation}.bg-blend-color{background-blend-mode:color}.bg-blend-luminosity{background-blend-mode:luminosity}.mix-blend-normal{mix-blend-mode:normal}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-screen{mix-blend-mode:screen}.mix-blend-overlay{mix-blend-mode:overlay}.mix-blend-darken{mix-blend-mode:darken}.mix-blend-lighten{mix-blend-mode:lighten}.mix-blend-color-dodge{mix-blend-mode:color-dodge}.mix-blend-color-burn{mix-blend-mode:color-burn}.mix-blend-hard-light{mix-blend-mode:hard-light}.mix-blend-soft-light{mix-blend-mode:soft-light}.mix-blend-difference{mix-blend-mode:difference}.mix-blend-exclusion{mix-blend-mode:exclusion}.mix-blend-hue{mix-blend-mode:hue}.mix-blend-saturation{mix-blend-mode:saturation}.mix-blend-color{mix-blend-mode:color}.mix-blend-luminosity{mix-blend-mode:luminosity}*,:after,:before{--tw-shadow:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.shadow-inner,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000}.group:hover .group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .group-hover\:shadow,.group:hover .group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .group-hover\:shadow-lg,.group:hover .group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .group-hover\:shadow-2xl,.group:hover .group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .group-hover\:shadow-inner,.group:hover .group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-none{--tw-shadow:0 0 #0000}.focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.hover\:shadow-sm:hover,.hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.hover\:shadow-lg:hover,.hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.hover\:shadow-2xl:hover,.hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.hover\:shadow-inner:hover,.hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.focus\:shadow-sm:focus,.focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.focus\:shadow-lg:focus,.focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.focus\:shadow-2xl:focus,.focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.focus\:shadow-inner:focus,.focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline-white{outline:2px dotted #fff;outline-offset:2px}.outline-black{outline:2px dotted #000;outline-offset:2px}.focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus,.focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-8:focus,.focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-inset{--tw-ring-inset:inset}.focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.focus\:ring-inset:focus{--tw-ring-inset:inset}.ring-transparent{--tw-ring-color:transparent}.ring-current{--tw-ring-color:currentColor}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.focus\:ring-transparent:focus{--tw-ring-color:transparent}.focus\:ring-current:focus{--tw-ring-color:currentColor}.focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.ring-opacity-0{--tw-ring-opacity:0}.ring-opacity-5{--tw-ring-opacity:0.05}.ring-opacity-10{--tw-ring-opacity:0.1}.ring-opacity-20{--tw-ring-opacity:0.2}.ring-opacity-25{--tw-ring-opacity:0.25}.ring-opacity-30{--tw-ring-opacity:0.3}.ring-opacity-40{--tw-ring-opacity:0.4}.ring-opacity-50{--tw-ring-opacity:0.5}.ring-opacity-60{--tw-ring-opacity:0.6}.ring-opacity-70{--tw-ring-opacity:0.7}.ring-opacity-75{--tw-ring-opacity:0.75}.ring-opacity-80{--tw-ring-opacity:0.8}.ring-opacity-90{--tw-ring-opacity:0.9}.ring-opacity-95{--tw-ring-opacity:0.95}.ring-opacity-100{--tw-ring-opacity:1}.focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.ring-offset-0{--tw-ring-offset-width:0px}.ring-offset-1{--tw-ring-offset-width:1px}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-4{--tw-ring-offset-width:4px}.ring-offset-8{--tw-ring-offset-width:8px}.focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.ring-offset-transparent{--tw-ring-offset-color:transparent}.ring-offset-current{--tw-ring-offset-color:currentColor}.ring-offset-black{--tw-ring-offset-color:#000}.ring-offset-white{--tw-ring-offset-color:#fff}.ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.ring-offset-gray-700{--tw-ring-offset-color:#374151}.ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.ring-offset-gray-900{--tw-ring-offset-color:#111827}.ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.ring-offset-red-200{--tw-ring-offset-color:#fecaca}.ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.ring-offset-red-400{--tw-ring-offset-color:#f87171}.ring-offset-red-500{--tw-ring-offset-color:#ef4444}.ring-offset-red-600{--tw-ring-offset-color:#dc2626}.ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.ring-offset-red-800{--tw-ring-offset-color:#991b1b}.ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.ring-offset-green-400{--tw-ring-offset-color:#34d399}.ring-offset-green-500{--tw-ring-offset-color:#10b981}.ring-offset-green-600{--tw-ring-offset-color:#059669}.ring-offset-green-700{--tw-ring-offset-color:#047857}.ring-offset-green-800{--tw-ring-offset-color:#065f46}.ring-offset-green-900{--tw-ring-offset-color:#064e3b}.ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.ring-offset-pink-600{--tw-ring-offset-color:#db2777}.ring-offset-pink-700{--tw-ring-offset-color:#be185d}.ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.ring-offset-pink-900{--tw-ring-offset-color:#831843}.focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter-none{filter:none}.blur-0,.blur-none{--tw-blur:blur(0)}.blur-sm{--tw-blur:blur(4px)}.blur{--tw-blur:blur(8px)}.blur-md{--tw-blur:blur(12px)}.blur-lg{--tw-blur:blur(16px)}.blur-xl{--tw-blur:blur(24px)}.blur-2xl{--tw-blur:blur(40px)}.blur-3xl{--tw-blur:blur(64px)}.brightness-0{--tw-brightness:brightness(0)}.brightness-50{--tw-brightness:brightness(.5)}.brightness-75{--tw-brightness:brightness(.75)}.brightness-90{--tw-brightness:brightness(.9)}.brightness-95{--tw-brightness:brightness(.95)}.brightness-100{--tw-brightness:brightness(1)}.brightness-105{--tw-brightness:brightness(1.05)}.brightness-110{--tw-brightness:brightness(1.1)}.brightness-125{--tw-brightness:brightness(1.25)}.brightness-150{--tw-brightness:brightness(1.5)}.brightness-200{--tw-brightness:brightness(2)}.contrast-0{--tw-contrast:contrast(0)}.contrast-50{--tw-contrast:contrast(.5)}.contrast-75{--tw-contrast:contrast(.75)}.contrast-100{--tw-contrast:contrast(1)}.contrast-125{--tw-contrast:contrast(1.25)}.contrast-150{--tw-contrast:contrast(1.5)}.contrast-200{--tw-contrast:contrast(2)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.grayscale-0{--tw-grayscale:grayscale(0)}.grayscale{--tw-grayscale:grayscale(100%)}.hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.invert-0{--tw-invert:invert(0)}.invert{--tw-invert:invert(100%)}.saturate-0{--tw-saturate:saturate(0)}.saturate-50{--tw-saturate:saturate(.5)}.saturate-100{--tw-saturate:saturate(1)}.saturate-150{--tw-saturate:saturate(1.5)}.saturate-200{--tw-saturate:saturate(2)}.sepia-0{--tw-sepia:sepia(0)}.sepia{--tw-sepia:sepia(100%)}.backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.backdrop-blur-0,.backdrop-blur-none{--tw-backdrop-blur:blur(0)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.backdrop-invert-0{--tw-backdrop-invert:invert(0)}.backdrop-invert{--tw-backdrop-invert:invert(100%)}.backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.transition-none{transition-property:none}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:.15s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.duration-1000{transition-duration:1s}.ease-linear{transition-timing-function:linear}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.content-none{content:none}@media (min-width:640px){.sm\:container{width:100%}@media (min-width:640px){.sm\:container{max-width:640px}}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}@media (min-width:1536px){.sm\:container{max-width:1536px}}.sm\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:pointer-events-none{pointer-events:none}.sm\:pointer-events-auto{pointer-events:auto}.sm\:visible{visibility:visible}.sm\:invisible{visibility:hidden}.sm\:static{position:static}.sm\:fixed{position:fixed}.sm\:absolute{position:absolute}.sm\:relative{position:relative}.sm\:sticky{position:-webkit-sticky;position:sticky}.sm\:inset-0{top:0;right:0;bottom:0;left:0}.sm\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.sm\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.sm\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.sm\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.sm\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.sm\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.sm\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.sm\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.sm\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.sm\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.sm\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.sm\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.sm\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.sm\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.sm\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.sm\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.sm\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.sm\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.sm\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.sm\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.sm\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.sm\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.sm\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.sm\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.sm\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.sm\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.sm\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.sm\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.sm\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.sm\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.sm\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.sm\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.sm\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.sm\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.sm\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.sm\:-inset-0{top:0;right:0;bottom:0;left:0}.sm\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.sm\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.sm\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.sm\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.sm\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.sm\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.sm\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.sm\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.sm\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.sm\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.sm\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.sm\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.sm\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.sm\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.sm\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.sm\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.sm\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.sm\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.sm\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.sm\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.sm\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.sm\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.sm\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.sm\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.sm\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.sm\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.sm\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.sm\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.sm\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.sm\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.sm\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.sm\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.sm\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.sm\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.sm\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.sm\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.sm\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.sm\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.sm\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.sm\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.sm\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.sm\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.sm\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.sm\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.sm\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.sm\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.sm\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.sm\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.sm\:inset-x-0{left:0;right:0}.sm\:inset-x-1{left:.25rem;right:.25rem}.sm\:inset-x-2{left:.5rem;right:.5rem}.sm\:inset-x-3{left:.75rem;right:.75rem}.sm\:inset-x-4{left:1rem;right:1rem}.sm\:inset-x-5{left:1.25rem;right:1.25rem}.sm\:inset-x-6{left:1.5rem;right:1.5rem}.sm\:inset-x-7{left:1.75rem;right:1.75rem}.sm\:inset-x-8{left:2rem;right:2rem}.sm\:inset-x-9{left:2.25rem;right:2.25rem}.sm\:inset-x-10{left:2.5rem;right:2.5rem}.sm\:inset-x-11{left:2.75rem;right:2.75rem}.sm\:inset-x-12{left:3rem;right:3rem}.sm\:inset-x-14{left:3.5rem;right:3.5rem}.sm\:inset-x-16{left:4rem;right:4rem}.sm\:inset-x-20{left:5rem;right:5rem}.sm\:inset-x-24{left:6rem;right:6rem}.sm\:inset-x-28{left:7rem;right:7rem}.sm\:inset-x-32{left:8rem;right:8rem}.sm\:inset-x-36{left:9rem;right:9rem}.sm\:inset-x-40{left:10rem;right:10rem}.sm\:inset-x-44{left:11rem;right:11rem}.sm\:inset-x-48{left:12rem;right:12rem}.sm\:inset-x-52{left:13rem;right:13rem}.sm\:inset-x-56{left:14rem;right:14rem}.sm\:inset-x-60{left:15rem;right:15rem}.sm\:inset-x-64{left:16rem;right:16rem}.sm\:inset-x-72{left:18rem;right:18rem}.sm\:inset-x-80{left:20rem;right:20rem}.sm\:inset-x-96{left:24rem;right:24rem}.sm\:inset-x-auto{left:auto;right:auto}.sm\:inset-x-px{left:1px;right:1px}.sm\:inset-x-0\.5{left:.125rem;right:.125rem}.sm\:inset-x-1\.5{left:.375rem;right:.375rem}.sm\:inset-x-2\.5{left:.625rem;right:.625rem}.sm\:inset-x-3\.5{left:.875rem;right:.875rem}.sm\:-inset-x-0{left:0;right:0}.sm\:-inset-x-1{left:-.25rem;right:-.25rem}.sm\:-inset-x-2{left:-.5rem;right:-.5rem}.sm\:-inset-x-3{left:-.75rem;right:-.75rem}.sm\:-inset-x-4{left:-1rem;right:-1rem}.sm\:-inset-x-5{left:-1.25rem;right:-1.25rem}.sm\:-inset-x-6{left:-1.5rem;right:-1.5rem}.sm\:-inset-x-7{left:-1.75rem;right:-1.75rem}.sm\:-inset-x-8{left:-2rem;right:-2rem}.sm\:-inset-x-9{left:-2.25rem;right:-2.25rem}.sm\:-inset-x-10{left:-2.5rem;right:-2.5rem}.sm\:-inset-x-11{left:-2.75rem;right:-2.75rem}.sm\:-inset-x-12{left:-3rem;right:-3rem}.sm\:-inset-x-14{left:-3.5rem;right:-3.5rem}.sm\:-inset-x-16{left:-4rem;right:-4rem}.sm\:-inset-x-20{left:-5rem;right:-5rem}.sm\:-inset-x-24{left:-6rem;right:-6rem}.sm\:-inset-x-28{left:-7rem;right:-7rem}.sm\:-inset-x-32{left:-8rem;right:-8rem}.sm\:-inset-x-36{left:-9rem;right:-9rem}.sm\:-inset-x-40{left:-10rem;right:-10rem}.sm\:-inset-x-44{left:-11rem;right:-11rem}.sm\:-inset-x-48{left:-12rem;right:-12rem}.sm\:-inset-x-52{left:-13rem;right:-13rem}.sm\:-inset-x-56{left:-14rem;right:-14rem}.sm\:-inset-x-60{left:-15rem;right:-15rem}.sm\:-inset-x-64{left:-16rem;right:-16rem}.sm\:-inset-x-72{left:-18rem;right:-18rem}.sm\:-inset-x-80{left:-20rem;right:-20rem}.sm\:-inset-x-96{left:-24rem;right:-24rem}.sm\:-inset-x-px{left:-1px;right:-1px}.sm\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.sm\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.sm\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.sm\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.sm\:inset-x-1\/2{left:50%;right:50%}.sm\:inset-x-1\/3{left:33.333333%;right:33.333333%}.sm\:inset-x-2\/3{left:66.666667%;right:66.666667%}.sm\:inset-x-1\/4{left:25%;right:25%}.sm\:inset-x-2\/4{left:50%;right:50%}.sm\:inset-x-3\/4{left:75%;right:75%}.sm\:inset-x-full{left:100%;right:100%}.sm\:-inset-x-1\/2{left:-50%;right:-50%}.sm\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.sm\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.sm\:-inset-x-1\/4{left:-25%;right:-25%}.sm\:-inset-x-2\/4{left:-50%;right:-50%}.sm\:-inset-x-3\/4{left:-75%;right:-75%}.sm\:-inset-x-full{left:-100%;right:-100%}.sm\:inset-y-0{top:0;bottom:0}.sm\:inset-y-1{top:.25rem;bottom:.25rem}.sm\:inset-y-2{top:.5rem;bottom:.5rem}.sm\:inset-y-3{top:.75rem;bottom:.75rem}.sm\:inset-y-4{top:1rem;bottom:1rem}.sm\:inset-y-5{top:1.25rem;bottom:1.25rem}.sm\:inset-y-6{top:1.5rem;bottom:1.5rem}.sm\:inset-y-7{top:1.75rem;bottom:1.75rem}.sm\:inset-y-8{top:2rem;bottom:2rem}.sm\:inset-y-9{top:2.25rem;bottom:2.25rem}.sm\:inset-y-10{top:2.5rem;bottom:2.5rem}.sm\:inset-y-11{top:2.75rem;bottom:2.75rem}.sm\:inset-y-12{top:3rem;bottom:3rem}.sm\:inset-y-14{top:3.5rem;bottom:3.5rem}.sm\:inset-y-16{top:4rem;bottom:4rem}.sm\:inset-y-20{top:5rem;bottom:5rem}.sm\:inset-y-24{top:6rem;bottom:6rem}.sm\:inset-y-28{top:7rem;bottom:7rem}.sm\:inset-y-32{top:8rem;bottom:8rem}.sm\:inset-y-36{top:9rem;bottom:9rem}.sm\:inset-y-40{top:10rem;bottom:10rem}.sm\:inset-y-44{top:11rem;bottom:11rem}.sm\:inset-y-48{top:12rem;bottom:12rem}.sm\:inset-y-52{top:13rem;bottom:13rem}.sm\:inset-y-56{top:14rem;bottom:14rem}.sm\:inset-y-60{top:15rem;bottom:15rem}.sm\:inset-y-64{top:16rem;bottom:16rem}.sm\:inset-y-72{top:18rem;bottom:18rem}.sm\:inset-y-80{top:20rem;bottom:20rem}.sm\:inset-y-96{top:24rem;bottom:24rem}.sm\:inset-y-auto{top:auto;bottom:auto}.sm\:inset-y-px{top:1px;bottom:1px}.sm\:inset-y-0\.5{top:.125rem;bottom:.125rem}.sm\:inset-y-1\.5{top:.375rem;bottom:.375rem}.sm\:inset-y-2\.5{top:.625rem;bottom:.625rem}.sm\:inset-y-3\.5{top:.875rem;bottom:.875rem}.sm\:-inset-y-0{top:0;bottom:0}.sm\:-inset-y-1{top:-.25rem;bottom:-.25rem}.sm\:-inset-y-2{top:-.5rem;bottom:-.5rem}.sm\:-inset-y-3{top:-.75rem;bottom:-.75rem}.sm\:-inset-y-4{top:-1rem;bottom:-1rem}.sm\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.sm\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.sm\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.sm\:-inset-y-8{top:-2rem;bottom:-2rem}.sm\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.sm\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.sm\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.sm\:-inset-y-12{top:-3rem;bottom:-3rem}.sm\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.sm\:-inset-y-16{top:-4rem;bottom:-4rem}.sm\:-inset-y-20{top:-5rem;bottom:-5rem}.sm\:-inset-y-24{top:-6rem;bottom:-6rem}.sm\:-inset-y-28{top:-7rem;bottom:-7rem}.sm\:-inset-y-32{top:-8rem;bottom:-8rem}.sm\:-inset-y-36{top:-9rem;bottom:-9rem}.sm\:-inset-y-40{top:-10rem;bottom:-10rem}.sm\:-inset-y-44{top:-11rem;bottom:-11rem}.sm\:-inset-y-48{top:-12rem;bottom:-12rem}.sm\:-inset-y-52{top:-13rem;bottom:-13rem}.sm\:-inset-y-56{top:-14rem;bottom:-14rem}.sm\:-inset-y-60{top:-15rem;bottom:-15rem}.sm\:-inset-y-64{top:-16rem;bottom:-16rem}.sm\:-inset-y-72{top:-18rem;bottom:-18rem}.sm\:-inset-y-80{top:-20rem;bottom:-20rem}.sm\:-inset-y-96{top:-24rem;bottom:-24rem}.sm\:-inset-y-px{top:-1px;bottom:-1px}.sm\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.sm\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.sm\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.sm\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.sm\:inset-y-1\/2{top:50%;bottom:50%}.sm\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.sm\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.sm\:inset-y-1\/4{top:25%;bottom:25%}.sm\:inset-y-2\/4{top:50%;bottom:50%}.sm\:inset-y-3\/4{top:75%;bottom:75%}.sm\:inset-y-full{top:100%;bottom:100%}.sm\:-inset-y-1\/2{top:-50%;bottom:-50%}.sm\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.sm\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.sm\:-inset-y-1\/4{top:-25%;bottom:-25%}.sm\:-inset-y-2\/4{top:-50%;bottom:-50%}.sm\:-inset-y-3\/4{top:-75%;bottom:-75%}.sm\:-inset-y-full{top:-100%;bottom:-100%}.sm\:top-0{top:0}.sm\:top-1{top:.25rem}.sm\:top-2{top:.5rem}.sm\:top-3{top:.75rem}.sm\:top-4{top:1rem}.sm\:top-5{top:1.25rem}.sm\:top-6{top:1.5rem}.sm\:top-7{top:1.75rem}.sm\:top-8{top:2rem}.sm\:top-9{top:2.25rem}.sm\:top-10{top:2.5rem}.sm\:top-11{top:2.75rem}.sm\:top-12{top:3rem}.sm\:top-14{top:3.5rem}.sm\:top-16{top:4rem}.sm\:top-20{top:5rem}.sm\:top-24{top:6rem}.sm\:top-28{top:7rem}.sm\:top-32{top:8rem}.sm\:top-36{top:9rem}.sm\:top-40{top:10rem}.sm\:top-44{top:11rem}.sm\:top-48{top:12rem}.sm\:top-52{top:13rem}.sm\:top-56{top:14rem}.sm\:top-60{top:15rem}.sm\:top-64{top:16rem}.sm\:top-72{top:18rem}.sm\:top-80{top:20rem}.sm\:top-96{top:24rem}.sm\:top-auto{top:auto}.sm\:top-px{top:1px}.sm\:top-0\.5{top:.125rem}.sm\:top-1\.5{top:.375rem}.sm\:top-2\.5{top:.625rem}.sm\:top-3\.5{top:.875rem}.sm\:-top-0{top:0}.sm\:-top-1{top:-.25rem}.sm\:-top-2{top:-.5rem}.sm\:-top-3{top:-.75rem}.sm\:-top-4{top:-1rem}.sm\:-top-5{top:-1.25rem}.sm\:-top-6{top:-1.5rem}.sm\:-top-7{top:-1.75rem}.sm\:-top-8{top:-2rem}.sm\:-top-9{top:-2.25rem}.sm\:-top-10{top:-2.5rem}.sm\:-top-11{top:-2.75rem}.sm\:-top-12{top:-3rem}.sm\:-top-14{top:-3.5rem}.sm\:-top-16{top:-4rem}.sm\:-top-20{top:-5rem}.sm\:-top-24{top:-6rem}.sm\:-top-28{top:-7rem}.sm\:-top-32{top:-8rem}.sm\:-top-36{top:-9rem}.sm\:-top-40{top:-10rem}.sm\:-top-44{top:-11rem}.sm\:-top-48{top:-12rem}.sm\:-top-52{top:-13rem}.sm\:-top-56{top:-14rem}.sm\:-top-60{top:-15rem}.sm\:-top-64{top:-16rem}.sm\:-top-72{top:-18rem}.sm\:-top-80{top:-20rem}.sm\:-top-96{top:-24rem}.sm\:-top-px{top:-1px}.sm\:-top-0\.5{top:-.125rem}.sm\:-top-1\.5{top:-.375rem}.sm\:-top-2\.5{top:-.625rem}.sm\:-top-3\.5{top:-.875rem}.sm\:top-1\/2{top:50%}.sm\:top-1\/3{top:33.333333%}.sm\:top-2\/3{top:66.666667%}.sm\:top-1\/4{top:25%}.sm\:top-2\/4{top:50%}.sm\:top-3\/4{top:75%}.sm\:top-full{top:100%}.sm\:-top-1\/2{top:-50%}.sm\:-top-1\/3{top:-33.333333%}.sm\:-top-2\/3{top:-66.666667%}.sm\:-top-1\/4{top:-25%}.sm\:-top-2\/4{top:-50%}.sm\:-top-3\/4{top:-75%}.sm\:-top-full{top:-100%}.sm\:right-0{right:0}.sm\:right-1{right:.25rem}.sm\:right-2{right:.5rem}.sm\:right-3{right:.75rem}.sm\:right-4{right:1rem}.sm\:right-5{right:1.25rem}.sm\:right-6{right:1.5rem}.sm\:right-7{right:1.75rem}.sm\:right-8{right:2rem}.sm\:right-9{right:2.25rem}.sm\:right-10{right:2.5rem}.sm\:right-11{right:2.75rem}.sm\:right-12{right:3rem}.sm\:right-14{right:3.5rem}.sm\:right-16{right:4rem}.sm\:right-20{right:5rem}.sm\:right-24{right:6rem}.sm\:right-28{right:7rem}.sm\:right-32{right:8rem}.sm\:right-36{right:9rem}.sm\:right-40{right:10rem}.sm\:right-44{right:11rem}.sm\:right-48{right:12rem}.sm\:right-52{right:13rem}.sm\:right-56{right:14rem}.sm\:right-60{right:15rem}.sm\:right-64{right:16rem}.sm\:right-72{right:18rem}.sm\:right-80{right:20rem}.sm\:right-96{right:24rem}.sm\:right-auto{right:auto}.sm\:right-px{right:1px}.sm\:right-0\.5{right:.125rem}.sm\:right-1\.5{right:.375rem}.sm\:right-2\.5{right:.625rem}.sm\:right-3\.5{right:.875rem}.sm\:-right-0{right:0}.sm\:-right-1{right:-.25rem}.sm\:-right-2{right:-.5rem}.sm\:-right-3{right:-.75rem}.sm\:-right-4{right:-1rem}.sm\:-right-5{right:-1.25rem}.sm\:-right-6{right:-1.5rem}.sm\:-right-7{right:-1.75rem}.sm\:-right-8{right:-2rem}.sm\:-right-9{right:-2.25rem}.sm\:-right-10{right:-2.5rem}.sm\:-right-11{right:-2.75rem}.sm\:-right-12{right:-3rem}.sm\:-right-14{right:-3.5rem}.sm\:-right-16{right:-4rem}.sm\:-right-20{right:-5rem}.sm\:-right-24{right:-6rem}.sm\:-right-28{right:-7rem}.sm\:-right-32{right:-8rem}.sm\:-right-36{right:-9rem}.sm\:-right-40{right:-10rem}.sm\:-right-44{right:-11rem}.sm\:-right-48{right:-12rem}.sm\:-right-52{right:-13rem}.sm\:-right-56{right:-14rem}.sm\:-right-60{right:-15rem}.sm\:-right-64{right:-16rem}.sm\:-right-72{right:-18rem}.sm\:-right-80{right:-20rem}.sm\:-right-96{right:-24rem}.sm\:-right-px{right:-1px}.sm\:-right-0\.5{right:-.125rem}.sm\:-right-1\.5{right:-.375rem}.sm\:-right-2\.5{right:-.625rem}.sm\:-right-3\.5{right:-.875rem}.sm\:right-1\/2{right:50%}.sm\:right-1\/3{right:33.333333%}.sm\:right-2\/3{right:66.666667%}.sm\:right-1\/4{right:25%}.sm\:right-2\/4{right:50%}.sm\:right-3\/4{right:75%}.sm\:right-full{right:100%}.sm\:-right-1\/2{right:-50%}.sm\:-right-1\/3{right:-33.333333%}.sm\:-right-2\/3{right:-66.666667%}.sm\:-right-1\/4{right:-25%}.sm\:-right-2\/4{right:-50%}.sm\:-right-3\/4{right:-75%}.sm\:-right-full{right:-100%}.sm\:bottom-0{bottom:0}.sm\:bottom-1{bottom:.25rem}.sm\:bottom-2{bottom:.5rem}.sm\:bottom-3{bottom:.75rem}.sm\:bottom-4{bottom:1rem}.sm\:bottom-5{bottom:1.25rem}.sm\:bottom-6{bottom:1.5rem}.sm\:bottom-7{bottom:1.75rem}.sm\:bottom-8{bottom:2rem}.sm\:bottom-9{bottom:2.25rem}.sm\:bottom-10{bottom:2.5rem}.sm\:bottom-11{bottom:2.75rem}.sm\:bottom-12{bottom:3rem}.sm\:bottom-14{bottom:3.5rem}.sm\:bottom-16{bottom:4rem}.sm\:bottom-20{bottom:5rem}.sm\:bottom-24{bottom:6rem}.sm\:bottom-28{bottom:7rem}.sm\:bottom-32{bottom:8rem}.sm\:bottom-36{bottom:9rem}.sm\:bottom-40{bottom:10rem}.sm\:bottom-44{bottom:11rem}.sm\:bottom-48{bottom:12rem}.sm\:bottom-52{bottom:13rem}.sm\:bottom-56{bottom:14rem}.sm\:bottom-60{bottom:15rem}.sm\:bottom-64{bottom:16rem}.sm\:bottom-72{bottom:18rem}.sm\:bottom-80{bottom:20rem}.sm\:bottom-96{bottom:24rem}.sm\:bottom-auto{bottom:auto}.sm\:bottom-px{bottom:1px}.sm\:bottom-0\.5{bottom:.125rem}.sm\:bottom-1\.5{bottom:.375rem}.sm\:bottom-2\.5{bottom:.625rem}.sm\:bottom-3\.5{bottom:.875rem}.sm\:-bottom-0{bottom:0}.sm\:-bottom-1{bottom:-.25rem}.sm\:-bottom-2{bottom:-.5rem}.sm\:-bottom-3{bottom:-.75rem}.sm\:-bottom-4{bottom:-1rem}.sm\:-bottom-5{bottom:-1.25rem}.sm\:-bottom-6{bottom:-1.5rem}.sm\:-bottom-7{bottom:-1.75rem}.sm\:-bottom-8{bottom:-2rem}.sm\:-bottom-9{bottom:-2.25rem}.sm\:-bottom-10{bottom:-2.5rem}.sm\:-bottom-11{bottom:-2.75rem}.sm\:-bottom-12{bottom:-3rem}.sm\:-bottom-14{bottom:-3.5rem}.sm\:-bottom-16{bottom:-4rem}.sm\:-bottom-20{bottom:-5rem}.sm\:-bottom-24{bottom:-6rem}.sm\:-bottom-28{bottom:-7rem}.sm\:-bottom-32{bottom:-8rem}.sm\:-bottom-36{bottom:-9rem}.sm\:-bottom-40{bottom:-10rem}.sm\:-bottom-44{bottom:-11rem}.sm\:-bottom-48{bottom:-12rem}.sm\:-bottom-52{bottom:-13rem}.sm\:-bottom-56{bottom:-14rem}.sm\:-bottom-60{bottom:-15rem}.sm\:-bottom-64{bottom:-16rem}.sm\:-bottom-72{bottom:-18rem}.sm\:-bottom-80{bottom:-20rem}.sm\:-bottom-96{bottom:-24rem}.sm\:-bottom-px{bottom:-1px}.sm\:-bottom-0\.5{bottom:-.125rem}.sm\:-bottom-1\.5{bottom:-.375rem}.sm\:-bottom-2\.5{bottom:-.625rem}.sm\:-bottom-3\.5{bottom:-.875rem}.sm\:bottom-1\/2{bottom:50%}.sm\:bottom-1\/3{bottom:33.333333%}.sm\:bottom-2\/3{bottom:66.666667%}.sm\:bottom-1\/4{bottom:25%}.sm\:bottom-2\/4{bottom:50%}.sm\:bottom-3\/4{bottom:75%}.sm\:bottom-full{bottom:100%}.sm\:-bottom-1\/2{bottom:-50%}.sm\:-bottom-1\/3{bottom:-33.333333%}.sm\:-bottom-2\/3{bottom:-66.666667%}.sm\:-bottom-1\/4{bottom:-25%}.sm\:-bottom-2\/4{bottom:-50%}.sm\:-bottom-3\/4{bottom:-75%}.sm\:-bottom-full{bottom:-100%}.sm\:left-0{left:0}.sm\:left-1{left:.25rem}.sm\:left-2{left:.5rem}.sm\:left-3{left:.75rem}.sm\:left-4{left:1rem}.sm\:left-5{left:1.25rem}.sm\:left-6{left:1.5rem}.sm\:left-7{left:1.75rem}.sm\:left-8{left:2rem}.sm\:left-9{left:2.25rem}.sm\:left-10{left:2.5rem}.sm\:left-11{left:2.75rem}.sm\:left-12{left:3rem}.sm\:left-14{left:3.5rem}.sm\:left-16{left:4rem}.sm\:left-20{left:5rem}.sm\:left-24{left:6rem}.sm\:left-28{left:7rem}.sm\:left-32{left:8rem}.sm\:left-36{left:9rem}.sm\:left-40{left:10rem}.sm\:left-44{left:11rem}.sm\:left-48{left:12rem}.sm\:left-52{left:13rem}.sm\:left-56{left:14rem}.sm\:left-60{left:15rem}.sm\:left-64{left:16rem}.sm\:left-72{left:18rem}.sm\:left-80{left:20rem}.sm\:left-96{left:24rem}.sm\:left-auto{left:auto}.sm\:left-px{left:1px}.sm\:left-0\.5{left:.125rem}.sm\:left-1\.5{left:.375rem}.sm\:left-2\.5{left:.625rem}.sm\:left-3\.5{left:.875rem}.sm\:-left-0{left:0}.sm\:-left-1{left:-.25rem}.sm\:-left-2{left:-.5rem}.sm\:-left-3{left:-.75rem}.sm\:-left-4{left:-1rem}.sm\:-left-5{left:-1.25rem}.sm\:-left-6{left:-1.5rem}.sm\:-left-7{left:-1.75rem}.sm\:-left-8{left:-2rem}.sm\:-left-9{left:-2.25rem}.sm\:-left-10{left:-2.5rem}.sm\:-left-11{left:-2.75rem}.sm\:-left-12{left:-3rem}.sm\:-left-14{left:-3.5rem}.sm\:-left-16{left:-4rem}.sm\:-left-20{left:-5rem}.sm\:-left-24{left:-6rem}.sm\:-left-28{left:-7rem}.sm\:-left-32{left:-8rem}.sm\:-left-36{left:-9rem}.sm\:-left-40{left:-10rem}.sm\:-left-44{left:-11rem}.sm\:-left-48{left:-12rem}.sm\:-left-52{left:-13rem}.sm\:-left-56{left:-14rem}.sm\:-left-60{left:-15rem}.sm\:-left-64{left:-16rem}.sm\:-left-72{left:-18rem}.sm\:-left-80{left:-20rem}.sm\:-left-96{left:-24rem}.sm\:-left-px{left:-1px}.sm\:-left-0\.5{left:-.125rem}.sm\:-left-1\.5{left:-.375rem}.sm\:-left-2\.5{left:-.625rem}.sm\:-left-3\.5{left:-.875rem}.sm\:left-1\/2{left:50%}.sm\:left-1\/3{left:33.333333%}.sm\:left-2\/3{left:66.666667%}.sm\:left-1\/4{left:25%}.sm\:left-2\/4{left:50%}.sm\:left-3\/4{left:75%}.sm\:left-full{left:100%}.sm\:-left-1\/2{left:-50%}.sm\:-left-1\/3{left:-33.333333%}.sm\:-left-2\/3{left:-66.666667%}.sm\:-left-1\/4{left:-25%}.sm\:-left-2\/4{left:-50%}.sm\:-left-3\/4{left:-75%}.sm\:-left-full{left:-100%}.sm\:isolate{isolation:isolate}.sm\:isolation-auto{isolation:auto}.sm\:z-0{z-index:0}.sm\:z-10{z-index:10}.sm\:z-20{z-index:20}.sm\:z-30{z-index:30}.sm\:z-40{z-index:40}.sm\:z-50{z-index:50}.sm\:z-auto{z-index:auto}.sm\:focus-within\:z-0:focus-within{z-index:0}.sm\:focus-within\:z-10:focus-within{z-index:10}.sm\:focus-within\:z-20:focus-within{z-index:20}.sm\:focus-within\:z-30:focus-within{z-index:30}.sm\:focus-within\:z-40:focus-within{z-index:40}.sm\:focus-within\:z-50:focus-within{z-index:50}.sm\:focus-within\:z-auto:focus-within{z-index:auto}.sm\:focus\:z-0:focus{z-index:0}.sm\:focus\:z-10:focus{z-index:10}.sm\:focus\:z-20:focus{z-index:20}.sm\:focus\:z-30:focus{z-index:30}.sm\:focus\:z-40:focus{z-index:40}.sm\:focus\:z-50:focus{z-index:50}.sm\:focus\:z-auto:focus{z-index:auto}.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:order-3{order:3}.sm\:order-4{order:4}.sm\:order-5{order:5}.sm\:order-6{order:6}.sm\:order-7{order:7}.sm\:order-8{order:8}.sm\:order-9{order:9}.sm\:order-10{order:10}.sm\:order-11{order:11}.sm\:order-12{order:12}.sm\:order-first{order:-9999}.sm\:order-last{order:9999}.sm\:order-none{order:0}.sm\:col-auto{grid-column:auto}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:col-start-1{grid-column-start:1}.sm\:col-start-2{grid-column-start:2}.sm\:col-start-3{grid-column-start:3}.sm\:col-start-4{grid-column-start:4}.sm\:col-start-5{grid-column-start:5}.sm\:col-start-6{grid-column-start:6}.sm\:col-start-7{grid-column-start:7}.sm\:col-start-8{grid-column-start:8}.sm\:col-start-9{grid-column-start:9}.sm\:col-start-10{grid-column-start:10}.sm\:col-start-11{grid-column-start:11}.sm\:col-start-12{grid-column-start:12}.sm\:col-start-13{grid-column-start:13}.sm\:col-start-auto{grid-column-start:auto}.sm\:col-end-1{grid-column-end:1}.sm\:col-end-2{grid-column-end:2}.sm\:col-end-3{grid-column-end:3}.sm\:col-end-4{grid-column-end:4}.sm\:col-end-5{grid-column-end:5}.sm\:col-end-6{grid-column-end:6}.sm\:col-end-7{grid-column-end:7}.sm\:col-end-8{grid-column-end:8}.sm\:col-end-9{grid-column-end:9}.sm\:col-end-10{grid-column-end:10}.sm\:col-end-11{grid-column-end:11}.sm\:col-end-12{grid-column-end:12}.sm\:col-end-13{grid-column-end:13}.sm\:col-end-auto{grid-column-end:auto}.sm\:row-auto{grid-row:auto}.sm\:row-span-1{grid-row:span 1/span 1}.sm\:row-span-2{grid-row:span 2/span 2}.sm\:row-span-3{grid-row:span 3/span 3}.sm\:row-span-4{grid-row:span 4/span 4}.sm\:row-span-5{grid-row:span 5/span 5}.sm\:row-span-6{grid-row:span 6/span 6}.sm\:row-span-full{grid-row:1/-1}.sm\:row-start-1{grid-row-start:1}.sm\:row-start-2{grid-row-start:2}.sm\:row-start-3{grid-row-start:3}.sm\:row-start-4{grid-row-start:4}.sm\:row-start-5{grid-row-start:5}.sm\:row-start-6{grid-row-start:6}.sm\:row-start-7{grid-row-start:7}.sm\:row-start-auto{grid-row-start:auto}.sm\:row-end-1{grid-row-end:1}.sm\:row-end-2{grid-row-end:2}.sm\:row-end-3{grid-row-end:3}.sm\:row-end-4{grid-row-end:4}.sm\:row-end-5{grid-row-end:5}.sm\:row-end-6{grid-row-end:6}.sm\:row-end-7{grid-row-end:7}.sm\:row-end-auto{grid-row-end:auto}.sm\:float-right{float:right}.sm\:float-left{float:left}.sm\:float-none{float:none}.sm\:clear-left{clear:left}.sm\:clear-right{clear:right}.sm\:clear-both{clear:both}.sm\:clear-none{clear:none}.sm\:m-0{margin:0}.sm\:m-1{margin:.25rem}.sm\:m-2{margin:.5rem}.sm\:m-3{margin:.75rem}.sm\:m-4{margin:1rem}.sm\:m-5{margin:1.25rem}.sm\:m-6{margin:1.5rem}.sm\:m-7{margin:1.75rem}.sm\:m-8{margin:2rem}.sm\:m-9{margin:2.25rem}.sm\:m-10{margin:2.5rem}.sm\:m-11{margin:2.75rem}.sm\:m-12{margin:3rem}.sm\:m-14{margin:3.5rem}.sm\:m-16{margin:4rem}.sm\:m-20{margin:5rem}.sm\:m-24{margin:6rem}.sm\:m-28{margin:7rem}.sm\:m-32{margin:8rem}.sm\:m-36{margin:9rem}.sm\:m-40{margin:10rem}.sm\:m-44{margin:11rem}.sm\:m-48{margin:12rem}.sm\:m-52{margin:13rem}.sm\:m-56{margin:14rem}.sm\:m-60{margin:15rem}.sm\:m-64{margin:16rem}.sm\:m-72{margin:18rem}.sm\:m-80{margin:20rem}.sm\:m-96{margin:24rem}.sm\:m-auto{margin:auto}.sm\:m-px{margin:1px}.sm\:m-0\.5{margin:.125rem}.sm\:m-1\.5{margin:.375rem}.sm\:m-2\.5{margin:.625rem}.sm\:m-3\.5{margin:.875rem}.sm\:-m-0{margin:0}.sm\:-m-1{margin:-.25rem}.sm\:-m-2{margin:-.5rem}.sm\:-m-3{margin:-.75rem}.sm\:-m-4{margin:-1rem}.sm\:-m-5{margin:-1.25rem}.sm\:-m-6{margin:-1.5rem}.sm\:-m-7{margin:-1.75rem}.sm\:-m-8{margin:-2rem}.sm\:-m-9{margin:-2.25rem}.sm\:-m-10{margin:-2.5rem}.sm\:-m-11{margin:-2.75rem}.sm\:-m-12{margin:-3rem}.sm\:-m-14{margin:-3.5rem}.sm\:-m-16{margin:-4rem}.sm\:-m-20{margin:-5rem}.sm\:-m-24{margin:-6rem}.sm\:-m-28{margin:-7rem}.sm\:-m-32{margin:-8rem}.sm\:-m-36{margin:-9rem}.sm\:-m-40{margin:-10rem}.sm\:-m-44{margin:-11rem}.sm\:-m-48{margin:-12rem}.sm\:-m-52{margin:-13rem}.sm\:-m-56{margin:-14rem}.sm\:-m-60{margin:-15rem}.sm\:-m-64{margin:-16rem}.sm\:-m-72{margin:-18rem}.sm\:-m-80{margin:-20rem}.sm\:-m-96{margin:-24rem}.sm\:-m-px{margin:-1px}.sm\:-m-0\.5{margin:-.125rem}.sm\:-m-1\.5{margin:-.375rem}.sm\:-m-2\.5{margin:-.625rem}.sm\:-m-3\.5{margin:-.875rem}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:mx-1{margin-left:.25rem;margin-right:.25rem}.sm\:mx-2{margin-left:.5rem;margin-right:.5rem}.sm\:mx-3{margin-left:.75rem;margin-right:.75rem}.sm\:mx-4{margin-left:1rem;margin-right:1rem}.sm\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.sm\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.sm\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.sm\:mx-8{margin-left:2rem;margin-right:2rem}.sm\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.sm\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.sm\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.sm\:mx-12{margin-left:3rem;margin-right:3rem}.sm\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.sm\:mx-16{margin-left:4rem;margin-right:4rem}.sm\:mx-20{margin-left:5rem;margin-right:5rem}.sm\:mx-24{margin-left:6rem;margin-right:6rem}.sm\:mx-28{margin-left:7rem;margin-right:7rem}.sm\:mx-32{margin-left:8rem;margin-right:8rem}.sm\:mx-36{margin-left:9rem;margin-right:9rem}.sm\:mx-40{margin-left:10rem;margin-right:10rem}.sm\:mx-44{margin-left:11rem;margin-right:11rem}.sm\:mx-48{margin-left:12rem;margin-right:12rem}.sm\:mx-52{margin-left:13rem;margin-right:13rem}.sm\:mx-56{margin-left:14rem;margin-right:14rem}.sm\:mx-60{margin-left:15rem;margin-right:15rem}.sm\:mx-64{margin-left:16rem;margin-right:16rem}.sm\:mx-72{margin-left:18rem;margin-right:18rem}.sm\:mx-80{margin-left:20rem;margin-right:20rem}.sm\:mx-96{margin-left:24rem;margin-right:24rem}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mx-px{margin-left:1px;margin-right:1px}.sm\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.sm\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.sm\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.sm\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.sm\:-mx-0{margin-left:0;margin-right:0}.sm\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.sm\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.sm\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.sm\:-mx-4{margin-left:-1rem;margin-right:-1rem}.sm\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.sm\:-mx-8{margin-left:-2rem;margin-right:-2rem}.sm\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.sm\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.sm\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.sm\:-mx-12{margin-left:-3rem;margin-right:-3rem}.sm\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.sm\:-mx-16{margin-left:-4rem;margin-right:-4rem}.sm\:-mx-20{margin-left:-5rem;margin-right:-5rem}.sm\:-mx-24{margin-left:-6rem;margin-right:-6rem}.sm\:-mx-28{margin-left:-7rem;margin-right:-7rem}.sm\:-mx-32{margin-left:-8rem;margin-right:-8rem}.sm\:-mx-36{margin-left:-9rem;margin-right:-9rem}.sm\:-mx-40{margin-left:-10rem;margin-right:-10rem}.sm\:-mx-44{margin-left:-11rem;margin-right:-11rem}.sm\:-mx-48{margin-left:-12rem;margin-right:-12rem}.sm\:-mx-52{margin-left:-13rem;margin-right:-13rem}.sm\:-mx-56{margin-left:-14rem;margin-right:-14rem}.sm\:-mx-60{margin-left:-15rem;margin-right:-15rem}.sm\:-mx-64{margin-left:-16rem;margin-right:-16rem}.sm\:-mx-72{margin-left:-18rem;margin-right:-18rem}.sm\:-mx-80{margin-left:-20rem;margin-right:-20rem}.sm\:-mx-96{margin-left:-24rem;margin-right:-24rem}.sm\:-mx-px{margin-left:-1px;margin-right:-1px}.sm\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.sm\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.sm\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.sm\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:my-1{margin-top:.25rem;margin-bottom:.25rem}.sm\:my-2{margin-top:.5rem;margin-bottom:.5rem}.sm\:my-3{margin-top:.75rem;margin-bottom:.75rem}.sm\:my-4{margin-top:1rem;margin-bottom:1rem}.sm\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.sm\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.sm\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.sm\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.sm\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.sm\:my-16{margin-top:4rem;margin-bottom:4rem}.sm\:my-20{margin-top:5rem;margin-bottom:5rem}.sm\:my-24{margin-top:6rem;margin-bottom:6rem}.sm\:my-28{margin-top:7rem;margin-bottom:7rem}.sm\:my-32{margin-top:8rem;margin-bottom:8rem}.sm\:my-36{margin-top:9rem;margin-bottom:9rem}.sm\:my-40{margin-top:10rem;margin-bottom:10rem}.sm\:my-44{margin-top:11rem;margin-bottom:11rem}.sm\:my-48{margin-top:12rem;margin-bottom:12rem}.sm\:my-52{margin-top:13rem;margin-bottom:13rem}.sm\:my-56{margin-top:14rem;margin-bottom:14rem}.sm\:my-60{margin-top:15rem;margin-bottom:15rem}.sm\:my-64{margin-top:16rem;margin-bottom:16rem}.sm\:my-72{margin-top:18rem;margin-bottom:18rem}.sm\:my-80{margin-top:20rem;margin-bottom:20rem}.sm\:my-96{margin-top:24rem;margin-bottom:24rem}.sm\:my-auto{margin-top:auto;margin-bottom:auto}.sm\:my-px{margin-top:1px;margin-bottom:1px}.sm\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.sm\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.sm\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.sm\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.sm\:-my-0{margin-top:0;margin-bottom:0}.sm\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.sm\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.sm\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.sm\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.sm\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.sm\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.sm\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.sm\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.sm\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.sm\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.sm\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.sm\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.sm\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.sm\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.sm\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.sm\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.sm\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.sm\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.sm\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.sm\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.sm\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.sm\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.sm\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.sm\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.sm\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.sm\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.sm\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.sm\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.sm\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.sm\:-my-px{margin-top:-1px;margin-bottom:-1px}.sm\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.sm\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.sm\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.sm\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.sm\:mt-0{margin-top:0}.sm\:mt-1{margin-top:.25rem}.sm\:mt-2{margin-top:.5rem}.sm\:mt-3{margin-top:.75rem}.sm\:mt-4{margin-top:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:mt-6{margin-top:1.5rem}.sm\:mt-7{margin-top:1.75rem}.sm\:mt-8{margin-top:2rem}.sm\:mt-9{margin-top:2.25rem}.sm\:mt-10{margin-top:2.5rem}.sm\:mt-11{margin-top:2.75rem}.sm\:mt-12{margin-top:3rem}.sm\:mt-14{margin-top:3.5rem}.sm\:mt-16{margin-top:4rem}.sm\:mt-20{margin-top:5rem}.sm\:mt-24{margin-top:6rem}.sm\:mt-28{margin-top:7rem}.sm\:mt-32{margin-top:8rem}.sm\:mt-36{margin-top:9rem}.sm\:mt-40{margin-top:10rem}.sm\:mt-44{margin-top:11rem}.sm\:mt-48{margin-top:12rem}.sm\:mt-52{margin-top:13rem}.sm\:mt-56{margin-top:14rem}.sm\:mt-60{margin-top:15rem}.sm\:mt-64{margin-top:16rem}.sm\:mt-72{margin-top:18rem}.sm\:mt-80{margin-top:20rem}.sm\:mt-96{margin-top:24rem}.sm\:mt-auto{margin-top:auto}.sm\:mt-px{margin-top:1px}.sm\:mt-0\.5{margin-top:.125rem}.sm\:mt-1\.5{margin-top:.375rem}.sm\:mt-2\.5{margin-top:.625rem}.sm\:mt-3\.5{margin-top:.875rem}.sm\:-mt-0{margin-top:0}.sm\:-mt-1{margin-top:-.25rem}.sm\:-mt-2{margin-top:-.5rem}.sm\:-mt-3{margin-top:-.75rem}.sm\:-mt-4{margin-top:-1rem}.sm\:-mt-5{margin-top:-1.25rem}.sm\:-mt-6{margin-top:-1.5rem}.sm\:-mt-7{margin-top:-1.75rem}.sm\:-mt-8{margin-top:-2rem}.sm\:-mt-9{margin-top:-2.25rem}.sm\:-mt-10{margin-top:-2.5rem}.sm\:-mt-11{margin-top:-2.75rem}.sm\:-mt-12{margin-top:-3rem}.sm\:-mt-14{margin-top:-3.5rem}.sm\:-mt-16{margin-top:-4rem}.sm\:-mt-20{margin-top:-5rem}.sm\:-mt-24{margin-top:-6rem}.sm\:-mt-28{margin-top:-7rem}.sm\:-mt-32{margin-top:-8rem}.sm\:-mt-36{margin-top:-9rem}.sm\:-mt-40{margin-top:-10rem}.sm\:-mt-44{margin-top:-11rem}.sm\:-mt-48{margin-top:-12rem}.sm\:-mt-52{margin-top:-13rem}.sm\:-mt-56{margin-top:-14rem}.sm\:-mt-60{margin-top:-15rem}.sm\:-mt-64{margin-top:-16rem}.sm\:-mt-72{margin-top:-18rem}.sm\:-mt-80{margin-top:-20rem}.sm\:-mt-96{margin-top:-24rem}.sm\:-mt-px{margin-top:-1px}.sm\:-mt-0\.5{margin-top:-.125rem}.sm\:-mt-1\.5{margin-top:-.375rem}.sm\:-mt-2\.5{margin-top:-.625rem}.sm\:-mt-3\.5{margin-top:-.875rem}.sm\:mr-0{margin-right:0}.sm\:mr-1{margin-right:.25rem}.sm\:mr-2{margin-right:.5rem}.sm\:mr-3{margin-right:.75rem}.sm\:mr-4{margin-right:1rem}.sm\:mr-5{margin-right:1.25rem}.sm\:mr-6{margin-right:1.5rem}.sm\:mr-7{margin-right:1.75rem}.sm\:mr-8{margin-right:2rem}.sm\:mr-9{margin-right:2.25rem}.sm\:mr-10{margin-right:2.5rem}.sm\:mr-11{margin-right:2.75rem}.sm\:mr-12{margin-right:3rem}.sm\:mr-14{margin-right:3.5rem}.sm\:mr-16{margin-right:4rem}.sm\:mr-20{margin-right:5rem}.sm\:mr-24{margin-right:6rem}.sm\:mr-28{margin-right:7rem}.sm\:mr-32{margin-right:8rem}.sm\:mr-36{margin-right:9rem}.sm\:mr-40{margin-right:10rem}.sm\:mr-44{margin-right:11rem}.sm\:mr-48{margin-right:12rem}.sm\:mr-52{margin-right:13rem}.sm\:mr-56{margin-right:14rem}.sm\:mr-60{margin-right:15rem}.sm\:mr-64{margin-right:16rem}.sm\:mr-72{margin-right:18rem}.sm\:mr-80{margin-right:20rem}.sm\:mr-96{margin-right:24rem}.sm\:mr-auto{margin-right:auto}.sm\:mr-px{margin-right:1px}.sm\:mr-0\.5{margin-right:.125rem}.sm\:mr-1\.5{margin-right:.375rem}.sm\:mr-2\.5{margin-right:.625rem}.sm\:mr-3\.5{margin-right:.875rem}.sm\:-mr-0{margin-right:0}.sm\:-mr-1{margin-right:-.25rem}.sm\:-mr-2{margin-right:-.5rem}.sm\:-mr-3{margin-right:-.75rem}.sm\:-mr-4{margin-right:-1rem}.sm\:-mr-5{margin-right:-1.25rem}.sm\:-mr-6{margin-right:-1.5rem}.sm\:-mr-7{margin-right:-1.75rem}.sm\:-mr-8{margin-right:-2rem}.sm\:-mr-9{margin-right:-2.25rem}.sm\:-mr-10{margin-right:-2.5rem}.sm\:-mr-11{margin-right:-2.75rem}.sm\:-mr-12{margin-right:-3rem}.sm\:-mr-14{margin-right:-3.5rem}.sm\:-mr-16{margin-right:-4rem}.sm\:-mr-20{margin-right:-5rem}.sm\:-mr-24{margin-right:-6rem}.sm\:-mr-28{margin-right:-7rem}.sm\:-mr-32{margin-right:-8rem}.sm\:-mr-36{margin-right:-9rem}.sm\:-mr-40{margin-right:-10rem}.sm\:-mr-44{margin-right:-11rem}.sm\:-mr-48{margin-right:-12rem}.sm\:-mr-52{margin-right:-13rem}.sm\:-mr-56{margin-right:-14rem}.sm\:-mr-60{margin-right:-15rem}.sm\:-mr-64{margin-right:-16rem}.sm\:-mr-72{margin-right:-18rem}.sm\:-mr-80{margin-right:-20rem}.sm\:-mr-96{margin-right:-24rem}.sm\:-mr-px{margin-right:-1px}.sm\:-mr-0\.5{margin-right:-.125rem}.sm\:-mr-1\.5{margin-right:-.375rem}.sm\:-mr-2\.5{margin-right:-.625rem}.sm\:-mr-3\.5{margin-right:-.875rem}.sm\:mb-0{margin-bottom:0}.sm\:mb-1{margin-bottom:.25rem}.sm\:mb-2{margin-bottom:.5rem}.sm\:mb-3{margin-bottom:.75rem}.sm\:mb-4{margin-bottom:1rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:mb-7{margin-bottom:1.75rem}.sm\:mb-8{margin-bottom:2rem}.sm\:mb-9{margin-bottom:2.25rem}.sm\:mb-10{margin-bottom:2.5rem}.sm\:mb-11{margin-bottom:2.75rem}.sm\:mb-12{margin-bottom:3rem}.sm\:mb-14{margin-bottom:3.5rem}.sm\:mb-16{margin-bottom:4rem}.sm\:mb-20{margin-bottom:5rem}.sm\:mb-24{margin-bottom:6rem}.sm\:mb-28{margin-bottom:7rem}.sm\:mb-32{margin-bottom:8rem}.sm\:mb-36{margin-bottom:9rem}.sm\:mb-40{margin-bottom:10rem}.sm\:mb-44{margin-bottom:11rem}.sm\:mb-48{margin-bottom:12rem}.sm\:mb-52{margin-bottom:13rem}.sm\:mb-56{margin-bottom:14rem}.sm\:mb-60{margin-bottom:15rem}.sm\:mb-64{margin-bottom:16rem}.sm\:mb-72{margin-bottom:18rem}.sm\:mb-80{margin-bottom:20rem}.sm\:mb-96{margin-bottom:24rem}.sm\:mb-auto{margin-bottom:auto}.sm\:mb-px{margin-bottom:1px}.sm\:mb-0\.5{margin-bottom:.125rem}.sm\:mb-1\.5{margin-bottom:.375rem}.sm\:mb-2\.5{margin-bottom:.625rem}.sm\:mb-3\.5{margin-bottom:.875rem}.sm\:-mb-0{margin-bottom:0}.sm\:-mb-1{margin-bottom:-.25rem}.sm\:-mb-2{margin-bottom:-.5rem}.sm\:-mb-3{margin-bottom:-.75rem}.sm\:-mb-4{margin-bottom:-1rem}.sm\:-mb-5{margin-bottom:-1.25rem}.sm\:-mb-6{margin-bottom:-1.5rem}.sm\:-mb-7{margin-bottom:-1.75rem}.sm\:-mb-8{margin-bottom:-2rem}.sm\:-mb-9{margin-bottom:-2.25rem}.sm\:-mb-10{margin-bottom:-2.5rem}.sm\:-mb-11{margin-bottom:-2.75rem}.sm\:-mb-12{margin-bottom:-3rem}.sm\:-mb-14{margin-bottom:-3.5rem}.sm\:-mb-16{margin-bottom:-4rem}.sm\:-mb-20{margin-bottom:-5rem}.sm\:-mb-24{margin-bottom:-6rem}.sm\:-mb-28{margin-bottom:-7rem}.sm\:-mb-32{margin-bottom:-8rem}.sm\:-mb-36{margin-bottom:-9rem}.sm\:-mb-40{margin-bottom:-10rem}.sm\:-mb-44{margin-bottom:-11rem}.sm\:-mb-48{margin-bottom:-12rem}.sm\:-mb-52{margin-bottom:-13rem}.sm\:-mb-56{margin-bottom:-14rem}.sm\:-mb-60{margin-bottom:-15rem}.sm\:-mb-64{margin-bottom:-16rem}.sm\:-mb-72{margin-bottom:-18rem}.sm\:-mb-80{margin-bottom:-20rem}.sm\:-mb-96{margin-bottom:-24rem}.sm\:-mb-px{margin-bottom:-1px}.sm\:-mb-0\.5{margin-bottom:-.125rem}.sm\:-mb-1\.5{margin-bottom:-.375rem}.sm\:-mb-2\.5{margin-bottom:-.625rem}.sm\:-mb-3\.5{margin-bottom:-.875rem}.sm\:ml-0{margin-left:0}.sm\:ml-1{margin-left:.25rem}.sm\:ml-2{margin-left:.5rem}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:ml-5{margin-left:1.25rem}.sm\:ml-6{margin-left:1.5rem}.sm\:ml-7{margin-left:1.75rem}.sm\:ml-8{margin-left:2rem}.sm\:ml-9{margin-left:2.25rem}.sm\:ml-10{margin-left:2.5rem}.sm\:ml-11{margin-left:2.75rem}.sm\:ml-12{margin-left:3rem}.sm\:ml-14{margin-left:3.5rem}.sm\:ml-16{margin-left:4rem}.sm\:ml-20{margin-left:5rem}.sm\:ml-24{margin-left:6rem}.sm\:ml-28{margin-left:7rem}.sm\:ml-32{margin-left:8rem}.sm\:ml-36{margin-left:9rem}.sm\:ml-40{margin-left:10rem}.sm\:ml-44{margin-left:11rem}.sm\:ml-48{margin-left:12rem}.sm\:ml-52{margin-left:13rem}.sm\:ml-56{margin-left:14rem}.sm\:ml-60{margin-left:15rem}.sm\:ml-64{margin-left:16rem}.sm\:ml-72{margin-left:18rem}.sm\:ml-80{margin-left:20rem}.sm\:ml-96{margin-left:24rem}.sm\:ml-auto{margin-left:auto}.sm\:ml-px{margin-left:1px}.sm\:ml-0\.5{margin-left:.125rem}.sm\:ml-1\.5{margin-left:.375rem}.sm\:ml-2\.5{margin-left:.625rem}.sm\:ml-3\.5{margin-left:.875rem}.sm\:-ml-0{margin-left:0}.sm\:-ml-1{margin-left:-.25rem}.sm\:-ml-2{margin-left:-.5rem}.sm\:-ml-3{margin-left:-.75rem}.sm\:-ml-4{margin-left:-1rem}.sm\:-ml-5{margin-left:-1.25rem}.sm\:-ml-6{margin-left:-1.5rem}.sm\:-ml-7{margin-left:-1.75rem}.sm\:-ml-8{margin-left:-2rem}.sm\:-ml-9{margin-left:-2.25rem}.sm\:-ml-10{margin-left:-2.5rem}.sm\:-ml-11{margin-left:-2.75rem}.sm\:-ml-12{margin-left:-3rem}.sm\:-ml-14{margin-left:-3.5rem}.sm\:-ml-16{margin-left:-4rem}.sm\:-ml-20{margin-left:-5rem}.sm\:-ml-24{margin-left:-6rem}.sm\:-ml-28{margin-left:-7rem}.sm\:-ml-32{margin-left:-8rem}.sm\:-ml-36{margin-left:-9rem}.sm\:-ml-40{margin-left:-10rem}.sm\:-ml-44{margin-left:-11rem}.sm\:-ml-48{margin-left:-12rem}.sm\:-ml-52{margin-left:-13rem}.sm\:-ml-56{margin-left:-14rem}.sm\:-ml-60{margin-left:-15rem}.sm\:-ml-64{margin-left:-16rem}.sm\:-ml-72{margin-left:-18rem}.sm\:-ml-80{margin-left:-20rem}.sm\:-ml-96{margin-left:-24rem}.sm\:-ml-px{margin-left:-1px}.sm\:-ml-0\.5{margin-left:-.125rem}.sm\:-ml-1\.5{margin-left:-.375rem}.sm\:-ml-2\.5{margin-left:-.625rem}.sm\:-ml-3\.5{margin-left:-.875rem}.sm\:box-border{box-sizing:border-box}.sm\:box-content{box-sizing:initial}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:table{display:table}.sm\:inline-table{display:inline-table}.sm\:table-caption{display:table-caption}.sm\:table-cell{display:table-cell}.sm\:table-column{display:table-column}.sm\:table-column-group{display:table-column-group}.sm\:table-footer-group{display:table-footer-group}.sm\:table-header-group{display:table-header-group}.sm\:table-row-group{display:table-row-group}.sm\:table-row{display:table-row}.sm\:flow-root{display:flow-root}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:contents{display:contents}.sm\:list-item{display:list-item}.sm\:hidden{display:none}.sm\:h-0{height:0}.sm\:h-1{height:.25rem}.sm\:h-2{height:.5rem}.sm\:h-3{height:.75rem}.sm\:h-4{height:1rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-7{height:1.75rem}.sm\:h-8{height:2rem}.sm\:h-9{height:2.25rem}.sm\:h-10{height:2.5rem}.sm\:h-11{height:2.75rem}.sm\:h-12{height:3rem}.sm\:h-14{height:3.5rem}.sm\:h-16{height:4rem}.sm\:h-20{height:5rem}.sm\:h-24{height:6rem}.sm\:h-28{height:7rem}.sm\:h-32{height:8rem}.sm\:h-36{height:9rem}.sm\:h-40{height:10rem}.sm\:h-44{height:11rem}.sm\:h-48{height:12rem}.sm\:h-52{height:13rem}.sm\:h-56{height:14rem}.sm\:h-60{height:15rem}.sm\:h-64{height:16rem}.sm\:h-72{height:18rem}.sm\:h-80{height:20rem}.sm\:h-96{height:24rem}.sm\:h-auto{height:auto}.sm\:h-px{height:1px}.sm\:h-0\.5{height:.125rem}.sm\:h-1\.5{height:.375rem}.sm\:h-2\.5{height:.625rem}.sm\:h-3\.5{height:.875rem}.sm\:h-1\/2{height:50%}.sm\:h-1\/3{height:33.333333%}.sm\:h-2\/3{height:66.666667%}.sm\:h-1\/4{height:25%}.sm\:h-2\/4{height:50%}.sm\:h-3\/4{height:75%}.sm\:h-1\/5{height:20%}.sm\:h-2\/5{height:40%}.sm\:h-3\/5{height:60%}.sm\:h-4\/5{height:80%}.sm\:h-1\/6{height:16.666667%}.sm\:h-2\/6{height:33.333333%}.sm\:h-3\/6{height:50%}.sm\:h-4\/6{height:66.666667%}.sm\:h-5\/6{height:83.333333%}.sm\:h-full{height:100%}.sm\:h-screen{height:100vh}.sm\:max-h-0{max-height:0}.sm\:max-h-1{max-height:.25rem}.sm\:max-h-2{max-height:.5rem}.sm\:max-h-3{max-height:.75rem}.sm\:max-h-4{max-height:1rem}.sm\:max-h-5{max-height:1.25rem}.sm\:max-h-6{max-height:1.5rem}.sm\:max-h-7{max-height:1.75rem}.sm\:max-h-8{max-height:2rem}.sm\:max-h-9{max-height:2.25rem}.sm\:max-h-10{max-height:2.5rem}.sm\:max-h-11{max-height:2.75rem}.sm\:max-h-12{max-height:3rem}.sm\:max-h-14{max-height:3.5rem}.sm\:max-h-16{max-height:4rem}.sm\:max-h-20{max-height:5rem}.sm\:max-h-24{max-height:6rem}.sm\:max-h-28{max-height:7rem}.sm\:max-h-32{max-height:8rem}.sm\:max-h-36{max-height:9rem}.sm\:max-h-40{max-height:10rem}.sm\:max-h-44{max-height:11rem}.sm\:max-h-48{max-height:12rem}.sm\:max-h-52{max-height:13rem}.sm\:max-h-56{max-height:14rem}.sm\:max-h-60{max-height:15rem}.sm\:max-h-64{max-height:16rem}.sm\:max-h-72{max-height:18rem}.sm\:max-h-80{max-height:20rem}.sm\:max-h-96{max-height:24rem}.sm\:max-h-px{max-height:1px}.sm\:max-h-0\.5{max-height:.125rem}.sm\:max-h-1\.5{max-height:.375rem}.sm\:max-h-2\.5{max-height:.625rem}.sm\:max-h-3\.5{max-height:.875rem}.sm\:max-h-full{max-height:100%}.sm\:max-h-screen{max-height:100vh}.sm\:min-h-0{min-height:0}.sm\:min-h-full{min-height:100%}.sm\:min-h-screen{min-height:100vh}.sm\:w-0{width:0}.sm\:w-1{width:.25rem}.sm\:w-2{width:.5rem}.sm\:w-3{width:.75rem}.sm\:w-4{width:1rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-7{width:1.75rem}.sm\:w-8{width:2rem}.sm\:w-9{width:2.25rem}.sm\:w-10{width:2.5rem}.sm\:w-11{width:2.75rem}.sm\:w-12{width:3rem}.sm\:w-14{width:3.5rem}.sm\:w-16{width:4rem}.sm\:w-20{width:5rem}.sm\:w-24{width:6rem}.sm\:w-28{width:7rem}.sm\:w-32{width:8rem}.sm\:w-36{width:9rem}.sm\:w-40{width:10rem}.sm\:w-44{width:11rem}.sm\:w-48{width:12rem}.sm\:w-52{width:13rem}.sm\:w-56{width:14rem}.sm\:w-60{width:15rem}.sm\:w-64{width:16rem}.sm\:w-72{width:18rem}.sm\:w-80{width:20rem}.sm\:w-96{width:24rem}.sm\:w-auto{width:auto}.sm\:w-px{width:1px}.sm\:w-0\.5{width:.125rem}.sm\:w-1\.5{width:.375rem}.sm\:w-2\.5{width:.625rem}.sm\:w-3\.5{width:.875rem}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-1\/4{width:25%}.sm\:w-2\/4{width:50%}.sm\:w-3\/4{width:75%}.sm\:w-1\/5{width:20%}.sm\:w-2\/5{width:40%}.sm\:w-3\/5{width:60%}.sm\:w-4\/5{width:80%}.sm\:w-1\/6{width:16.666667%}.sm\:w-2\/6{width:33.333333%}.sm\:w-3\/6{width:50%}.sm\:w-4\/6{width:66.666667%}.sm\:w-5\/6{width:83.333333%}.sm\:w-1\/12{width:8.333333%}.sm\:w-2\/12{width:16.666667%}.sm\:w-3\/12{width:25%}.sm\:w-4\/12{width:33.333333%}.sm\:w-5\/12{width:41.666667%}.sm\:w-6\/12{width:50%}.sm\:w-7\/12{width:58.333333%}.sm\:w-8\/12{width:66.666667%}.sm\:w-9\/12{width:75%}.sm\:w-10\/12{width:83.333333%}.sm\:w-11\/12{width:91.666667%}.sm\:w-full{width:100%}.sm\:w-screen{width:100vw}.sm\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.sm\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.sm\:min-w-0{min-width:0}.sm\:min-w-full{min-width:100%}.sm\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.sm\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.sm\:max-w-0{max-width:0}.sm\:max-w-none{max-width:none}.sm\:max-w-xs{max-width:20rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-7xl{max-width:80rem}.sm\:max-w-full{max-width:100%}.sm\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.sm\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.sm\:max-w-prose{max-width:65ch}.sm\:max-w-screen-sm{max-width:640px}.sm\:max-w-screen-md{max-width:768px}.sm\:max-w-screen-lg{max-width:1024px}.sm\:max-w-screen-xl{max-width:1280px}.sm\:max-w-screen-2xl{max-width:1536px}.sm\:flex-1{flex:1 1 0%}.sm\:flex-auto{flex:1 1 auto}.sm\:flex-initial{flex:0 1 auto}.sm\:flex-none{flex:none}.sm\:flex-shrink-0{flex-shrink:0}.sm\:flex-shrink{flex-shrink:1}.sm\:flex-grow-0{flex-grow:0}.sm\:flex-grow{flex-grow:1}.sm\:table-auto{table-layout:auto}.sm\:table-fixed{table-layout:fixed}.sm\:border-collapse{border-collapse:collapse}.sm\:border-separate{border-collapse:initial}.sm\:origin-center{transform-origin:center}.sm\:origin-top{transform-origin:top}.sm\:origin-top-right{transform-origin:top right}.sm\:origin-right{transform-origin:right}.sm\:origin-bottom-right{transform-origin:bottom right}.sm\:origin-bottom{transform-origin:bottom}.sm\:origin-bottom-left{transform-origin:bottom left}.sm\:origin-left{transform-origin:left}.sm\:origin-top-left{transform-origin:top left}.sm\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:transform,.sm\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.sm\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:transform-none{transform:none}.sm\:translate-x-0{--tw-translate-x:0px}.sm\:translate-x-1{--tw-translate-x:0.25rem}.sm\:translate-x-2{--tw-translate-x:0.5rem}.sm\:translate-x-3{--tw-translate-x:0.75rem}.sm\:translate-x-4{--tw-translate-x:1rem}.sm\:translate-x-5{--tw-translate-x:1.25rem}.sm\:translate-x-6{--tw-translate-x:1.5rem}.sm\:translate-x-7{--tw-translate-x:1.75rem}.sm\:translate-x-8{--tw-translate-x:2rem}.sm\:translate-x-9{--tw-translate-x:2.25rem}.sm\:translate-x-10{--tw-translate-x:2.5rem}.sm\:translate-x-11{--tw-translate-x:2.75rem}.sm\:translate-x-12{--tw-translate-x:3rem}.sm\:translate-x-14{--tw-translate-x:3.5rem}.sm\:translate-x-16{--tw-translate-x:4rem}.sm\:translate-x-20{--tw-translate-x:5rem}.sm\:translate-x-24{--tw-translate-x:6rem}.sm\:translate-x-28{--tw-translate-x:7rem}.sm\:translate-x-32{--tw-translate-x:8rem}.sm\:translate-x-36{--tw-translate-x:9rem}.sm\:translate-x-40{--tw-translate-x:10rem}.sm\:translate-x-44{--tw-translate-x:11rem}.sm\:translate-x-48{--tw-translate-x:12rem}.sm\:translate-x-52{--tw-translate-x:13rem}.sm\:translate-x-56{--tw-translate-x:14rem}.sm\:translate-x-60{--tw-translate-x:15rem}.sm\:translate-x-64{--tw-translate-x:16rem}.sm\:translate-x-72{--tw-translate-x:18rem}.sm\:translate-x-80{--tw-translate-x:20rem}.sm\:translate-x-96{--tw-translate-x:24rem}.sm\:translate-x-px{--tw-translate-x:1px}.sm\:translate-x-0\.5{--tw-translate-x:0.125rem}.sm\:translate-x-1\.5{--tw-translate-x:0.375rem}.sm\:translate-x-2\.5{--tw-translate-x:0.625rem}.sm\:translate-x-3\.5{--tw-translate-x:0.875rem}.sm\:-translate-x-0{--tw-translate-x:0px}.sm\:-translate-x-1{--tw-translate-x:-0.25rem}.sm\:-translate-x-2{--tw-translate-x:-0.5rem}.sm\:-translate-x-3{--tw-translate-x:-0.75rem}.sm\:-translate-x-4{--tw-translate-x:-1rem}.sm\:-translate-x-5{--tw-translate-x:-1.25rem}.sm\:-translate-x-6{--tw-translate-x:-1.5rem}.sm\:-translate-x-7{--tw-translate-x:-1.75rem}.sm\:-translate-x-8{--tw-translate-x:-2rem}.sm\:-translate-x-9{--tw-translate-x:-2.25rem}.sm\:-translate-x-10{--tw-translate-x:-2.5rem}.sm\:-translate-x-11{--tw-translate-x:-2.75rem}.sm\:-translate-x-12{--tw-translate-x:-3rem}.sm\:-translate-x-14{--tw-translate-x:-3.5rem}.sm\:-translate-x-16{--tw-translate-x:-4rem}.sm\:-translate-x-20{--tw-translate-x:-5rem}.sm\:-translate-x-24{--tw-translate-x:-6rem}.sm\:-translate-x-28{--tw-translate-x:-7rem}.sm\:-translate-x-32{--tw-translate-x:-8rem}.sm\:-translate-x-36{--tw-translate-x:-9rem}.sm\:-translate-x-40{--tw-translate-x:-10rem}.sm\:-translate-x-44{--tw-translate-x:-11rem}.sm\:-translate-x-48{--tw-translate-x:-12rem}.sm\:-translate-x-52{--tw-translate-x:-13rem}.sm\:-translate-x-56{--tw-translate-x:-14rem}.sm\:-translate-x-60{--tw-translate-x:-15rem}.sm\:-translate-x-64{--tw-translate-x:-16rem}.sm\:-translate-x-72{--tw-translate-x:-18rem}.sm\:-translate-x-80{--tw-translate-x:-20rem}.sm\:-translate-x-96{--tw-translate-x:-24rem}.sm\:-translate-x-px{--tw-translate-x:-1px}.sm\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.sm\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.sm\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.sm\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.sm\:translate-x-1\/2{--tw-translate-x:50%}.sm\:translate-x-1\/3{--tw-translate-x:33.333333%}.sm\:translate-x-2\/3{--tw-translate-x:66.666667%}.sm\:translate-x-1\/4{--tw-translate-x:25%}.sm\:translate-x-2\/4{--tw-translate-x:50%}.sm\:translate-x-3\/4{--tw-translate-x:75%}.sm\:translate-x-full{--tw-translate-x:100%}.sm\:-translate-x-1\/2{--tw-translate-x:-50%}.sm\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.sm\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.sm\:-translate-x-1\/4{--tw-translate-x:-25%}.sm\:-translate-x-2\/4{--tw-translate-x:-50%}.sm\:-translate-x-3\/4{--tw-translate-x:-75%}.sm\:-translate-x-full{--tw-translate-x:-100%}.sm\:translate-y-0{--tw-translate-y:0px}.sm\:translate-y-1{--tw-translate-y:0.25rem}.sm\:translate-y-2{--tw-translate-y:0.5rem}.sm\:translate-y-3{--tw-translate-y:0.75rem}.sm\:translate-y-4{--tw-translate-y:1rem}.sm\:translate-y-5{--tw-translate-y:1.25rem}.sm\:translate-y-6{--tw-translate-y:1.5rem}.sm\:translate-y-7{--tw-translate-y:1.75rem}.sm\:translate-y-8{--tw-translate-y:2rem}.sm\:translate-y-9{--tw-translate-y:2.25rem}.sm\:translate-y-10{--tw-translate-y:2.5rem}.sm\:translate-y-11{--tw-translate-y:2.75rem}.sm\:translate-y-12{--tw-translate-y:3rem}.sm\:translate-y-14{--tw-translate-y:3.5rem}.sm\:translate-y-16{--tw-translate-y:4rem}.sm\:translate-y-20{--tw-translate-y:5rem}.sm\:translate-y-24{--tw-translate-y:6rem}.sm\:translate-y-28{--tw-translate-y:7rem}.sm\:translate-y-32{--tw-translate-y:8rem}.sm\:translate-y-36{--tw-translate-y:9rem}.sm\:translate-y-40{--tw-translate-y:10rem}.sm\:translate-y-44{--tw-translate-y:11rem}.sm\:translate-y-48{--tw-translate-y:12rem}.sm\:translate-y-52{--tw-translate-y:13rem}.sm\:translate-y-56{--tw-translate-y:14rem}.sm\:translate-y-60{--tw-translate-y:15rem}.sm\:translate-y-64{--tw-translate-y:16rem}.sm\:translate-y-72{--tw-translate-y:18rem}.sm\:translate-y-80{--tw-translate-y:20rem}.sm\:translate-y-96{--tw-translate-y:24rem}.sm\:translate-y-px{--tw-translate-y:1px}.sm\:translate-y-0\.5{--tw-translate-y:0.125rem}.sm\:translate-y-1\.5{--tw-translate-y:0.375rem}.sm\:translate-y-2\.5{--tw-translate-y:0.625rem}.sm\:translate-y-3\.5{--tw-translate-y:0.875rem}.sm\:-translate-y-0{--tw-translate-y:0px}.sm\:-translate-y-1{--tw-translate-y:-0.25rem}.sm\:-translate-y-2{--tw-translate-y:-0.5rem}.sm\:-translate-y-3{--tw-translate-y:-0.75rem}.sm\:-translate-y-4{--tw-translate-y:-1rem}.sm\:-translate-y-5{--tw-translate-y:-1.25rem}.sm\:-translate-y-6{--tw-translate-y:-1.5rem}.sm\:-translate-y-7{--tw-translate-y:-1.75rem}.sm\:-translate-y-8{--tw-translate-y:-2rem}.sm\:-translate-y-9{--tw-translate-y:-2.25rem}.sm\:-translate-y-10{--tw-translate-y:-2.5rem}.sm\:-translate-y-11{--tw-translate-y:-2.75rem}.sm\:-translate-y-12{--tw-translate-y:-3rem}.sm\:-translate-y-14{--tw-translate-y:-3.5rem}.sm\:-translate-y-16{--tw-translate-y:-4rem}.sm\:-translate-y-20{--tw-translate-y:-5rem}.sm\:-translate-y-24{--tw-translate-y:-6rem}.sm\:-translate-y-28{--tw-translate-y:-7rem}.sm\:-translate-y-32{--tw-translate-y:-8rem}.sm\:-translate-y-36{--tw-translate-y:-9rem}.sm\:-translate-y-40{--tw-translate-y:-10rem}.sm\:-translate-y-44{--tw-translate-y:-11rem}.sm\:-translate-y-48{--tw-translate-y:-12rem}.sm\:-translate-y-52{--tw-translate-y:-13rem}.sm\:-translate-y-56{--tw-translate-y:-14rem}.sm\:-translate-y-60{--tw-translate-y:-15rem}.sm\:-translate-y-64{--tw-translate-y:-16rem}.sm\:-translate-y-72{--tw-translate-y:-18rem}.sm\:-translate-y-80{--tw-translate-y:-20rem}.sm\:-translate-y-96{--tw-translate-y:-24rem}.sm\:-translate-y-px{--tw-translate-y:-1px}.sm\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.sm\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.sm\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.sm\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.sm\:translate-y-1\/2{--tw-translate-y:50%}.sm\:translate-y-1\/3{--tw-translate-y:33.333333%}.sm\:translate-y-2\/3{--tw-translate-y:66.666667%}.sm\:translate-y-1\/4{--tw-translate-y:25%}.sm\:translate-y-2\/4{--tw-translate-y:50%}.sm\:translate-y-3\/4{--tw-translate-y:75%}.sm\:translate-y-full{--tw-translate-y:100%}.sm\:-translate-y-1\/2{--tw-translate-y:-50%}.sm\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.sm\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.sm\:-translate-y-1\/4{--tw-translate-y:-25%}.sm\:-translate-y-2\/4{--tw-translate-y:-50%}.sm\:-translate-y-3\/4{--tw-translate-y:-75%}.sm\:-translate-y-full{--tw-translate-y:-100%}.sm\:hover\:translate-x-0:hover{--tw-translate-x:0px}.sm\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.sm\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.sm\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.sm\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.sm\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.sm\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.sm\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.sm\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.sm\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.sm\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.sm\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.sm\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.sm\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.sm\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.sm\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.sm\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.sm\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.sm\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.sm\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.sm\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.sm\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.sm\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.sm\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.sm\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.sm\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.sm\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.sm\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.sm\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.sm\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.sm\:hover\:translate-x-px:hover{--tw-translate-x:1px}.sm\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.sm\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.sm\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.sm\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.sm\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.sm\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.sm\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.sm\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.sm\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.sm\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.sm\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.sm\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.sm\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.sm\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.sm\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.sm\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.sm\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.sm\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.sm\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.sm\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.sm\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.sm\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.sm\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.sm\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.sm\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.sm\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.sm\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.sm\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.sm\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.sm\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.sm\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.sm\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.sm\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.sm\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.sm\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.sm\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.sm\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.sm\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.sm\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.sm\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.sm\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.sm\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.sm\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.sm\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.sm\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.sm\:hover\:translate-x-full:hover{--tw-translate-x:100%}.sm\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.sm\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.sm\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.sm\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.sm\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.sm\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.sm\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.sm\:hover\:translate-y-0:hover{--tw-translate-y:0px}.sm\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.sm\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.sm\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.sm\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.sm\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.sm\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.sm\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.sm\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.sm\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.sm\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.sm\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.sm\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.sm\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.sm\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.sm\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.sm\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.sm\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.sm\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.sm\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.sm\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.sm\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.sm\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.sm\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.sm\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.sm\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.sm\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.sm\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.sm\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.sm\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.sm\:hover\:translate-y-px:hover{--tw-translate-y:1px}.sm\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.sm\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.sm\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.sm\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.sm\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.sm\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.sm\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.sm\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.sm\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.sm\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.sm\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.sm\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.sm\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.sm\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.sm\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.sm\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.sm\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.sm\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.sm\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.sm\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.sm\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.sm\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.sm\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.sm\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.sm\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.sm\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.sm\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.sm\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.sm\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.sm\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.sm\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.sm\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.sm\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.sm\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.sm\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.sm\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.sm\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.sm\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.sm\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.sm\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.sm\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.sm\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.sm\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.sm\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.sm\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.sm\:hover\:translate-y-full:hover{--tw-translate-y:100%}.sm\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.sm\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.sm\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.sm\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.sm\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.sm\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.sm\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.sm\:focus\:translate-x-0:focus{--tw-translate-x:0px}.sm\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.sm\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.sm\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.sm\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.sm\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.sm\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.sm\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.sm\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.sm\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.sm\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.sm\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.sm\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.sm\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.sm\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.sm\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.sm\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.sm\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.sm\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.sm\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.sm\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.sm\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.sm\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.sm\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.sm\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.sm\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.sm\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.sm\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.sm\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.sm\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.sm\:focus\:translate-x-px:focus{--tw-translate-x:1px}.sm\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.sm\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.sm\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.sm\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.sm\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.sm\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.sm\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.sm\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.sm\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.sm\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.sm\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.sm\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.sm\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.sm\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.sm\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.sm\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.sm\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.sm\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.sm\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.sm\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.sm\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.sm\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.sm\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.sm\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.sm\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.sm\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.sm\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.sm\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.sm\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.sm\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.sm\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.sm\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.sm\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.sm\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.sm\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.sm\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.sm\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.sm\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.sm\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.sm\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.sm\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.sm\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.sm\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.sm\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.sm\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.sm\:focus\:translate-x-full:focus{--tw-translate-x:100%}.sm\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.sm\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.sm\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.sm\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.sm\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.sm\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.sm\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.sm\:focus\:translate-y-0:focus{--tw-translate-y:0px}.sm\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.sm\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.sm\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.sm\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.sm\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.sm\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.sm\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.sm\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.sm\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.sm\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.sm\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.sm\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.sm\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.sm\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.sm\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.sm\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.sm\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.sm\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.sm\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.sm\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.sm\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.sm\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.sm\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.sm\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.sm\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.sm\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.sm\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.sm\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.sm\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.sm\:focus\:translate-y-px:focus{--tw-translate-y:1px}.sm\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.sm\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.sm\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.sm\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.sm\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.sm\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.sm\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.sm\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.sm\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.sm\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.sm\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.sm\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.sm\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.sm\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.sm\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.sm\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.sm\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.sm\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.sm\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.sm\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.sm\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.sm\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.sm\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.sm\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.sm\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.sm\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.sm\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.sm\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.sm\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.sm\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.sm\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.sm\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.sm\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.sm\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.sm\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.sm\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.sm\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.sm\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.sm\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.sm\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.sm\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.sm\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.sm\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.sm\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.sm\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.sm\:focus\:translate-y-full:focus{--tw-translate-y:100%}.sm\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.sm\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.sm\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.sm\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.sm\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.sm\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.sm\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.sm\:rotate-0{--tw-rotate:0deg}.sm\:rotate-1{--tw-rotate:1deg}.sm\:rotate-2{--tw-rotate:2deg}.sm\:rotate-3{--tw-rotate:3deg}.sm\:rotate-6{--tw-rotate:6deg}.sm\:rotate-12{--tw-rotate:12deg}.sm\:rotate-45{--tw-rotate:45deg}.sm\:rotate-90{--tw-rotate:90deg}.sm\:rotate-180{--tw-rotate:180deg}.sm\:-rotate-180{--tw-rotate:-180deg}.sm\:-rotate-90{--tw-rotate:-90deg}.sm\:-rotate-45{--tw-rotate:-45deg}.sm\:-rotate-12{--tw-rotate:-12deg}.sm\:-rotate-6{--tw-rotate:-6deg}.sm\:-rotate-3{--tw-rotate:-3deg}.sm\:-rotate-2{--tw-rotate:-2deg}.sm\:-rotate-1{--tw-rotate:-1deg}.sm\:hover\:rotate-0:hover{--tw-rotate:0deg}.sm\:hover\:rotate-1:hover{--tw-rotate:1deg}.sm\:hover\:rotate-2:hover{--tw-rotate:2deg}.sm\:hover\:rotate-3:hover{--tw-rotate:3deg}.sm\:hover\:rotate-6:hover{--tw-rotate:6deg}.sm\:hover\:rotate-12:hover{--tw-rotate:12deg}.sm\:hover\:rotate-45:hover{--tw-rotate:45deg}.sm\:hover\:rotate-90:hover{--tw-rotate:90deg}.sm\:hover\:rotate-180:hover{--tw-rotate:180deg}.sm\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.sm\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.sm\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.sm\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.sm\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.sm\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.sm\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.sm\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.sm\:focus\:rotate-0:focus{--tw-rotate:0deg}.sm\:focus\:rotate-1:focus{--tw-rotate:1deg}.sm\:focus\:rotate-2:focus{--tw-rotate:2deg}.sm\:focus\:rotate-3:focus{--tw-rotate:3deg}.sm\:focus\:rotate-6:focus{--tw-rotate:6deg}.sm\:focus\:rotate-12:focus{--tw-rotate:12deg}.sm\:focus\:rotate-45:focus{--tw-rotate:45deg}.sm\:focus\:rotate-90:focus{--tw-rotate:90deg}.sm\:focus\:rotate-180:focus{--tw-rotate:180deg}.sm\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.sm\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.sm\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.sm\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.sm\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.sm\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.sm\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.sm\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.sm\:skew-x-0{--tw-skew-x:0deg}.sm\:skew-x-1{--tw-skew-x:1deg}.sm\:skew-x-2{--tw-skew-x:2deg}.sm\:skew-x-3{--tw-skew-x:3deg}.sm\:skew-x-6{--tw-skew-x:6deg}.sm\:skew-x-12{--tw-skew-x:12deg}.sm\:-skew-x-12{--tw-skew-x:-12deg}.sm\:-skew-x-6{--tw-skew-x:-6deg}.sm\:-skew-x-3{--tw-skew-x:-3deg}.sm\:-skew-x-2{--tw-skew-x:-2deg}.sm\:-skew-x-1{--tw-skew-x:-1deg}.sm\:skew-y-0{--tw-skew-y:0deg}.sm\:skew-y-1{--tw-skew-y:1deg}.sm\:skew-y-2{--tw-skew-y:2deg}.sm\:skew-y-3{--tw-skew-y:3deg}.sm\:skew-y-6{--tw-skew-y:6deg}.sm\:skew-y-12{--tw-skew-y:12deg}.sm\:-skew-y-12{--tw-skew-y:-12deg}.sm\:-skew-y-6{--tw-skew-y:-6deg}.sm\:-skew-y-3{--tw-skew-y:-3deg}.sm\:-skew-y-2{--tw-skew-y:-2deg}.sm\:-skew-y-1{--tw-skew-y:-1deg}.sm\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.sm\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.sm\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.sm\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.sm\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.sm\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.sm\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.sm\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.sm\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.sm\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.sm\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.sm\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.sm\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.sm\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.sm\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.sm\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.sm\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.sm\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.sm\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.sm\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.sm\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.sm\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.sm\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.sm\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.sm\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.sm\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.sm\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.sm\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.sm\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.sm\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.sm\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.sm\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.sm\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.sm\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.sm\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.sm\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.sm\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.sm\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.sm\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.sm\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.sm\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.sm\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.sm\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.sm\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.sm\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.sm\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.sm\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.sm\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.sm\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.sm\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.sm\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.sm\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.sm\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.sm\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.sm\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.sm\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.sm\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.sm\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.sm\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.sm\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.sm\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.sm\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.sm\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.sm\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.sm\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.sm\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.sm\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.sm\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.sm\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.sm\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.sm\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.sm\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.sm\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.sm\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.sm\:scale-x-0{--tw-scale-x:0}.sm\:scale-x-50{--tw-scale-x:.5}.sm\:scale-x-75{--tw-scale-x:.75}.sm\:scale-x-90{--tw-scale-x:.9}.sm\:scale-x-95{--tw-scale-x:.95}.sm\:scale-x-100{--tw-scale-x:1}.sm\:scale-x-105{--tw-scale-x:1.05}.sm\:scale-x-110{--tw-scale-x:1.1}.sm\:scale-x-125{--tw-scale-x:1.25}.sm\:scale-x-150{--tw-scale-x:1.5}.sm\:scale-y-0{--tw-scale-y:0}.sm\:scale-y-50{--tw-scale-y:.5}.sm\:scale-y-75{--tw-scale-y:.75}.sm\:scale-y-90{--tw-scale-y:.9}.sm\:scale-y-95{--tw-scale-y:.95}.sm\:scale-y-100{--tw-scale-y:1}.sm\:scale-y-105{--tw-scale-y:1.05}.sm\:scale-y-110{--tw-scale-y:1.1}.sm\:scale-y-125{--tw-scale-y:1.25}.sm\:scale-y-150{--tw-scale-y:1.5}.sm\:hover\:scale-x-0:hover{--tw-scale-x:0}.sm\:hover\:scale-x-50:hover{--tw-scale-x:.5}.sm\:hover\:scale-x-75:hover{--tw-scale-x:.75}.sm\:hover\:scale-x-90:hover{--tw-scale-x:.9}.sm\:hover\:scale-x-95:hover{--tw-scale-x:.95}.sm\:hover\:scale-x-100:hover{--tw-scale-x:1}.sm\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.sm\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.sm\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.sm\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.sm\:hover\:scale-y-0:hover{--tw-scale-y:0}.sm\:hover\:scale-y-50:hover{--tw-scale-y:.5}.sm\:hover\:scale-y-75:hover{--tw-scale-y:.75}.sm\:hover\:scale-y-90:hover{--tw-scale-y:.9}.sm\:hover\:scale-y-95:hover{--tw-scale-y:.95}.sm\:hover\:scale-y-100:hover{--tw-scale-y:1}.sm\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.sm\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.sm\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.sm\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.sm\:focus\:scale-x-0:focus{--tw-scale-x:0}.sm\:focus\:scale-x-50:focus{--tw-scale-x:.5}.sm\:focus\:scale-x-75:focus{--tw-scale-x:.75}.sm\:focus\:scale-x-90:focus{--tw-scale-x:.9}.sm\:focus\:scale-x-95:focus{--tw-scale-x:.95}.sm\:focus\:scale-x-100:focus{--tw-scale-x:1}.sm\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.sm\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.sm\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.sm\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.sm\:focus\:scale-y-0:focus{--tw-scale-y:0}.sm\:focus\:scale-y-50:focus{--tw-scale-y:.5}.sm\:focus\:scale-y-75:focus{--tw-scale-y:.75}.sm\:focus\:scale-y-90:focus{--tw-scale-y:.9}.sm\:focus\:scale-y-95:focus{--tw-scale-y:.95}.sm\:focus\:scale-y-100:focus{--tw-scale-y:1}.sm\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.sm\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.sm\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.sm\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.sm\:animate-none{-webkit-animation:none;animation:none}.sm\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.sm\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.sm\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.sm\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.sm\:cursor-auto{cursor:auto}.sm\:cursor-default{cursor:default}.sm\:cursor-pointer{cursor:pointer}.sm\:cursor-wait{cursor:wait}.sm\:cursor-text{cursor:text}.sm\:cursor-move{cursor:move}.sm\:cursor-help{cursor:help}.sm\:cursor-not-allowed{cursor:not-allowed}.sm\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sm\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.sm\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.sm\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.sm\:resize-none{resize:none}.sm\:resize-y{resize:vertical}.sm\:resize-x{resize:horizontal}.sm\:resize{resize:both}.sm\:list-inside{list-style-position:inside}.sm\:list-outside{list-style-position:outside}.sm\:list-none{list-style-type:none}.sm\:list-disc{list-style-type:disc}.sm\:list-decimal{list-style-type:decimal}.sm\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.sm\:auto-cols-auto{grid-auto-columns:auto}.sm\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.sm\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.sm\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.sm\:grid-flow-row{grid-auto-flow:row}.sm\:grid-flow-col{grid-auto-flow:column}.sm\:grid-flow-row-dense{grid-auto-flow:row dense}.sm\:grid-flow-col-dense{grid-auto-flow:column dense}.sm\:auto-rows-auto{grid-auto-rows:auto}.sm\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.sm\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.sm\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.sm\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.sm\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.sm\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.sm\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.sm\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.sm\:grid-rows-none{grid-template-rows:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-col{flex-direction:column}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:flex-wrap{flex-wrap:wrap}.sm\:flex-wrap-reverse{flex-wrap:wrap-reverse}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:place-content-center{place-content:center}.sm\:place-content-start{place-content:start}.sm\:place-content-end{place-content:end}.sm\:place-content-between{place-content:space-between}.sm\:place-content-around{place-content:space-around}.sm\:place-content-evenly{place-content:space-evenly}.sm\:place-content-stretch{place-content:stretch}.sm\:place-items-start{place-items:start}.sm\:place-items-end{place-items:end}.sm\:place-items-center{place-items:center}.sm\:place-items-stretch{place-items:stretch}.sm\:content-center{align-content:center}.sm\:content-start{align-content:flex-start}.sm\:content-end{align-content:flex-end}.sm\:content-between{align-content:space-between}.sm\:content-around{align-content:space-around}.sm\:content-evenly{align-content:space-evenly}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:items-baseline{align-items:baseline}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-around{justify-content:space-around}.sm\:justify-evenly{justify-content:space-evenly}.sm\:justify-items-start{justify-items:start}.sm\:justify-items-end{justify-items:end}.sm\:justify-items-center{justify-items:center}.sm\:justify-items-stretch{justify-items:stretch}.sm\:gap-0{gap:0}.sm\:gap-1{gap:.25rem}.sm\:gap-2{gap:.5rem}.sm\:gap-3{gap:.75rem}.sm\:gap-4{gap:1rem}.sm\:gap-5{gap:1.25rem}.sm\:gap-6{gap:1.5rem}.sm\:gap-7{gap:1.75rem}.sm\:gap-8{gap:2rem}.sm\:gap-9{gap:2.25rem}.sm\:gap-10{gap:2.5rem}.sm\:gap-11{gap:2.75rem}.sm\:gap-12{gap:3rem}.sm\:gap-14{gap:3.5rem}.sm\:gap-16{gap:4rem}.sm\:gap-20{gap:5rem}.sm\:gap-24{gap:6rem}.sm\:gap-28{gap:7rem}.sm\:gap-32{gap:8rem}.sm\:gap-36{gap:9rem}.sm\:gap-40{gap:10rem}.sm\:gap-44{gap:11rem}.sm\:gap-48{gap:12rem}.sm\:gap-52{gap:13rem}.sm\:gap-56{gap:14rem}.sm\:gap-60{gap:15rem}.sm\:gap-64{gap:16rem}.sm\:gap-72{gap:18rem}.sm\:gap-80{gap:20rem}.sm\:gap-96{gap:24rem}.sm\:gap-px{gap:1px}.sm\:gap-0\.5{gap:.125rem}.sm\:gap-1\.5{gap:.375rem}.sm\:gap-2\.5{gap:.625rem}.sm\:gap-3\.5{gap:.875rem}.sm\:gap-x-0{-moz-column-gap:0;column-gap:0}.sm\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.sm\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.sm\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.sm\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.sm\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.sm\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.sm\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.sm\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.sm\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.sm\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.sm\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.sm\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.sm\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.sm\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.sm\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.sm\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.sm\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.sm\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.sm\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.sm\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.sm\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.sm\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.sm\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.sm\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.sm\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.sm\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.sm\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.sm\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.sm\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.sm\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.sm\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.sm\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.sm\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.sm\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.sm\:gap-y-0{row-gap:0}.sm\:gap-y-1{row-gap:.25rem}.sm\:gap-y-2{row-gap:.5rem}.sm\:gap-y-3{row-gap:.75rem}.sm\:gap-y-4{row-gap:1rem}.sm\:gap-y-5{row-gap:1.25rem}.sm\:gap-y-6{row-gap:1.5rem}.sm\:gap-y-7{row-gap:1.75rem}.sm\:gap-y-8{row-gap:2rem}.sm\:gap-y-9{row-gap:2.25rem}.sm\:gap-y-10{row-gap:2.5rem}.sm\:gap-y-11{row-gap:2.75rem}.sm\:gap-y-12{row-gap:3rem}.sm\:gap-y-14{row-gap:3.5rem}.sm\:gap-y-16{row-gap:4rem}.sm\:gap-y-20{row-gap:5rem}.sm\:gap-y-24{row-gap:6rem}.sm\:gap-y-28{row-gap:7rem}.sm\:gap-y-32{row-gap:8rem}.sm\:gap-y-36{row-gap:9rem}.sm\:gap-y-40{row-gap:10rem}.sm\:gap-y-44{row-gap:11rem}.sm\:gap-y-48{row-gap:12rem}.sm\:gap-y-52{row-gap:13rem}.sm\:gap-y-56{row-gap:14rem}.sm\:gap-y-60{row-gap:15rem}.sm\:gap-y-64{row-gap:16rem}.sm\:gap-y-72{row-gap:18rem}.sm\:gap-y-80{row-gap:20rem}.sm\:gap-y-96{row-gap:24rem}.sm\:gap-y-px{row-gap:1px}.sm\:gap-y-0\.5{row-gap:.125rem}.sm\:gap-y-1\.5{row-gap:.375rem}.sm\:gap-y-2\.5{row-gap:.625rem}.sm\:gap-y-3\.5{row-gap:.875rem}.sm\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.sm\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.sm\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.sm\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.sm\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.sm\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.sm\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.sm\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.sm\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.sm\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.sm\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.sm\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.sm\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.sm\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.sm\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.sm\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.sm\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.sm\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.sm\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.sm\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.sm\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.sm\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.sm\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.sm\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.sm\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.sm\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.sm\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.sm\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.sm\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.sm\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.sm\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.sm\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.sm\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.sm\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.sm\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.sm\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.sm\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.sm\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.sm\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.sm\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.sm\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.sm\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.sm\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.sm\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.sm\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.sm\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.sm\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.sm\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.sm\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.sm\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.sm\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.sm\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.sm\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.sm\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.sm\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.sm\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.sm\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.sm\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.sm\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.sm\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.sm\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.sm\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.sm\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.sm\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.sm\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.sm\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.sm\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.sm\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.sm\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.sm\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.sm\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.sm\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.sm\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.sm\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.sm\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.sm\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.sm\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.sm\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.sm\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.sm\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.sm\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.sm\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.sm\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.sm\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.sm\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.sm\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.sm\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.sm\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.sm\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.sm\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.sm\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.sm\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.sm\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.sm\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.sm\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.sm\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.sm\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.sm\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.sm\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.sm\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.sm\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.sm\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.sm\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.sm\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.sm\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.sm\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.sm\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.sm\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.sm\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.sm\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.sm\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.sm\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.sm\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.sm\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.sm\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.sm\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.sm\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.sm\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.sm\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.sm\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.sm\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.sm\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.sm\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.sm\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.sm\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.sm\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.sm\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.sm\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.sm\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.sm\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.sm\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.sm\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.sm\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.sm\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.sm\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.sm\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.sm\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.sm\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.sm\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.sm\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.sm\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.sm\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.sm\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.sm\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.sm\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.sm\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.sm\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.sm\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.sm\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.sm\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.sm\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.sm\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.sm\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.sm\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.sm\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.sm\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.sm\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.sm\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.sm\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.sm\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.sm\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.sm\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.sm\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.sm\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.sm\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.sm\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.sm\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.sm\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.sm\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.sm\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.sm\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.sm\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.sm\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.sm\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.sm\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.sm\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.sm\:place-self-auto{place-self:auto}.sm\:place-self-start{place-self:start}.sm\:place-self-end{place-self:end}.sm\:place-self-center{place-self:center}.sm\:place-self-stretch{place-self:stretch}.sm\:self-auto{align-self:auto}.sm\:self-start{align-self:flex-start}.sm\:self-end{align-self:flex-end}.sm\:self-center{align-self:center}.sm\:self-stretch{align-self:stretch}.sm\:self-baseline{align-self:baseline}.sm\:justify-self-auto{justify-self:auto}.sm\:justify-self-start{justify-self:start}.sm\:justify-self-end{justify-self:end}.sm\:justify-self-center{justify-self:center}.sm\:justify-self-stretch{justify-self:stretch}.sm\:overflow-auto{overflow:auto}.sm\:overflow-hidden{overflow:hidden}.sm\:overflow-visible{overflow:visible}.sm\:overflow-scroll{overflow:scroll}.sm\:overflow-x-auto{overflow-x:auto}.sm\:overflow-y-auto{overflow-y:auto}.sm\:overflow-x-hidden{overflow-x:hidden}.sm\:overflow-y-hidden{overflow-y:hidden}.sm\:overflow-x-visible{overflow-x:visible}.sm\:overflow-y-visible{overflow-y:visible}.sm\:overflow-x-scroll{overflow-x:scroll}.sm\:overflow-y-scroll{overflow-y:scroll}.sm\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.sm\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.sm\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.sm\:overscroll-y-auto{overscroll-behavior-y:auto}.sm\:overscroll-y-contain{overscroll-behavior-y:contain}.sm\:overscroll-y-none{overscroll-behavior-y:none}.sm\:overscroll-x-auto{overscroll-behavior-x:auto}.sm\:overscroll-x-contain{overscroll-behavior-x:contain}.sm\:overscroll-x-none{overscroll-behavior-x:none}.sm\:truncate{overflow:hidden;white-space:nowrap}.sm\:overflow-ellipsis,.sm\:truncate{text-overflow:ellipsis}.sm\:overflow-clip{text-overflow:clip}.sm\:whitespace-normal{white-space:normal}.sm\:whitespace-nowrap{white-space:nowrap}.sm\:whitespace-pre{white-space:pre}.sm\:whitespace-pre-line{white-space:pre-line}.sm\:whitespace-pre-wrap{white-space:pre-wrap}.sm\:break-normal{overflow-wrap:normal;word-break:normal}.sm\:break-words{overflow-wrap:break-word}.sm\:break-all{word-break:break-all}.sm\:rounded-none{border-radius:0}.sm\:rounded-sm{border-radius:.125rem}.sm\:rounded{border-radius:.25rem}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:rounded-2xl{border-radius:1rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:rounded-full{border-radius:9999px}.sm\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.sm\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.sm\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.sm\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.sm\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.sm\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.sm\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.sm\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.sm\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.sm\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.sm\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.sm\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.sm\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.sm\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.sm\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.sm\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.sm\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.sm\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.sm\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.sm\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.sm\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-tl-none{border-top-left-radius:0}.sm\:rounded-tl-sm{border-top-left-radius:.125rem}.sm\:rounded-tl{border-top-left-radius:.25rem}.sm\:rounded-tl-md{border-top-left-radius:.375rem}.sm\:rounded-tl-lg{border-top-left-radius:.5rem}.sm\:rounded-tl-xl{border-top-left-radius:.75rem}.sm\:rounded-tl-2xl{border-top-left-radius:1rem}.sm\:rounded-tl-3xl{border-top-left-radius:1.5rem}.sm\:rounded-tl-full{border-top-left-radius:9999px}.sm\:rounded-tr-none{border-top-right-radius:0}.sm\:rounded-tr-sm{border-top-right-radius:.125rem}.sm\:rounded-tr{border-top-right-radius:.25rem}.sm\:rounded-tr-md{border-top-right-radius:.375rem}.sm\:rounded-tr-lg{border-top-right-radius:.5rem}.sm\:rounded-tr-xl{border-top-right-radius:.75rem}.sm\:rounded-tr-2xl{border-top-right-radius:1rem}.sm\:rounded-tr-3xl{border-top-right-radius:1.5rem}.sm\:rounded-tr-full{border-top-right-radius:9999px}.sm\:rounded-br-none{border-bottom-right-radius:0}.sm\:rounded-br-sm{border-bottom-right-radius:.125rem}.sm\:rounded-br{border-bottom-right-radius:.25rem}.sm\:rounded-br-md{border-bottom-right-radius:.375rem}.sm\:rounded-br-lg{border-bottom-right-radius:.5rem}.sm\:rounded-br-xl{border-bottom-right-radius:.75rem}.sm\:rounded-br-2xl{border-bottom-right-radius:1rem}.sm\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.sm\:rounded-br-full{border-bottom-right-radius:9999px}.sm\:rounded-bl-none{border-bottom-left-radius:0}.sm\:rounded-bl-sm{border-bottom-left-radius:.125rem}.sm\:rounded-bl{border-bottom-left-radius:.25rem}.sm\:rounded-bl-md{border-bottom-left-radius:.375rem}.sm\:rounded-bl-lg{border-bottom-left-radius:.5rem}.sm\:rounded-bl-xl{border-bottom-left-radius:.75rem}.sm\:rounded-bl-2xl{border-bottom-left-radius:1rem}.sm\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.sm\:rounded-bl-full{border-bottom-left-radius:9999px}.sm\:border-0{border-width:0}.sm\:border-2{border-width:2px}.sm\:border-4{border-width:4px}.sm\:border-8{border-width:8px}.sm\:border{border-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:border-t-2{border-top-width:2px}.sm\:border-t-4{border-top-width:4px}.sm\:border-t-8{border-top-width:8px}.sm\:border-t{border-top-width:1px}.sm\:border-r-0{border-right-width:0}.sm\:border-r-2{border-right-width:2px}.sm\:border-r-4{border-right-width:4px}.sm\:border-r-8{border-right-width:8px}.sm\:border-r{border-right-width:1px}.sm\:border-b-0{border-bottom-width:0}.sm\:border-b-2{border-bottom-width:2px}.sm\:border-b-4{border-bottom-width:4px}.sm\:border-b-8{border-bottom-width:8px}.sm\:border-b{border-bottom-width:1px}.sm\:border-l-0{border-left-width:0}.sm\:border-l-2{border-left-width:2px}.sm\:border-l-4{border-left-width:4px}.sm\:border-l-8{border-left-width:8px}.sm\:border-l{border-left-width:1px}.sm\:border-solid{border-style:solid}.sm\:border-dashed{border-style:dashed}.sm\:border-dotted{border-style:dotted}.sm\:border-double{border-style:double}.sm\:border-none{border-style:none}.sm\:border-transparent{border-color:transparent}.sm\:border-current{border-color:currentColor}.sm\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-transparent{border-color:transparent}.group:hover .sm\:group-hover\:border-current{border-color:currentColor}.group:hover .sm\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:focus-within\:border-transparent:focus-within{border-color:transparent}.sm\:focus-within\:border-current:focus-within{border-color:currentColor}.sm\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:hover\:border-transparent:hover{border-color:transparent}.sm\:hover\:border-current:hover{border-color:currentColor}.sm\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:focus\:border-transparent:focus{border-color:transparent}.sm\:focus\:border-current:focus{border-color:currentColor}.sm\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:border-opacity-0{--tw-border-opacity:0}.sm\:border-opacity-5{--tw-border-opacity:0.05}.sm\:border-opacity-10{--tw-border-opacity:0.1}.sm\:border-opacity-20{--tw-border-opacity:0.2}.sm\:border-opacity-25{--tw-border-opacity:0.25}.sm\:border-opacity-30{--tw-border-opacity:0.3}.sm\:border-opacity-40{--tw-border-opacity:0.4}.sm\:border-opacity-50{--tw-border-opacity:0.5}.sm\:border-opacity-60{--tw-border-opacity:0.6}.sm\:border-opacity-70{--tw-border-opacity:0.7}.sm\:border-opacity-75{--tw-border-opacity:0.75}.sm\:border-opacity-80{--tw-border-opacity:0.8}.sm\:border-opacity-90{--tw-border-opacity:0.9}.sm\:border-opacity-95{--tw-border-opacity:0.95}.sm\:border-opacity-100{--tw-border-opacity:1}.group:hover .sm\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .sm\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .sm\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .sm\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .sm\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .sm\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .sm\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .sm\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .sm\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .sm\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .sm\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .sm\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .sm\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .sm\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .sm\:group-hover\:border-opacity-100{--tw-border-opacity:1}.sm\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.sm\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.sm\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.sm\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.sm\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.sm\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.sm\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.sm\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.sm\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.sm\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.sm\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.sm\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.sm\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.sm\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.sm\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.sm\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.sm\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.sm\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.sm\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.sm\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.sm\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.sm\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.sm\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.sm\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.sm\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.sm\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.sm\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.sm\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.sm\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.sm\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.sm\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.sm\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.sm\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.sm\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.sm\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.sm\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.sm\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.sm\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.sm\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.sm\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.sm\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.sm\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.sm\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.sm\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.sm\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.sm\:bg-transparent{background-color:initial}.sm\:bg-current{background-color:currentColor}.sm\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-transparent{background-color:initial}.group:hover .sm\:group-hover\:bg-current{background-color:currentColor}.group:hover .sm\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:focus-within\:bg-transparent:focus-within{background-color:initial}.sm\:focus-within\:bg-current:focus-within{background-color:currentColor}.sm\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:hover\:bg-transparent:hover{background-color:initial}.sm\:hover\:bg-current:hover{background-color:currentColor}.sm\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:focus\:bg-transparent:focus{background-color:initial}.sm\:focus\:bg-current:focus{background-color:currentColor}.sm\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:bg-opacity-0{--tw-bg-opacity:0}.sm\:bg-opacity-5{--tw-bg-opacity:0.05}.sm\:bg-opacity-10{--tw-bg-opacity:0.1}.sm\:bg-opacity-20{--tw-bg-opacity:0.2}.sm\:bg-opacity-25{--tw-bg-opacity:0.25}.sm\:bg-opacity-30{--tw-bg-opacity:0.3}.sm\:bg-opacity-40{--tw-bg-opacity:0.4}.sm\:bg-opacity-50{--tw-bg-opacity:0.5}.sm\:bg-opacity-60{--tw-bg-opacity:0.6}.sm\:bg-opacity-70{--tw-bg-opacity:0.7}.sm\:bg-opacity-75{--tw-bg-opacity:0.75}.sm\:bg-opacity-80{--tw-bg-opacity:0.8}.sm\:bg-opacity-90{--tw-bg-opacity:0.9}.sm\:bg-opacity-95{--tw-bg-opacity:0.95}.sm\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .sm\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .sm\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .sm\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .sm\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .sm\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .sm\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .sm\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .sm\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .sm\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .sm\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .sm\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .sm\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .sm\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .sm\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .sm\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.sm\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.sm\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.sm\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.sm\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.sm\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.sm\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.sm\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.sm\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.sm\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.sm\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.sm\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.sm\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.sm\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.sm\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.sm\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.sm\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.sm\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.sm\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.sm\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.sm\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.sm\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.sm\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.sm\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.sm\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.sm\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.sm\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.sm\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.sm\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.sm\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.sm\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.sm\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.sm\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.sm\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.sm\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.sm\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.sm\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.sm\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.sm\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.sm\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.sm\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.sm\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.sm\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.sm\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.sm\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.sm\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.sm\:bg-none{background-image:none}.sm\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.sm\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.sm\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.sm\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.sm\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.sm\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.sm\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.sm\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.sm\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.sm\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.sm\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.sm\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.sm\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.sm\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.sm\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:to-transparent{--tw-gradient-to:transparent}.sm\:to-current{--tw-gradient-to:currentColor}.sm\:to-black{--tw-gradient-to:#000}.sm\:to-white{--tw-gradient-to:#fff}.sm\:to-gray-50{--tw-gradient-to:#f9fafb}.sm\:to-gray-100{--tw-gradient-to:#f3f4f6}.sm\:to-gray-200{--tw-gradient-to:#e5e7eb}.sm\:to-gray-300{--tw-gradient-to:#d1d5db}.sm\:to-gray-400{--tw-gradient-to:#9ca3af}.sm\:to-gray-500{--tw-gradient-to:#6b7280}.sm\:to-gray-600{--tw-gradient-to:#4b5563}.sm\:to-gray-700{--tw-gradient-to:#374151}.sm\:to-gray-800{--tw-gradient-to:#1f2937}.sm\:to-gray-900{--tw-gradient-to:#111827}.sm\:to-red-50{--tw-gradient-to:#fef2f2}.sm\:to-red-100{--tw-gradient-to:#fee2e2}.sm\:to-red-200{--tw-gradient-to:#fecaca}.sm\:to-red-300{--tw-gradient-to:#fca5a5}.sm\:to-red-400{--tw-gradient-to:#f87171}.sm\:to-red-500{--tw-gradient-to:#ef4444}.sm\:to-red-600{--tw-gradient-to:#dc2626}.sm\:to-red-700{--tw-gradient-to:#b91c1c}.sm\:to-red-800{--tw-gradient-to:#991b1b}.sm\:to-red-900{--tw-gradient-to:#7f1d1d}.sm\:to-yellow-50{--tw-gradient-to:#fffbeb}.sm\:to-yellow-100{--tw-gradient-to:#fef3c7}.sm\:to-yellow-200{--tw-gradient-to:#fde68a}.sm\:to-yellow-300{--tw-gradient-to:#fcd34d}.sm\:to-yellow-400{--tw-gradient-to:#fbbf24}.sm\:to-yellow-500{--tw-gradient-to:#f59e0b}.sm\:to-yellow-600{--tw-gradient-to:#d97706}.sm\:to-yellow-700{--tw-gradient-to:#b45309}.sm\:to-yellow-800{--tw-gradient-to:#92400e}.sm\:to-yellow-900{--tw-gradient-to:#78350f}.sm\:to-green-50{--tw-gradient-to:#ecfdf5}.sm\:to-green-100{--tw-gradient-to:#d1fae5}.sm\:to-green-200{--tw-gradient-to:#a7f3d0}.sm\:to-green-300{--tw-gradient-to:#6ee7b7}.sm\:to-green-400{--tw-gradient-to:#34d399}.sm\:to-green-500{--tw-gradient-to:#10b981}.sm\:to-green-600{--tw-gradient-to:#059669}.sm\:to-green-700{--tw-gradient-to:#047857}.sm\:to-green-800{--tw-gradient-to:#065f46}.sm\:to-green-900{--tw-gradient-to:#064e3b}.sm\:to-blue-50{--tw-gradient-to:#eff6ff}.sm\:to-blue-100{--tw-gradient-to:#dbeafe}.sm\:to-blue-200{--tw-gradient-to:#bfdbfe}.sm\:to-blue-300{--tw-gradient-to:#93c5fd}.sm\:to-blue-400{--tw-gradient-to:#60a5fa}.sm\:to-blue-500{--tw-gradient-to:#3b82f6}.sm\:to-blue-600{--tw-gradient-to:#2563eb}.sm\:to-blue-700{--tw-gradient-to:#1d4ed8}.sm\:to-blue-800{--tw-gradient-to:#1e40af}.sm\:to-blue-900{--tw-gradient-to:#1e3a8a}.sm\:to-indigo-50{--tw-gradient-to:#eef2ff}.sm\:to-indigo-100{--tw-gradient-to:#e0e7ff}.sm\:to-indigo-200{--tw-gradient-to:#c7d2fe}.sm\:to-indigo-300{--tw-gradient-to:#a5b4fc}.sm\:to-indigo-400{--tw-gradient-to:#818cf8}.sm\:to-indigo-500{--tw-gradient-to:#6366f1}.sm\:to-indigo-600{--tw-gradient-to:#4f46e5}.sm\:to-indigo-700{--tw-gradient-to:#4338ca}.sm\:to-indigo-800{--tw-gradient-to:#3730a3}.sm\:to-indigo-900{--tw-gradient-to:#312e81}.sm\:to-purple-50{--tw-gradient-to:#f5f3ff}.sm\:to-purple-100{--tw-gradient-to:#ede9fe}.sm\:to-purple-200{--tw-gradient-to:#ddd6fe}.sm\:to-purple-300{--tw-gradient-to:#c4b5fd}.sm\:to-purple-400{--tw-gradient-to:#a78bfa}.sm\:to-purple-500{--tw-gradient-to:#8b5cf6}.sm\:to-purple-600{--tw-gradient-to:#7c3aed}.sm\:to-purple-700{--tw-gradient-to:#6d28d9}.sm\:to-purple-800{--tw-gradient-to:#5b21b6}.sm\:to-purple-900{--tw-gradient-to:#4c1d95}.sm\:to-pink-50{--tw-gradient-to:#fdf2f8}.sm\:to-pink-100{--tw-gradient-to:#fce7f3}.sm\:to-pink-200{--tw-gradient-to:#fbcfe8}.sm\:to-pink-300{--tw-gradient-to:#f9a8d4}.sm\:to-pink-400{--tw-gradient-to:#f472b6}.sm\:to-pink-500{--tw-gradient-to:#ec4899}.sm\:to-pink-600{--tw-gradient-to:#db2777}.sm\:to-pink-700{--tw-gradient-to:#be185d}.sm\:to-pink-800{--tw-gradient-to:#9d174d}.sm\:to-pink-900{--tw-gradient-to:#831843}.sm\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.sm\:hover\:to-current:hover{--tw-gradient-to:currentColor}.sm\:hover\:to-black:hover{--tw-gradient-to:#000}.sm\:hover\:to-white:hover{--tw-gradient-to:#fff}.sm\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.sm\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.sm\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.sm\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.sm\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.sm\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.sm\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.sm\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.sm\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.sm\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.sm\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.sm\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.sm\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.sm\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.sm\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.sm\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.sm\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.sm\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.sm\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.sm\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.sm\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.sm\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.sm\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.sm\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.sm\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.sm\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.sm\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.sm\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.sm\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.sm\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.sm\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.sm\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.sm\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.sm\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.sm\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.sm\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.sm\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.sm\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.sm\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.sm\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.sm\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.sm\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.sm\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.sm\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.sm\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.sm\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.sm\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.sm\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.sm\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.sm\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.sm\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.sm\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.sm\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.sm\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.sm\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.sm\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.sm\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.sm\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.sm\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.sm\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.sm\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.sm\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.sm\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.sm\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.sm\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.sm\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.sm\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.sm\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.sm\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.sm\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.sm\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.sm\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.sm\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.sm\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.sm\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.sm\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.sm\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.sm\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.sm\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.sm\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.sm\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.sm\:focus\:to-current:focus{--tw-gradient-to:currentColor}.sm\:focus\:to-black:focus{--tw-gradient-to:#000}.sm\:focus\:to-white:focus{--tw-gradient-to:#fff}.sm\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.sm\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.sm\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.sm\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.sm\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.sm\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.sm\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.sm\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.sm\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.sm\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.sm\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.sm\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.sm\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.sm\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.sm\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.sm\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.sm\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.sm\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.sm\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.sm\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.sm\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.sm\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.sm\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.sm\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.sm\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.sm\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.sm\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.sm\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.sm\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.sm\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.sm\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.sm\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.sm\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.sm\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.sm\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.sm\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.sm\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.sm\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.sm\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.sm\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.sm\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.sm\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.sm\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.sm\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.sm\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.sm\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.sm\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.sm\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.sm\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.sm\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.sm\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.sm\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.sm\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.sm\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.sm\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.sm\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.sm\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.sm\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.sm\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.sm\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.sm\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.sm\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.sm\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.sm\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.sm\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.sm\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.sm\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.sm\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.sm\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.sm\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.sm\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.sm\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.sm\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.sm\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.sm\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.sm\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.sm\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.sm\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.sm\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.sm\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.sm\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.sm\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.sm\:bg-auto{background-size:auto}.sm\:bg-cover{background-size:cover}.sm\:bg-contain{background-size:contain}.sm\:bg-fixed{background-attachment:fixed}.sm\:bg-local{background-attachment:local}.sm\:bg-scroll{background-attachment:scroll}.sm\:bg-clip-border{background-clip:initial}.sm\:bg-clip-padding{background-clip:padding-box}.sm\:bg-clip-content{background-clip:content-box}.sm\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.sm\:bg-bottom{background-position:bottom}.sm\:bg-center{background-position:50%}.sm\:bg-left{background-position:0}.sm\:bg-left-bottom{background-position:0 100%}.sm\:bg-left-top{background-position:0 0}.sm\:bg-right{background-position:100%}.sm\:bg-right-bottom{background-position:100% 100%}.sm\:bg-right-top{background-position:100% 0}.sm\:bg-top{background-position:top}.sm\:bg-repeat{background-repeat:repeat}.sm\:bg-no-repeat{background-repeat:no-repeat}.sm\:bg-repeat-x{background-repeat:repeat-x}.sm\:bg-repeat-y{background-repeat:repeat-y}.sm\:bg-repeat-round{background-repeat:round}.sm\:bg-repeat-space{background-repeat:space}.sm\:bg-origin-border{background-origin:border-box}.sm\:bg-origin-padding{background-origin:initial}.sm\:bg-origin-content{background-origin:content-box}.sm\:fill-current{fill:currentColor}.sm\:stroke-current{stroke:currentColor}.sm\:stroke-0{stroke-width:0}.sm\:stroke-1{stroke-width:1}.sm\:stroke-2{stroke-width:2}.sm\:object-contain{-o-object-fit:contain;object-fit:contain}.sm\:object-cover{-o-object-fit:cover;object-fit:cover}.sm\:object-fill{-o-object-fit:fill;object-fit:fill}.sm\:object-none{-o-object-fit:none;object-fit:none}.sm\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.sm\:object-bottom{-o-object-position:bottom;object-position:bottom}.sm\:object-center{-o-object-position:center;object-position:center}.sm\:object-left{-o-object-position:left;object-position:left}.sm\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.sm\:object-left-top{-o-object-position:left top;object-position:left top}.sm\:object-right{-o-object-position:right;object-position:right}.sm\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.sm\:object-right-top{-o-object-position:right top;object-position:right top}.sm\:object-top{-o-object-position:top;object-position:top}.sm\:p-0{padding:0}.sm\:p-1{padding:.25rem}.sm\:p-2{padding:.5rem}.sm\:p-3{padding:.75rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:p-7{padding:1.75rem}.sm\:p-8{padding:2rem}.sm\:p-9{padding:2.25rem}.sm\:p-10{padding:2.5rem}.sm\:p-11{padding:2.75rem}.sm\:p-12{padding:3rem}.sm\:p-14{padding:3.5rem}.sm\:p-16{padding:4rem}.sm\:p-20{padding:5rem}.sm\:p-24{padding:6rem}.sm\:p-28{padding:7rem}.sm\:p-32{padding:8rem}.sm\:p-36{padding:9rem}.sm\:p-40{padding:10rem}.sm\:p-44{padding:11rem}.sm\:p-48{padding:12rem}.sm\:p-52{padding:13rem}.sm\:p-56{padding:14rem}.sm\:p-60{padding:15rem}.sm\:p-64{padding:16rem}.sm\:p-72{padding:18rem}.sm\:p-80{padding:20rem}.sm\:p-96{padding:24rem}.sm\:p-px{padding:1px}.sm\:p-0\.5{padding:.125rem}.sm\:p-1\.5{padding:.375rem}.sm\:p-2\.5{padding:.625rem}.sm\:p-3\.5{padding:.875rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-1{padding-left:.25rem;padding-right:.25rem}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-7{padding-left:1.75rem;padding-right:1.75rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:px-9{padding-left:2.25rem;padding-right:2.25rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-11{padding-left:2.75rem;padding-right:2.75rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-14{padding-left:3.5rem;padding-right:3.5rem}.sm\:px-16{padding-left:4rem;padding-right:4rem}.sm\:px-20{padding-left:5rem;padding-right:5rem}.sm\:px-24{padding-left:6rem;padding-right:6rem}.sm\:px-28{padding-left:7rem;padding-right:7rem}.sm\:px-32{padding-left:8rem;padding-right:8rem}.sm\:px-36{padding-left:9rem;padding-right:9rem}.sm\:px-40{padding-left:10rem;padding-right:10rem}.sm\:px-44{padding-left:11rem;padding-right:11rem}.sm\:px-48{padding-left:12rem;padding-right:12rem}.sm\:px-52{padding-left:13rem;padding-right:13rem}.sm\:px-56{padding-left:14rem;padding-right:14rem}.sm\:px-60{padding-left:15rem;padding-right:15rem}.sm\:px-64{padding-left:16rem;padding-right:16rem}.sm\:px-72{padding-left:18rem;padding-right:18rem}.sm\:px-80{padding-left:20rem;padding-right:20rem}.sm\:px-96{padding-left:24rem;padding-right:24rem}.sm\:px-px{padding-left:1px;padding-right:1px}.sm\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.sm\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.sm\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.sm\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:py-1{padding-top:.25rem;padding-bottom:.25rem}.sm\:py-2{padding-top:.5rem;padding-bottom:.5rem}.sm\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\:py-4{padding-top:1rem;padding-bottom:1rem}.sm\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.sm\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.sm\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:py-20{padding-top:5rem;padding-bottom:5rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-32{padding-top:8rem;padding-bottom:8rem}.sm\:py-36{padding-top:9rem;padding-bottom:9rem}.sm\:py-40{padding-top:10rem;padding-bottom:10rem}.sm\:py-44{padding-top:11rem;padding-bottom:11rem}.sm\:py-48{padding-top:12rem;padding-bottom:12rem}.sm\:py-52{padding-top:13rem;padding-bottom:13rem}.sm\:py-56{padding-top:14rem;padding-bottom:14rem}.sm\:py-60{padding-top:15rem;padding-bottom:15rem}.sm\:py-64{padding-top:16rem;padding-bottom:16rem}.sm\:py-72{padding-top:18rem;padding-bottom:18rem}.sm\:py-80{padding-top:20rem;padding-bottom:20rem}.sm\:py-96{padding-top:24rem;padding-bottom:24rem}.sm\:py-px{padding-top:1px;padding-bottom:1px}.sm\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.sm\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.sm\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.sm\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.sm\:pt-0{padding-top:0}.sm\:pt-1{padding-top:.25rem}.sm\:pt-2{padding-top:.5rem}.sm\:pt-3{padding-top:.75rem}.sm\:pt-4{padding-top:1rem}.sm\:pt-5{padding-top:1.25rem}.sm\:pt-6{padding-top:1.5rem}.sm\:pt-7{padding-top:1.75rem}.sm\:pt-8{padding-top:2rem}.sm\:pt-9{padding-top:2.25rem}.sm\:pt-10{padding-top:2.5rem}.sm\:pt-11{padding-top:2.75rem}.sm\:pt-12{padding-top:3rem}.sm\:pt-14{padding-top:3.5rem}.sm\:pt-16{padding-top:4rem}.sm\:pt-20{padding-top:5rem}.sm\:pt-24{padding-top:6rem}.sm\:pt-28{padding-top:7rem}.sm\:pt-32{padding-top:8rem}.sm\:pt-36{padding-top:9rem}.sm\:pt-40{padding-top:10rem}.sm\:pt-44{padding-top:11rem}.sm\:pt-48{padding-top:12rem}.sm\:pt-52{padding-top:13rem}.sm\:pt-56{padding-top:14rem}.sm\:pt-60{padding-top:15rem}.sm\:pt-64{padding-top:16rem}.sm\:pt-72{padding-top:18rem}.sm\:pt-80{padding-top:20rem}.sm\:pt-96{padding-top:24rem}.sm\:pt-px{padding-top:1px}.sm\:pt-0\.5{padding-top:.125rem}.sm\:pt-1\.5{padding-top:.375rem}.sm\:pt-2\.5{padding-top:.625rem}.sm\:pt-3\.5{padding-top:.875rem}.sm\:pr-0{padding-right:0}.sm\:pr-1{padding-right:.25rem}.sm\:pr-2{padding-right:.5rem}.sm\:pr-3{padding-right:.75rem}.sm\:pr-4{padding-right:1rem}.sm\:pr-5{padding-right:1.25rem}.sm\:pr-6{padding-right:1.5rem}.sm\:pr-7{padding-right:1.75rem}.sm\:pr-8{padding-right:2rem}.sm\:pr-9{padding-right:2.25rem}.sm\:pr-10{padding-right:2.5rem}.sm\:pr-11{padding-right:2.75rem}.sm\:pr-12{padding-right:3rem}.sm\:pr-14{padding-right:3.5rem}.sm\:pr-16{padding-right:4rem}.sm\:pr-20{padding-right:5rem}.sm\:pr-24{padding-right:6rem}.sm\:pr-28{padding-right:7rem}.sm\:pr-32{padding-right:8rem}.sm\:pr-36{padding-right:9rem}.sm\:pr-40{padding-right:10rem}.sm\:pr-44{padding-right:11rem}.sm\:pr-48{padding-right:12rem}.sm\:pr-52{padding-right:13rem}.sm\:pr-56{padding-right:14rem}.sm\:pr-60{padding-right:15rem}.sm\:pr-64{padding-right:16rem}.sm\:pr-72{padding-right:18rem}.sm\:pr-80{padding-right:20rem}.sm\:pr-96{padding-right:24rem}.sm\:pr-px{padding-right:1px}.sm\:pr-0\.5{padding-right:.125rem}.sm\:pr-1\.5{padding-right:.375rem}.sm\:pr-2\.5{padding-right:.625rem}.sm\:pr-3\.5{padding-right:.875rem}.sm\:pb-0{padding-bottom:0}.sm\:pb-1{padding-bottom:.25rem}.sm\:pb-2{padding-bottom:.5rem}.sm\:pb-3{padding-bottom:.75rem}.sm\:pb-4{padding-bottom:1rem}.sm\:pb-5{padding-bottom:1.25rem}.sm\:pb-6{padding-bottom:1.5rem}.sm\:pb-7{padding-bottom:1.75rem}.sm\:pb-8{padding-bottom:2rem}.sm\:pb-9{padding-bottom:2.25rem}.sm\:pb-10{padding-bottom:2.5rem}.sm\:pb-11{padding-bottom:2.75rem}.sm\:pb-12{padding-bottom:3rem}.sm\:pb-14{padding-bottom:3.5rem}.sm\:pb-16{padding-bottom:4rem}.sm\:pb-20{padding-bottom:5rem}.sm\:pb-24{padding-bottom:6rem}.sm\:pb-28{padding-bottom:7rem}.sm\:pb-32{padding-bottom:8rem}.sm\:pb-36{padding-bottom:9rem}.sm\:pb-40{padding-bottom:10rem}.sm\:pb-44{padding-bottom:11rem}.sm\:pb-48{padding-bottom:12rem}.sm\:pb-52{padding-bottom:13rem}.sm\:pb-56{padding-bottom:14rem}.sm\:pb-60{padding-bottom:15rem}.sm\:pb-64{padding-bottom:16rem}.sm\:pb-72{padding-bottom:18rem}.sm\:pb-80{padding-bottom:20rem}.sm\:pb-96{padding-bottom:24rem}.sm\:pb-px{padding-bottom:1px}.sm\:pb-0\.5{padding-bottom:.125rem}.sm\:pb-1\.5{padding-bottom:.375rem}.sm\:pb-2\.5{padding-bottom:.625rem}.sm\:pb-3\.5{padding-bottom:.875rem}.sm\:pl-0{padding-left:0}.sm\:pl-1{padding-left:.25rem}.sm\:pl-2{padding-left:.5rem}.sm\:pl-3{padding-left:.75rem}.sm\:pl-4{padding-left:1rem}.sm\:pl-5{padding-left:1.25rem}.sm\:pl-6{padding-left:1.5rem}.sm\:pl-7{padding-left:1.75rem}.sm\:pl-8{padding-left:2rem}.sm\:pl-9{padding-left:2.25rem}.sm\:pl-10{padding-left:2.5rem}.sm\:pl-11{padding-left:2.75rem}.sm\:pl-12{padding-left:3rem}.sm\:pl-14{padding-left:3.5rem}.sm\:pl-16{padding-left:4rem}.sm\:pl-20{padding-left:5rem}.sm\:pl-24{padding-left:6rem}.sm\:pl-28{padding-left:7rem}.sm\:pl-32{padding-left:8rem}.sm\:pl-36{padding-left:9rem}.sm\:pl-40{padding-left:10rem}.sm\:pl-44{padding-left:11rem}.sm\:pl-48{padding-left:12rem}.sm\:pl-52{padding-left:13rem}.sm\:pl-56{padding-left:14rem}.sm\:pl-60{padding-left:15rem}.sm\:pl-64{padding-left:16rem}.sm\:pl-72{padding-left:18rem}.sm\:pl-80{padding-left:20rem}.sm\:pl-96{padding-left:24rem}.sm\:pl-px{padding-left:1px}.sm\:pl-0\.5{padding-left:.125rem}.sm\:pl-1\.5{padding-left:.375rem}.sm\:pl-2\.5{padding-left:.625rem}.sm\:pl-3\.5{padding-left:.875rem}.sm\:text-left{text-align:left}.sm\:text-center{text-align:center}.sm\:text-right{text-align:right}.sm\:text-justify{text-align:justify}.sm\:align-baseline{vertical-align:initial}.sm\:align-top{vertical-align:top}.sm\:align-middle{vertical-align:middle}.sm\:align-bottom{vertical-align:bottom}.sm\:align-text-top{vertical-align:text-top}.sm\:align-text-bottom{vertical-align:text-bottom}.sm\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.sm\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.sm\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.sm\:text-xs{font-size:.75rem;line-height:1rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-7xl{font-size:4.5rem;line-height:1}.sm\:text-8xl{font-size:6rem;line-height:1}.sm\:text-9xl{font-size:8rem;line-height:1}.sm\:font-thin{font-weight:100}.sm\:font-extralight{font-weight:200}.sm\:font-light{font-weight:300}.sm\:font-normal{font-weight:400}.sm\:font-medium{font-weight:500}.sm\:font-semibold{font-weight:600}.sm\:font-bold{font-weight:700}.sm\:font-extrabold{font-weight:800}.sm\:font-black{font-weight:900}.sm\:uppercase{text-transform:uppercase}.sm\:lowercase{text-transform:lowercase}.sm\:capitalize{text-transform:capitalize}.sm\:normal-case{text-transform:none}.sm\:italic{font-style:italic}.sm\:not-italic{font-style:normal}.sm\:diagonal-fractions,.sm\:lining-nums,.sm\:oldstyle-nums,.sm\:ordinal,.sm\:proportional-nums,.sm\:slashed-zero,.sm\:stacked-fractions,.sm\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.sm\:normal-nums{font-variant-numeric:normal}.sm\:ordinal{--tw-ordinal:ordinal}.sm\:slashed-zero{--tw-slashed-zero:slashed-zero}.sm\:lining-nums{--tw-numeric-figure:lining-nums}.sm\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.sm\:proportional-nums{--tw-numeric-spacing:proportional-nums}.sm\:tabular-nums{--tw-numeric-spacing:tabular-nums}.sm\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.sm\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.sm\:leading-3{line-height:.75rem}.sm\:leading-4{line-height:1rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-8{line-height:2rem}.sm\:leading-9{line-height:2.25rem}.sm\:leading-10{line-height:2.5rem}.sm\:leading-none{line-height:1}.sm\:leading-tight{line-height:1.25}.sm\:leading-snug{line-height:1.375}.sm\:leading-normal{line-height:1.5}.sm\:leading-relaxed{line-height:1.625}.sm\:leading-loose{line-height:2}.sm\:tracking-tighter{letter-spacing:-.05em}.sm\:tracking-tight{letter-spacing:-.025em}.sm\:tracking-normal{letter-spacing:0}.sm\:tracking-wide{letter-spacing:.025em}.sm\:tracking-wider{letter-spacing:.05em}.sm\:tracking-widest{letter-spacing:.1em}.sm\:text-transparent{color:transparent}.sm\:text-current{color:currentColor}.sm\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-transparent{color:transparent}.group:hover .sm\:group-hover\:text-current{color:currentColor}.group:hover .sm\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:focus-within\:text-transparent:focus-within{color:transparent}.sm\:focus-within\:text-current:focus-within{color:currentColor}.sm\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:hover\:text-transparent:hover{color:transparent}.sm\:hover\:text-current:hover{color:currentColor}.sm\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:focus\:text-transparent:focus{color:transparent}.sm\:focus\:text-current:focus{color:currentColor}.sm\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:text-opacity-0{--tw-text-opacity:0}.sm\:text-opacity-5{--tw-text-opacity:0.05}.sm\:text-opacity-10{--tw-text-opacity:0.1}.sm\:text-opacity-20{--tw-text-opacity:0.2}.sm\:text-opacity-25{--tw-text-opacity:0.25}.sm\:text-opacity-30{--tw-text-opacity:0.3}.sm\:text-opacity-40{--tw-text-opacity:0.4}.sm\:text-opacity-50{--tw-text-opacity:0.5}.sm\:text-opacity-60{--tw-text-opacity:0.6}.sm\:text-opacity-70{--tw-text-opacity:0.7}.sm\:text-opacity-75{--tw-text-opacity:0.75}.sm\:text-opacity-80{--tw-text-opacity:0.8}.sm\:text-opacity-90{--tw-text-opacity:0.9}.sm\:text-opacity-95{--tw-text-opacity:0.95}.sm\:text-opacity-100{--tw-text-opacity:1}.group:hover .sm\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .sm\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .sm\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .sm\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .sm\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .sm\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .sm\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .sm\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .sm\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .sm\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .sm\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .sm\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .sm\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .sm\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .sm\:group-hover\:text-opacity-100{--tw-text-opacity:1}.sm\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.sm\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.sm\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.sm\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.sm\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.sm\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.sm\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.sm\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.sm\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.sm\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.sm\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.sm\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.sm\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.sm\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.sm\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.sm\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.sm\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.sm\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.sm\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.sm\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.sm\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.sm\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.sm\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.sm\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.sm\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.sm\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.sm\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.sm\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.sm\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.sm\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.sm\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.sm\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.sm\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.sm\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.sm\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.sm\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.sm\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.sm\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.sm\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.sm\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.sm\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.sm\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.sm\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.sm\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.sm\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.sm\:underline{text-decoration:underline}.sm\:line-through{text-decoration:line-through}.sm\:no-underline{text-decoration:none}.group:hover .sm\:group-hover\:underline{text-decoration:underline}.group:hover .sm\:group-hover\:line-through{text-decoration:line-through}.group:hover .sm\:group-hover\:no-underline{text-decoration:none}.sm\:focus-within\:underline:focus-within{text-decoration:underline}.sm\:focus-within\:line-through:focus-within{text-decoration:line-through}.sm\:focus-within\:no-underline:focus-within{text-decoration:none}.sm\:hover\:underline:hover{text-decoration:underline}.sm\:hover\:line-through:hover{text-decoration:line-through}.sm\:hover\:no-underline:hover{text-decoration:none}.sm\:focus\:underline:focus{text-decoration:underline}.sm\:focus\:line-through:focus{text-decoration:line-through}.sm\:focus\:no-underline:focus{text-decoration:none}.sm\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sm\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.sm\:placeholder-transparent::-moz-placeholder{color:transparent}.sm\:placeholder-transparent:-ms-input-placeholder{color:transparent}.sm\:placeholder-transparent::placeholder{color:transparent}.sm\:placeholder-current::-moz-placeholder{color:currentColor}.sm\:placeholder-current:-ms-input-placeholder{color:currentColor}.sm\:placeholder-current::placeholder{color:currentColor}.sm\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.sm\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus::placeholder{color:currentColor}.sm\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.sm\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.sm\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.sm\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.sm\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.sm\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.sm\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.sm\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.sm\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.sm\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.sm\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.sm\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.sm\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.sm\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.sm\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.sm\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.sm\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.sm\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.sm\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.sm\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.sm\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.sm\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.sm\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.sm\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.sm\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.sm\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.sm\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.sm\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.sm\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.sm\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.sm\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.sm\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.sm\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.sm\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.sm\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.sm\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.sm\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.sm\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.sm\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.sm\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.sm\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.sm\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.sm\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.sm\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.sm\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.sm\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.sm\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.sm\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.sm\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.sm\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.sm\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.sm\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.sm\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.sm\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.sm\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.sm\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.sm\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.sm\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.sm\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.sm\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.sm\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.sm\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.sm\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.sm\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.sm\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.sm\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.sm\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.sm\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.sm\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.sm\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.sm\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.sm\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.sm\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.sm\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.sm\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.sm\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.sm\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.sm\:opacity-0{opacity:0}.sm\:opacity-5{opacity:.05}.sm\:opacity-10{opacity:.1}.sm\:opacity-20{opacity:.2}.sm\:opacity-25{opacity:.25}.sm\:opacity-30{opacity:.3}.sm\:opacity-40{opacity:.4}.sm\:opacity-50{opacity:.5}.sm\:opacity-60{opacity:.6}.sm\:opacity-70{opacity:.7}.sm\:opacity-75{opacity:.75}.sm\:opacity-80{opacity:.8}.sm\:opacity-90{opacity:.9}.sm\:opacity-95{opacity:.95}.sm\:opacity-100{opacity:1}.group:hover .sm\:group-hover\:opacity-0{opacity:0}.group:hover .sm\:group-hover\:opacity-5{opacity:.05}.group:hover .sm\:group-hover\:opacity-10{opacity:.1}.group:hover .sm\:group-hover\:opacity-20{opacity:.2}.group:hover .sm\:group-hover\:opacity-25{opacity:.25}.group:hover .sm\:group-hover\:opacity-30{opacity:.3}.group:hover .sm\:group-hover\:opacity-40{opacity:.4}.group:hover .sm\:group-hover\:opacity-50{opacity:.5}.group:hover .sm\:group-hover\:opacity-60{opacity:.6}.group:hover .sm\:group-hover\:opacity-70{opacity:.7}.group:hover .sm\:group-hover\:opacity-75{opacity:.75}.group:hover .sm\:group-hover\:opacity-80{opacity:.8}.group:hover .sm\:group-hover\:opacity-90{opacity:.9}.group:hover .sm\:group-hover\:opacity-95{opacity:.95}.group:hover .sm\:group-hover\:opacity-100{opacity:1}.sm\:focus-within\:opacity-0:focus-within{opacity:0}.sm\:focus-within\:opacity-5:focus-within{opacity:.05}.sm\:focus-within\:opacity-10:focus-within{opacity:.1}.sm\:focus-within\:opacity-20:focus-within{opacity:.2}.sm\:focus-within\:opacity-25:focus-within{opacity:.25}.sm\:focus-within\:opacity-30:focus-within{opacity:.3}.sm\:focus-within\:opacity-40:focus-within{opacity:.4}.sm\:focus-within\:opacity-50:focus-within{opacity:.5}.sm\:focus-within\:opacity-60:focus-within{opacity:.6}.sm\:focus-within\:opacity-70:focus-within{opacity:.7}.sm\:focus-within\:opacity-75:focus-within{opacity:.75}.sm\:focus-within\:opacity-80:focus-within{opacity:.8}.sm\:focus-within\:opacity-90:focus-within{opacity:.9}.sm\:focus-within\:opacity-95:focus-within{opacity:.95}.sm\:focus-within\:opacity-100:focus-within{opacity:1}.sm\:hover\:opacity-0:hover{opacity:0}.sm\:hover\:opacity-5:hover{opacity:.05}.sm\:hover\:opacity-10:hover{opacity:.1}.sm\:hover\:opacity-20:hover{opacity:.2}.sm\:hover\:opacity-25:hover{opacity:.25}.sm\:hover\:opacity-30:hover{opacity:.3}.sm\:hover\:opacity-40:hover{opacity:.4}.sm\:hover\:opacity-50:hover{opacity:.5}.sm\:hover\:opacity-60:hover{opacity:.6}.sm\:hover\:opacity-70:hover{opacity:.7}.sm\:hover\:opacity-75:hover{opacity:.75}.sm\:hover\:opacity-80:hover{opacity:.8}.sm\:hover\:opacity-90:hover{opacity:.9}.sm\:hover\:opacity-95:hover{opacity:.95}.sm\:hover\:opacity-100:hover{opacity:1}.sm\:focus\:opacity-0:focus{opacity:0}.sm\:focus\:opacity-5:focus{opacity:.05}.sm\:focus\:opacity-10:focus{opacity:.1}.sm\:focus\:opacity-20:focus{opacity:.2}.sm\:focus\:opacity-25:focus{opacity:.25}.sm\:focus\:opacity-30:focus{opacity:.3}.sm\:focus\:opacity-40:focus{opacity:.4}.sm\:focus\:opacity-50:focus{opacity:.5}.sm\:focus\:opacity-60:focus{opacity:.6}.sm\:focus\:opacity-70:focus{opacity:.7}.sm\:focus\:opacity-75:focus{opacity:.75}.sm\:focus\:opacity-80:focus{opacity:.8}.sm\:focus\:opacity-90:focus{opacity:.9}.sm\:focus\:opacity-95:focus{opacity:.95}.sm\:focus\:opacity-100:focus{opacity:1}.sm\:bg-blend-normal{background-blend-mode:normal}.sm\:bg-blend-multiply{background-blend-mode:multiply}.sm\:bg-blend-screen{background-blend-mode:screen}.sm\:bg-blend-overlay{background-blend-mode:overlay}.sm\:bg-blend-darken{background-blend-mode:darken}.sm\:bg-blend-lighten{background-blend-mode:lighten}.sm\:bg-blend-color-dodge{background-blend-mode:color-dodge}.sm\:bg-blend-color-burn{background-blend-mode:color-burn}.sm\:bg-blend-hard-light{background-blend-mode:hard-light}.sm\:bg-blend-soft-light{background-blend-mode:soft-light}.sm\:bg-blend-difference{background-blend-mode:difference}.sm\:bg-blend-exclusion{background-blend-mode:exclusion}.sm\:bg-blend-hue{background-blend-mode:hue}.sm\:bg-blend-saturation{background-blend-mode:saturation}.sm\:bg-blend-color{background-blend-mode:color}.sm\:bg-blend-luminosity{background-blend-mode:luminosity}.sm\:mix-blend-normal{mix-blend-mode:normal}.sm\:mix-blend-multiply{mix-blend-mode:multiply}.sm\:mix-blend-screen{mix-blend-mode:screen}.sm\:mix-blend-overlay{mix-blend-mode:overlay}.sm\:mix-blend-darken{mix-blend-mode:darken}.sm\:mix-blend-lighten{mix-blend-mode:lighten}.sm\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.sm\:mix-blend-color-burn{mix-blend-mode:color-burn}.sm\:mix-blend-hard-light{mix-blend-mode:hard-light}.sm\:mix-blend-soft-light{mix-blend-mode:soft-light}.sm\:mix-blend-difference{mix-blend-mode:difference}.sm\:mix-blend-exclusion{mix-blend-mode:exclusion}.sm\:mix-blend-hue{mix-blend-mode:hue}.sm\:mix-blend-saturation{mix-blend-mode:saturation}.sm\:mix-blend-color{mix-blend-mode:color}.sm\:mix-blend-luminosity{mix-blend-mode:luminosity}.sm\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.sm\:shadow,.sm\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.sm\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.sm\:shadow-lg,.sm\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.sm\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.sm\:shadow-2xl,.sm\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.sm\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.sm\:shadow-inner,.sm\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .sm\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .sm\:group-hover\:shadow,.group:hover .sm\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .sm\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .sm\:group-hover\:shadow-lg,.group:hover .sm\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .sm\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .sm\:group-hover\:shadow-2xl,.group:hover .sm\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .sm\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .sm\:group-hover\:shadow-inner,.group:hover .sm\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.sm\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.sm\:hover\:shadow-sm:hover,.sm\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.sm\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.sm\:hover\:shadow-lg:hover,.sm\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.sm\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.sm\:hover\:shadow-2xl:hover,.sm\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.sm\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.sm\:hover\:shadow-inner:hover,.sm\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.sm\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.sm\:focus\:shadow-sm:focus,.sm\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.sm\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.sm\:focus\:shadow-lg:focus,.sm\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.sm\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.sm\:focus\:shadow-2xl:focus,.sm\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.sm\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.sm\:focus\:shadow-inner:focus,.sm\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.sm\:outline-none{outline:2px solid transparent;outline-offset:2px}.sm\:outline-white{outline:2px dotted #fff;outline-offset:2px}.sm\:outline-black{outline:2px dotted #000;outline-offset:2px}.sm\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.sm\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.sm\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.sm\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.sm\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.sm\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.sm\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-0,.sm\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-2,.sm\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring,.sm\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-0:focus,.sm\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-2:focus,.sm\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-8:focus,.sm\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-inset{--tw-ring-inset:inset}.sm\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.sm\:focus\:ring-inset:focus{--tw-ring-inset:inset}.sm\:ring-transparent{--tw-ring-color:transparent}.sm\:ring-current{--tw-ring-color:currentColor}.sm\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.sm\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.sm\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.sm\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.sm\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.sm\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.sm\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.sm\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.sm\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.sm\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.sm\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.sm\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.sm\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.sm\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.sm\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.sm\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.sm\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.sm\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.sm\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.sm\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.sm\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.sm\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.sm\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.sm\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.sm\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.sm\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.sm\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.sm\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.sm\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.sm\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.sm\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.sm\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.sm\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.sm\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.sm\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.sm\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.sm\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.sm\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.sm\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.sm\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.sm\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.sm\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.sm\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.sm\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.sm\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.sm\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.sm\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.sm\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.sm\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.sm\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.sm\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.sm\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.sm\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.sm\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.sm\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.sm\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.sm\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.sm\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.sm\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.sm\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.sm\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.sm\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.sm\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.sm\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.sm\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.sm\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.sm\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.sm\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.sm\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.sm\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.sm\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.sm\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.sm\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.sm\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.sm\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.sm\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.sm\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.sm\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.sm\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.sm\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.sm\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.sm\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.sm\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.sm\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.sm\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.sm\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.sm\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.sm\:focus\:ring-current:focus{--tw-ring-color:currentColor}.sm\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.sm\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.sm\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.sm\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.sm\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.sm\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.sm\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.sm\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.sm\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.sm\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.sm\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.sm\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.sm\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.sm\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.sm\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.sm\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.sm\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.sm\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.sm\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.sm\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.sm\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.sm\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.sm\:ring-opacity-0{--tw-ring-opacity:0}.sm\:ring-opacity-5{--tw-ring-opacity:0.05}.sm\:ring-opacity-10{--tw-ring-opacity:0.1}.sm\:ring-opacity-20{--tw-ring-opacity:0.2}.sm\:ring-opacity-25{--tw-ring-opacity:0.25}.sm\:ring-opacity-30{--tw-ring-opacity:0.3}.sm\:ring-opacity-40{--tw-ring-opacity:0.4}.sm\:ring-opacity-50{--tw-ring-opacity:0.5}.sm\:ring-opacity-60{--tw-ring-opacity:0.6}.sm\:ring-opacity-70{--tw-ring-opacity:0.7}.sm\:ring-opacity-75{--tw-ring-opacity:0.75}.sm\:ring-opacity-80{--tw-ring-opacity:0.8}.sm\:ring-opacity-90{--tw-ring-opacity:0.9}.sm\:ring-opacity-95{--tw-ring-opacity:0.95}.sm\:ring-opacity-100{--tw-ring-opacity:1}.sm\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.sm\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.sm\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.sm\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.sm\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.sm\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.sm\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.sm\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.sm\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.sm\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.sm\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.sm\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.sm\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.sm\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.sm\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.sm\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.sm\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.sm\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.sm\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.sm\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.sm\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.sm\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.sm\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.sm\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.sm\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.sm\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.sm\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.sm\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.sm\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.sm\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.sm\:ring-offset-0{--tw-ring-offset-width:0px}.sm\:ring-offset-1{--tw-ring-offset-width:1px}.sm\:ring-offset-2{--tw-ring-offset-width:2px}.sm\:ring-offset-4{--tw-ring-offset-width:4px}.sm\:ring-offset-8{--tw-ring-offset-width:8px}.sm\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.sm\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.sm\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.sm\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.sm\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.sm\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.sm\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.sm\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.sm\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.sm\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.sm\:ring-offset-transparent{--tw-ring-offset-color:transparent}.sm\:ring-offset-current{--tw-ring-offset-color:currentColor}.sm\:ring-offset-black{--tw-ring-offset-color:#000}.sm\:ring-offset-white{--tw-ring-offset-color:#fff}.sm\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.sm\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.sm\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.sm\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.sm\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.sm\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.sm\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.sm\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.sm\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.sm\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.sm\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.sm\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.sm\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.sm\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.sm\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.sm\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.sm\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.sm\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.sm\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.sm\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.sm\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.sm\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.sm\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.sm\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.sm\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.sm\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.sm\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.sm\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.sm\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.sm\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.sm\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.sm\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.sm\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.sm\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.sm\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.sm\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.sm\:ring-offset-green-600{--tw-ring-offset-color:#059669}.sm\:ring-offset-green-700{--tw-ring-offset-color:#047857}.sm\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.sm\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.sm\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.sm\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.sm\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.sm\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.sm\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.sm\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.sm\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.sm\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.sm\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.sm\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.sm\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.sm\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.sm\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.sm\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.sm\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.sm\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.sm\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.sm\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.sm\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.sm\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.sm\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.sm\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.sm\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.sm\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.sm\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.sm\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.sm\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.sm\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.sm\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.sm\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.sm\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.sm\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.sm\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.sm\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.sm\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.sm\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.sm\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.sm\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.sm\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.sm\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.sm\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.sm\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.sm\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.sm\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.sm\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.sm\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.sm\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.sm\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.sm\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.sm\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.sm\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.sm\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.sm\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.sm\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.sm\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.sm\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.sm\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.sm\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.sm\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.sm\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.sm\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.sm\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.sm\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.sm\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.sm\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.sm\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.sm\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.sm\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.sm\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.sm\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.sm\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.sm\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.sm\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.sm\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.sm\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.sm\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.sm\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.sm\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.sm\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.sm\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.sm\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.sm\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.sm\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.sm\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.sm\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.sm\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.sm\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.sm\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.sm\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.sm\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.sm\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.sm\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.sm\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.sm\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.sm\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.sm\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.sm\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.sm\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.sm\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.sm\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.sm\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.sm\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.sm\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.sm\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.sm\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.sm\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.sm\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.sm\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.sm\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.sm\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.sm\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.sm\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.sm\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.sm\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.sm\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.sm\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.sm\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.sm\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.sm\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.sm\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.sm\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.sm\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.sm\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.sm\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.sm\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.sm\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.sm\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.sm\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.sm\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.sm\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.sm\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.sm\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.sm\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.sm\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.sm\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.sm\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.sm\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.sm\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.sm\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.sm\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.sm\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.sm\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.sm\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.sm\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.sm\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.sm\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.sm\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.sm\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.sm\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.sm\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.sm\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.sm\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.sm\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.sm\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.sm\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.sm\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.sm\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.sm\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.sm\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.sm\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.sm\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.sm\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.sm\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.sm\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.sm\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.sm\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.sm\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.sm\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.sm\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.sm\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.sm\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.sm\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.sm\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.sm\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.sm\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.sm\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.sm\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.sm\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.sm\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.sm\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.sm\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.sm\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.sm\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.sm\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.sm\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.sm\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.sm\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.sm\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.sm\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.sm\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.sm\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.sm\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.sm\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.sm\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.sm\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.sm\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.sm\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.sm\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.sm\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.sm\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.sm\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.sm\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.sm\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.sm\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.sm\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.sm\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.sm\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.sm\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.sm\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sm\:filter-none{filter:none}.sm\:blur-0,.sm\:blur-none{--tw-blur:blur(0)}.sm\:blur-sm{--tw-blur:blur(4px)}.sm\:blur{--tw-blur:blur(8px)}.sm\:blur-md{--tw-blur:blur(12px)}.sm\:blur-lg{--tw-blur:blur(16px)}.sm\:blur-xl{--tw-blur:blur(24px)}.sm\:blur-2xl{--tw-blur:blur(40px)}.sm\:blur-3xl{--tw-blur:blur(64px)}.sm\:brightness-0{--tw-brightness:brightness(0)}.sm\:brightness-50{--tw-brightness:brightness(.5)}.sm\:brightness-75{--tw-brightness:brightness(.75)}.sm\:brightness-90{--tw-brightness:brightness(.9)}.sm\:brightness-95{--tw-brightness:brightness(.95)}.sm\:brightness-100{--tw-brightness:brightness(1)}.sm\:brightness-105{--tw-brightness:brightness(1.05)}.sm\:brightness-110{--tw-brightness:brightness(1.1)}.sm\:brightness-125{--tw-brightness:brightness(1.25)}.sm\:brightness-150{--tw-brightness:brightness(1.5)}.sm\:brightness-200{--tw-brightness:brightness(2)}.sm\:contrast-0{--tw-contrast:contrast(0)}.sm\:contrast-50{--tw-contrast:contrast(.5)}.sm\:contrast-75{--tw-contrast:contrast(.75)}.sm\:contrast-100{--tw-contrast:contrast(1)}.sm\:contrast-125{--tw-contrast:contrast(1.25)}.sm\:contrast-150{--tw-contrast:contrast(1.5)}.sm\:contrast-200{--tw-contrast:contrast(2)}.sm\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.sm\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.sm\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.sm\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.sm\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.sm\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.sm\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.sm\:grayscale-0{--tw-grayscale:grayscale(0)}.sm\:grayscale{--tw-grayscale:grayscale(100%)}.sm\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.sm\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.sm\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.sm\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.sm\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.sm\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.sm\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.sm\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.sm\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.sm\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.sm\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.sm\:invert-0{--tw-invert:invert(0)}.sm\:invert{--tw-invert:invert(100%)}.sm\:saturate-0{--tw-saturate:saturate(0)}.sm\:saturate-50{--tw-saturate:saturate(.5)}.sm\:saturate-100{--tw-saturate:saturate(1)}.sm\:saturate-150{--tw-saturate:saturate(1.5)}.sm\:saturate-200{--tw-saturate:saturate(2)}.sm\:sepia-0{--tw-sepia:sepia(0)}.sm\:sepia{--tw-sepia:sepia(100%)}.sm\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.sm\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.sm\:backdrop-blur-0,.sm\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.sm\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.sm\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.sm\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.sm\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.sm\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.sm\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.sm\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.sm\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.sm\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.sm\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.sm\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.sm\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.sm\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.sm\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.sm\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.sm\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.sm\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.sm\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.sm\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.sm\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.sm\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.sm\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.sm\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.sm\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.sm\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.sm\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.sm\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.sm\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.sm\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.sm\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.sm\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.sm\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.sm\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.sm\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.sm\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.sm\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.sm\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.sm\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.sm\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.sm\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.sm\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.sm\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.sm\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.sm\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.sm\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.sm\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.sm\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.sm\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.sm\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.sm\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.sm\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.sm\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.sm\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.sm\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.sm\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.sm\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.sm\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.sm\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.sm\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.sm\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.sm\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.sm\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.sm\:transition-none{transition-property:none}.sm\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:delay-75{transition-delay:75ms}.sm\:delay-100{transition-delay:.1s}.sm\:delay-150{transition-delay:.15s}.sm\:delay-200{transition-delay:.2s}.sm\:delay-300{transition-delay:.3s}.sm\:delay-500{transition-delay:.5s}.sm\:delay-700{transition-delay:.7s}.sm\:delay-1000{transition-delay:1s}.sm\:duration-75{transition-duration:75ms}.sm\:duration-100{transition-duration:.1s}.sm\:duration-150{transition-duration:.15s}.sm\:duration-200{transition-duration:.2s}.sm\:duration-300{transition-duration:.3s}.sm\:duration-500{transition-duration:.5s}.sm\:duration-700{transition-duration:.7s}.sm\:duration-1000{transition-duration:1s}.sm\:ease-linear{transition-timing-function:linear}.sm\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.sm\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.sm\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}@media (min-width:1536px){.md\:container{max-width:1536px}}.md\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:pointer-events-none{pointer-events:none}.md\:pointer-events-auto{pointer-events:auto}.md\:visible{visibility:visible}.md\:invisible{visibility:hidden}.md\:static{position:static}.md\:fixed{position:fixed}.md\:absolute{position:absolute}.md\:relative{position:relative}.md\:sticky{position:-webkit-sticky;position:sticky}.md\:inset-0{top:0;right:0;bottom:0;left:0}.md\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.md\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.md\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.md\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.md\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.md\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.md\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.md\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.md\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.md\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.md\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.md\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.md\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.md\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.md\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.md\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.md\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.md\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.md\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.md\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.md\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.md\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.md\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.md\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.md\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.md\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.md\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.md\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.md\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.md\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.md\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.md\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.md\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.md\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.md\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.md\:-inset-0{top:0;right:0;bottom:0;left:0}.md\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.md\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.md\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.md\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.md\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.md\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.md\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.md\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.md\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.md\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.md\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.md\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.md\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.md\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.md\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.md\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.md\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.md\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.md\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.md\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.md\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.md\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.md\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.md\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.md\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.md\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.md\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.md\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.md\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.md\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.md\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.md\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.md\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.md\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.md\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.md\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.md\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.md\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.md\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.md\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.md\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.md\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.md\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.md\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.md\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.md\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.md\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.md\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.md\:inset-x-0{left:0;right:0}.md\:inset-x-1{left:.25rem;right:.25rem}.md\:inset-x-2{left:.5rem;right:.5rem}.md\:inset-x-3{left:.75rem;right:.75rem}.md\:inset-x-4{left:1rem;right:1rem}.md\:inset-x-5{left:1.25rem;right:1.25rem}.md\:inset-x-6{left:1.5rem;right:1.5rem}.md\:inset-x-7{left:1.75rem;right:1.75rem}.md\:inset-x-8{left:2rem;right:2rem}.md\:inset-x-9{left:2.25rem;right:2.25rem}.md\:inset-x-10{left:2.5rem;right:2.5rem}.md\:inset-x-11{left:2.75rem;right:2.75rem}.md\:inset-x-12{left:3rem;right:3rem}.md\:inset-x-14{left:3.5rem;right:3.5rem}.md\:inset-x-16{left:4rem;right:4rem}.md\:inset-x-20{left:5rem;right:5rem}.md\:inset-x-24{left:6rem;right:6rem}.md\:inset-x-28{left:7rem;right:7rem}.md\:inset-x-32{left:8rem;right:8rem}.md\:inset-x-36{left:9rem;right:9rem}.md\:inset-x-40{left:10rem;right:10rem}.md\:inset-x-44{left:11rem;right:11rem}.md\:inset-x-48{left:12rem;right:12rem}.md\:inset-x-52{left:13rem;right:13rem}.md\:inset-x-56{left:14rem;right:14rem}.md\:inset-x-60{left:15rem;right:15rem}.md\:inset-x-64{left:16rem;right:16rem}.md\:inset-x-72{left:18rem;right:18rem}.md\:inset-x-80{left:20rem;right:20rem}.md\:inset-x-96{left:24rem;right:24rem}.md\:inset-x-auto{left:auto;right:auto}.md\:inset-x-px{left:1px;right:1px}.md\:inset-x-0\.5{left:.125rem;right:.125rem}.md\:inset-x-1\.5{left:.375rem;right:.375rem}.md\:inset-x-2\.5{left:.625rem;right:.625rem}.md\:inset-x-3\.5{left:.875rem;right:.875rem}.md\:-inset-x-0{left:0;right:0}.md\:-inset-x-1{left:-.25rem;right:-.25rem}.md\:-inset-x-2{left:-.5rem;right:-.5rem}.md\:-inset-x-3{left:-.75rem;right:-.75rem}.md\:-inset-x-4{left:-1rem;right:-1rem}.md\:-inset-x-5{left:-1.25rem;right:-1.25rem}.md\:-inset-x-6{left:-1.5rem;right:-1.5rem}.md\:-inset-x-7{left:-1.75rem;right:-1.75rem}.md\:-inset-x-8{left:-2rem;right:-2rem}.md\:-inset-x-9{left:-2.25rem;right:-2.25rem}.md\:-inset-x-10{left:-2.5rem;right:-2.5rem}.md\:-inset-x-11{left:-2.75rem;right:-2.75rem}.md\:-inset-x-12{left:-3rem;right:-3rem}.md\:-inset-x-14{left:-3.5rem;right:-3.5rem}.md\:-inset-x-16{left:-4rem;right:-4rem}.md\:-inset-x-20{left:-5rem;right:-5rem}.md\:-inset-x-24{left:-6rem;right:-6rem}.md\:-inset-x-28{left:-7rem;right:-7rem}.md\:-inset-x-32{left:-8rem;right:-8rem}.md\:-inset-x-36{left:-9rem;right:-9rem}.md\:-inset-x-40{left:-10rem;right:-10rem}.md\:-inset-x-44{left:-11rem;right:-11rem}.md\:-inset-x-48{left:-12rem;right:-12rem}.md\:-inset-x-52{left:-13rem;right:-13rem}.md\:-inset-x-56{left:-14rem;right:-14rem}.md\:-inset-x-60{left:-15rem;right:-15rem}.md\:-inset-x-64{left:-16rem;right:-16rem}.md\:-inset-x-72{left:-18rem;right:-18rem}.md\:-inset-x-80{left:-20rem;right:-20rem}.md\:-inset-x-96{left:-24rem;right:-24rem}.md\:-inset-x-px{left:-1px;right:-1px}.md\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.md\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.md\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.md\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.md\:inset-x-1\/2{left:50%;right:50%}.md\:inset-x-1\/3{left:33.333333%;right:33.333333%}.md\:inset-x-2\/3{left:66.666667%;right:66.666667%}.md\:inset-x-1\/4{left:25%;right:25%}.md\:inset-x-2\/4{left:50%;right:50%}.md\:inset-x-3\/4{left:75%;right:75%}.md\:inset-x-full{left:100%;right:100%}.md\:-inset-x-1\/2{left:-50%;right:-50%}.md\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.md\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.md\:-inset-x-1\/4{left:-25%;right:-25%}.md\:-inset-x-2\/4{left:-50%;right:-50%}.md\:-inset-x-3\/4{left:-75%;right:-75%}.md\:-inset-x-full{left:-100%;right:-100%}.md\:inset-y-0{top:0;bottom:0}.md\:inset-y-1{top:.25rem;bottom:.25rem}.md\:inset-y-2{top:.5rem;bottom:.5rem}.md\:inset-y-3{top:.75rem;bottom:.75rem}.md\:inset-y-4{top:1rem;bottom:1rem}.md\:inset-y-5{top:1.25rem;bottom:1.25rem}.md\:inset-y-6{top:1.5rem;bottom:1.5rem}.md\:inset-y-7{top:1.75rem;bottom:1.75rem}.md\:inset-y-8{top:2rem;bottom:2rem}.md\:inset-y-9{top:2.25rem;bottom:2.25rem}.md\:inset-y-10{top:2.5rem;bottom:2.5rem}.md\:inset-y-11{top:2.75rem;bottom:2.75rem}.md\:inset-y-12{top:3rem;bottom:3rem}.md\:inset-y-14{top:3.5rem;bottom:3.5rem}.md\:inset-y-16{top:4rem;bottom:4rem}.md\:inset-y-20{top:5rem;bottom:5rem}.md\:inset-y-24{top:6rem;bottom:6rem}.md\:inset-y-28{top:7rem;bottom:7rem}.md\:inset-y-32{top:8rem;bottom:8rem}.md\:inset-y-36{top:9rem;bottom:9rem}.md\:inset-y-40{top:10rem;bottom:10rem}.md\:inset-y-44{top:11rem;bottom:11rem}.md\:inset-y-48{top:12rem;bottom:12rem}.md\:inset-y-52{top:13rem;bottom:13rem}.md\:inset-y-56{top:14rem;bottom:14rem}.md\:inset-y-60{top:15rem;bottom:15rem}.md\:inset-y-64{top:16rem;bottom:16rem}.md\:inset-y-72{top:18rem;bottom:18rem}.md\:inset-y-80{top:20rem;bottom:20rem}.md\:inset-y-96{top:24rem;bottom:24rem}.md\:inset-y-auto{top:auto;bottom:auto}.md\:inset-y-px{top:1px;bottom:1px}.md\:inset-y-0\.5{top:.125rem;bottom:.125rem}.md\:inset-y-1\.5{top:.375rem;bottom:.375rem}.md\:inset-y-2\.5{top:.625rem;bottom:.625rem}.md\:inset-y-3\.5{top:.875rem;bottom:.875rem}.md\:-inset-y-0{top:0;bottom:0}.md\:-inset-y-1{top:-.25rem;bottom:-.25rem}.md\:-inset-y-2{top:-.5rem;bottom:-.5rem}.md\:-inset-y-3{top:-.75rem;bottom:-.75rem}.md\:-inset-y-4{top:-1rem;bottom:-1rem}.md\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.md\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.md\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.md\:-inset-y-8{top:-2rem;bottom:-2rem}.md\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.md\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.md\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.md\:-inset-y-12{top:-3rem;bottom:-3rem}.md\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.md\:-inset-y-16{top:-4rem;bottom:-4rem}.md\:-inset-y-20{top:-5rem;bottom:-5rem}.md\:-inset-y-24{top:-6rem;bottom:-6rem}.md\:-inset-y-28{top:-7rem;bottom:-7rem}.md\:-inset-y-32{top:-8rem;bottom:-8rem}.md\:-inset-y-36{top:-9rem;bottom:-9rem}.md\:-inset-y-40{top:-10rem;bottom:-10rem}.md\:-inset-y-44{top:-11rem;bottom:-11rem}.md\:-inset-y-48{top:-12rem;bottom:-12rem}.md\:-inset-y-52{top:-13rem;bottom:-13rem}.md\:-inset-y-56{top:-14rem;bottom:-14rem}.md\:-inset-y-60{top:-15rem;bottom:-15rem}.md\:-inset-y-64{top:-16rem;bottom:-16rem}.md\:-inset-y-72{top:-18rem;bottom:-18rem}.md\:-inset-y-80{top:-20rem;bottom:-20rem}.md\:-inset-y-96{top:-24rem;bottom:-24rem}.md\:-inset-y-px{top:-1px;bottom:-1px}.md\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.md\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.md\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.md\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.md\:inset-y-1\/2{top:50%;bottom:50%}.md\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.md\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.md\:inset-y-1\/4{top:25%;bottom:25%}.md\:inset-y-2\/4{top:50%;bottom:50%}.md\:inset-y-3\/4{top:75%;bottom:75%}.md\:inset-y-full{top:100%;bottom:100%}.md\:-inset-y-1\/2{top:-50%;bottom:-50%}.md\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.md\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.md\:-inset-y-1\/4{top:-25%;bottom:-25%}.md\:-inset-y-2\/4{top:-50%;bottom:-50%}.md\:-inset-y-3\/4{top:-75%;bottom:-75%}.md\:-inset-y-full{top:-100%;bottom:-100%}.md\:top-0{top:0}.md\:top-1{top:.25rem}.md\:top-2{top:.5rem}.md\:top-3{top:.75rem}.md\:top-4{top:1rem}.md\:top-5{top:1.25rem}.md\:top-6{top:1.5rem}.md\:top-7{top:1.75rem}.md\:top-8{top:2rem}.md\:top-9{top:2.25rem}.md\:top-10{top:2.5rem}.md\:top-11{top:2.75rem}.md\:top-12{top:3rem}.md\:top-14{top:3.5rem}.md\:top-16{top:4rem}.md\:top-20{top:5rem}.md\:top-24{top:6rem}.md\:top-28{top:7rem}.md\:top-32{top:8rem}.md\:top-36{top:9rem}.md\:top-40{top:10rem}.md\:top-44{top:11rem}.md\:top-48{top:12rem}.md\:top-52{top:13rem}.md\:top-56{top:14rem}.md\:top-60{top:15rem}.md\:top-64{top:16rem}.md\:top-72{top:18rem}.md\:top-80{top:20rem}.md\:top-96{top:24rem}.md\:top-auto{top:auto}.md\:top-px{top:1px}.md\:top-0\.5{top:.125rem}.md\:top-1\.5{top:.375rem}.md\:top-2\.5{top:.625rem}.md\:top-3\.5{top:.875rem}.md\:-top-0{top:0}.md\:-top-1{top:-.25rem}.md\:-top-2{top:-.5rem}.md\:-top-3{top:-.75rem}.md\:-top-4{top:-1rem}.md\:-top-5{top:-1.25rem}.md\:-top-6{top:-1.5rem}.md\:-top-7{top:-1.75rem}.md\:-top-8{top:-2rem}.md\:-top-9{top:-2.25rem}.md\:-top-10{top:-2.5rem}.md\:-top-11{top:-2.75rem}.md\:-top-12{top:-3rem}.md\:-top-14{top:-3.5rem}.md\:-top-16{top:-4rem}.md\:-top-20{top:-5rem}.md\:-top-24{top:-6rem}.md\:-top-28{top:-7rem}.md\:-top-32{top:-8rem}.md\:-top-36{top:-9rem}.md\:-top-40{top:-10rem}.md\:-top-44{top:-11rem}.md\:-top-48{top:-12rem}.md\:-top-52{top:-13rem}.md\:-top-56{top:-14rem}.md\:-top-60{top:-15rem}.md\:-top-64{top:-16rem}.md\:-top-72{top:-18rem}.md\:-top-80{top:-20rem}.md\:-top-96{top:-24rem}.md\:-top-px{top:-1px}.md\:-top-0\.5{top:-.125rem}.md\:-top-1\.5{top:-.375rem}.md\:-top-2\.5{top:-.625rem}.md\:-top-3\.5{top:-.875rem}.md\:top-1\/2{top:50%}.md\:top-1\/3{top:33.333333%}.md\:top-2\/3{top:66.666667%}.md\:top-1\/4{top:25%}.md\:top-2\/4{top:50%}.md\:top-3\/4{top:75%}.md\:top-full{top:100%}.md\:-top-1\/2{top:-50%}.md\:-top-1\/3{top:-33.333333%}.md\:-top-2\/3{top:-66.666667%}.md\:-top-1\/4{top:-25%}.md\:-top-2\/4{top:-50%}.md\:-top-3\/4{top:-75%}.md\:-top-full{top:-100%}.md\:right-0{right:0}.md\:right-1{right:.25rem}.md\:right-2{right:.5rem}.md\:right-3{right:.75rem}.md\:right-4{right:1rem}.md\:right-5{right:1.25rem}.md\:right-6{right:1.5rem}.md\:right-7{right:1.75rem}.md\:right-8{right:2rem}.md\:right-9{right:2.25rem}.md\:right-10{right:2.5rem}.md\:right-11{right:2.75rem}.md\:right-12{right:3rem}.md\:right-14{right:3.5rem}.md\:right-16{right:4rem}.md\:right-20{right:5rem}.md\:right-24{right:6rem}.md\:right-28{right:7rem}.md\:right-32{right:8rem}.md\:right-36{right:9rem}.md\:right-40{right:10rem}.md\:right-44{right:11rem}.md\:right-48{right:12rem}.md\:right-52{right:13rem}.md\:right-56{right:14rem}.md\:right-60{right:15rem}.md\:right-64{right:16rem}.md\:right-72{right:18rem}.md\:right-80{right:20rem}.md\:right-96{right:24rem}.md\:right-auto{right:auto}.md\:right-px{right:1px}.md\:right-0\.5{right:.125rem}.md\:right-1\.5{right:.375rem}.md\:right-2\.5{right:.625rem}.md\:right-3\.5{right:.875rem}.md\:-right-0{right:0}.md\:-right-1{right:-.25rem}.md\:-right-2{right:-.5rem}.md\:-right-3{right:-.75rem}.md\:-right-4{right:-1rem}.md\:-right-5{right:-1.25rem}.md\:-right-6{right:-1.5rem}.md\:-right-7{right:-1.75rem}.md\:-right-8{right:-2rem}.md\:-right-9{right:-2.25rem}.md\:-right-10{right:-2.5rem}.md\:-right-11{right:-2.75rem}.md\:-right-12{right:-3rem}.md\:-right-14{right:-3.5rem}.md\:-right-16{right:-4rem}.md\:-right-20{right:-5rem}.md\:-right-24{right:-6rem}.md\:-right-28{right:-7rem}.md\:-right-32{right:-8rem}.md\:-right-36{right:-9rem}.md\:-right-40{right:-10rem}.md\:-right-44{right:-11rem}.md\:-right-48{right:-12rem}.md\:-right-52{right:-13rem}.md\:-right-56{right:-14rem}.md\:-right-60{right:-15rem}.md\:-right-64{right:-16rem}.md\:-right-72{right:-18rem}.md\:-right-80{right:-20rem}.md\:-right-96{right:-24rem}.md\:-right-px{right:-1px}.md\:-right-0\.5{right:-.125rem}.md\:-right-1\.5{right:-.375rem}.md\:-right-2\.5{right:-.625rem}.md\:-right-3\.5{right:-.875rem}.md\:right-1\/2{right:50%}.md\:right-1\/3{right:33.333333%}.md\:right-2\/3{right:66.666667%}.md\:right-1\/4{right:25%}.md\:right-2\/4{right:50%}.md\:right-3\/4{right:75%}.md\:right-full{right:100%}.md\:-right-1\/2{right:-50%}.md\:-right-1\/3{right:-33.333333%}.md\:-right-2\/3{right:-66.666667%}.md\:-right-1\/4{right:-25%}.md\:-right-2\/4{right:-50%}.md\:-right-3\/4{right:-75%}.md\:-right-full{right:-100%}.md\:bottom-0{bottom:0}.md\:bottom-1{bottom:.25rem}.md\:bottom-2{bottom:.5rem}.md\:bottom-3{bottom:.75rem}.md\:bottom-4{bottom:1rem}.md\:bottom-5{bottom:1.25rem}.md\:bottom-6{bottom:1.5rem}.md\:bottom-7{bottom:1.75rem}.md\:bottom-8{bottom:2rem}.md\:bottom-9{bottom:2.25rem}.md\:bottom-10{bottom:2.5rem}.md\:bottom-11{bottom:2.75rem}.md\:bottom-12{bottom:3rem}.md\:bottom-14{bottom:3.5rem}.md\:bottom-16{bottom:4rem}.md\:bottom-20{bottom:5rem}.md\:bottom-24{bottom:6rem}.md\:bottom-28{bottom:7rem}.md\:bottom-32{bottom:8rem}.md\:bottom-36{bottom:9rem}.md\:bottom-40{bottom:10rem}.md\:bottom-44{bottom:11rem}.md\:bottom-48{bottom:12rem}.md\:bottom-52{bottom:13rem}.md\:bottom-56{bottom:14rem}.md\:bottom-60{bottom:15rem}.md\:bottom-64{bottom:16rem}.md\:bottom-72{bottom:18rem}.md\:bottom-80{bottom:20rem}.md\:bottom-96{bottom:24rem}.md\:bottom-auto{bottom:auto}.md\:bottom-px{bottom:1px}.md\:bottom-0\.5{bottom:.125rem}.md\:bottom-1\.5{bottom:.375rem}.md\:bottom-2\.5{bottom:.625rem}.md\:bottom-3\.5{bottom:.875rem}.md\:-bottom-0{bottom:0}.md\:-bottom-1{bottom:-.25rem}.md\:-bottom-2{bottom:-.5rem}.md\:-bottom-3{bottom:-.75rem}.md\:-bottom-4{bottom:-1rem}.md\:-bottom-5{bottom:-1.25rem}.md\:-bottom-6{bottom:-1.5rem}.md\:-bottom-7{bottom:-1.75rem}.md\:-bottom-8{bottom:-2rem}.md\:-bottom-9{bottom:-2.25rem}.md\:-bottom-10{bottom:-2.5rem}.md\:-bottom-11{bottom:-2.75rem}.md\:-bottom-12{bottom:-3rem}.md\:-bottom-14{bottom:-3.5rem}.md\:-bottom-16{bottom:-4rem}.md\:-bottom-20{bottom:-5rem}.md\:-bottom-24{bottom:-6rem}.md\:-bottom-28{bottom:-7rem}.md\:-bottom-32{bottom:-8rem}.md\:-bottom-36{bottom:-9rem}.md\:-bottom-40{bottom:-10rem}.md\:-bottom-44{bottom:-11rem}.md\:-bottom-48{bottom:-12rem}.md\:-bottom-52{bottom:-13rem}.md\:-bottom-56{bottom:-14rem}.md\:-bottom-60{bottom:-15rem}.md\:-bottom-64{bottom:-16rem}.md\:-bottom-72{bottom:-18rem}.md\:-bottom-80{bottom:-20rem}.md\:-bottom-96{bottom:-24rem}.md\:-bottom-px{bottom:-1px}.md\:-bottom-0\.5{bottom:-.125rem}.md\:-bottom-1\.5{bottom:-.375rem}.md\:-bottom-2\.5{bottom:-.625rem}.md\:-bottom-3\.5{bottom:-.875rem}.md\:bottom-1\/2{bottom:50%}.md\:bottom-1\/3{bottom:33.333333%}.md\:bottom-2\/3{bottom:66.666667%}.md\:bottom-1\/4{bottom:25%}.md\:bottom-2\/4{bottom:50%}.md\:bottom-3\/4{bottom:75%}.md\:bottom-full{bottom:100%}.md\:-bottom-1\/2{bottom:-50%}.md\:-bottom-1\/3{bottom:-33.333333%}.md\:-bottom-2\/3{bottom:-66.666667%}.md\:-bottom-1\/4{bottom:-25%}.md\:-bottom-2\/4{bottom:-50%}.md\:-bottom-3\/4{bottom:-75%}.md\:-bottom-full{bottom:-100%}.md\:left-0{left:0}.md\:left-1{left:.25rem}.md\:left-2{left:.5rem}.md\:left-3{left:.75rem}.md\:left-4{left:1rem}.md\:left-5{left:1.25rem}.md\:left-6{left:1.5rem}.md\:left-7{left:1.75rem}.md\:left-8{left:2rem}.md\:left-9{left:2.25rem}.md\:left-10{left:2.5rem}.md\:left-11{left:2.75rem}.md\:left-12{left:3rem}.md\:left-14{left:3.5rem}.md\:left-16{left:4rem}.md\:left-20{left:5rem}.md\:left-24{left:6rem}.md\:left-28{left:7rem}.md\:left-32{left:8rem}.md\:left-36{left:9rem}.md\:left-40{left:10rem}.md\:left-44{left:11rem}.md\:left-48{left:12rem}.md\:left-52{left:13rem}.md\:left-56{left:14rem}.md\:left-60{left:15rem}.md\:left-64{left:16rem}.md\:left-72{left:18rem}.md\:left-80{left:20rem}.md\:left-96{left:24rem}.md\:left-auto{left:auto}.md\:left-px{left:1px}.md\:left-0\.5{left:.125rem}.md\:left-1\.5{left:.375rem}.md\:left-2\.5{left:.625rem}.md\:left-3\.5{left:.875rem}.md\:-left-0{left:0}.md\:-left-1{left:-.25rem}.md\:-left-2{left:-.5rem}.md\:-left-3{left:-.75rem}.md\:-left-4{left:-1rem}.md\:-left-5{left:-1.25rem}.md\:-left-6{left:-1.5rem}.md\:-left-7{left:-1.75rem}.md\:-left-8{left:-2rem}.md\:-left-9{left:-2.25rem}.md\:-left-10{left:-2.5rem}.md\:-left-11{left:-2.75rem}.md\:-left-12{left:-3rem}.md\:-left-14{left:-3.5rem}.md\:-left-16{left:-4rem}.md\:-left-20{left:-5rem}.md\:-left-24{left:-6rem}.md\:-left-28{left:-7rem}.md\:-left-32{left:-8rem}.md\:-left-36{left:-9rem}.md\:-left-40{left:-10rem}.md\:-left-44{left:-11rem}.md\:-left-48{left:-12rem}.md\:-left-52{left:-13rem}.md\:-left-56{left:-14rem}.md\:-left-60{left:-15rem}.md\:-left-64{left:-16rem}.md\:-left-72{left:-18rem}.md\:-left-80{left:-20rem}.md\:-left-96{left:-24rem}.md\:-left-px{left:-1px}.md\:-left-0\.5{left:-.125rem}.md\:-left-1\.5{left:-.375rem}.md\:-left-2\.5{left:-.625rem}.md\:-left-3\.5{left:-.875rem}.md\:left-1\/2{left:50%}.md\:left-1\/3{left:33.333333%}.md\:left-2\/3{left:66.666667%}.md\:left-1\/4{left:25%}.md\:left-2\/4{left:50%}.md\:left-3\/4{left:75%}.md\:left-full{left:100%}.md\:-left-1\/2{left:-50%}.md\:-left-1\/3{left:-33.333333%}.md\:-left-2\/3{left:-66.666667%}.md\:-left-1\/4{left:-25%}.md\:-left-2\/4{left:-50%}.md\:-left-3\/4{left:-75%}.md\:-left-full{left:-100%}.md\:isolate{isolation:isolate}.md\:isolation-auto{isolation:auto}.md\:z-0{z-index:0}.md\:z-10{z-index:10}.md\:z-20{z-index:20}.md\:z-30{z-index:30}.md\:z-40{z-index:40}.md\:z-50{z-index:50}.md\:z-auto{z-index:auto}.md\:focus-within\:z-0:focus-within{z-index:0}.md\:focus-within\:z-10:focus-within{z-index:10}.md\:focus-within\:z-20:focus-within{z-index:20}.md\:focus-within\:z-30:focus-within{z-index:30}.md\:focus-within\:z-40:focus-within{z-index:40}.md\:focus-within\:z-50:focus-within{z-index:50}.md\:focus-within\:z-auto:focus-within{z-index:auto}.md\:focus\:z-0:focus{z-index:0}.md\:focus\:z-10:focus{z-index:10}.md\:focus\:z-20:focus{z-index:20}.md\:focus\:z-30:focus{z-index:30}.md\:focus\:z-40:focus{z-index:40}.md\:focus\:z-50:focus{z-index:50}.md\:focus\:z-auto:focus{z-index:auto}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-4{order:4}.md\:order-5{order:5}.md\:order-6{order:6}.md\:order-7{order:7}.md\:order-8{order:8}.md\:order-9{order:9}.md\:order-10{order:10}.md\:order-11{order:11}.md\:order-12{order:12}.md\:order-first{order:-9999}.md\:order-last{order:9999}.md\:order-none{order:0}.md\:col-auto{grid-column:auto}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:col-start-1{grid-column-start:1}.md\:col-start-2{grid-column-start:2}.md\:col-start-3{grid-column-start:3}.md\:col-start-4{grid-column-start:4}.md\:col-start-5{grid-column-start:5}.md\:col-start-6{grid-column-start:6}.md\:col-start-7{grid-column-start:7}.md\:col-start-8{grid-column-start:8}.md\:col-start-9{grid-column-start:9}.md\:col-start-10{grid-column-start:10}.md\:col-start-11{grid-column-start:11}.md\:col-start-12{grid-column-start:12}.md\:col-start-13{grid-column-start:13}.md\:col-start-auto{grid-column-start:auto}.md\:col-end-1{grid-column-end:1}.md\:col-end-2{grid-column-end:2}.md\:col-end-3{grid-column-end:3}.md\:col-end-4{grid-column-end:4}.md\:col-end-5{grid-column-end:5}.md\:col-end-6{grid-column-end:6}.md\:col-end-7{grid-column-end:7}.md\:col-end-8{grid-column-end:8}.md\:col-end-9{grid-column-end:9}.md\:col-end-10{grid-column-end:10}.md\:col-end-11{grid-column-end:11}.md\:col-end-12{grid-column-end:12}.md\:col-end-13{grid-column-end:13}.md\:col-end-auto{grid-column-end:auto}.md\:row-auto{grid-row:auto}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-3{grid-row:span 3/span 3}.md\:row-span-4{grid-row:span 4/span 4}.md\:row-span-5{grid-row:span 5/span 5}.md\:row-span-6{grid-row:span 6/span 6}.md\:row-span-full{grid-row:1/-1}.md\:row-start-1{grid-row-start:1}.md\:row-start-2{grid-row-start:2}.md\:row-start-3{grid-row-start:3}.md\:row-start-4{grid-row-start:4}.md\:row-start-5{grid-row-start:5}.md\:row-start-6{grid-row-start:6}.md\:row-start-7{grid-row-start:7}.md\:row-start-auto{grid-row-start:auto}.md\:row-end-1{grid-row-end:1}.md\:row-end-2{grid-row-end:2}.md\:row-end-3{grid-row-end:3}.md\:row-end-4{grid-row-end:4}.md\:row-end-5{grid-row-end:5}.md\:row-end-6{grid-row-end:6}.md\:row-end-7{grid-row-end:7}.md\:row-end-auto{grid-row-end:auto}.md\:float-right{float:right}.md\:float-left{float:left}.md\:float-none{float:none}.md\:clear-left{clear:left}.md\:clear-right{clear:right}.md\:clear-both{clear:both}.md\:clear-none{clear:none}.md\:m-0{margin:0}.md\:m-1{margin:.25rem}.md\:m-2{margin:.5rem}.md\:m-3{margin:.75rem}.md\:m-4{margin:1rem}.md\:m-5{margin:1.25rem}.md\:m-6{margin:1.5rem}.md\:m-7{margin:1.75rem}.md\:m-8{margin:2rem}.md\:m-9{margin:2.25rem}.md\:m-10{margin:2.5rem}.md\:m-11{margin:2.75rem}.md\:m-12{margin:3rem}.md\:m-14{margin:3.5rem}.md\:m-16{margin:4rem}.md\:m-20{margin:5rem}.md\:m-24{margin:6rem}.md\:m-28{margin:7rem}.md\:m-32{margin:8rem}.md\:m-36{margin:9rem}.md\:m-40{margin:10rem}.md\:m-44{margin:11rem}.md\:m-48{margin:12rem}.md\:m-52{margin:13rem}.md\:m-56{margin:14rem}.md\:m-60{margin:15rem}.md\:m-64{margin:16rem}.md\:m-72{margin:18rem}.md\:m-80{margin:20rem}.md\:m-96{margin:24rem}.md\:m-auto{margin:auto}.md\:m-px{margin:1px}.md\:m-0\.5{margin:.125rem}.md\:m-1\.5{margin:.375rem}.md\:m-2\.5{margin:.625rem}.md\:m-3\.5{margin:.875rem}.md\:-m-0{margin:0}.md\:-m-1{margin:-.25rem}.md\:-m-2{margin:-.5rem}.md\:-m-3{margin:-.75rem}.md\:-m-4{margin:-1rem}.md\:-m-5{margin:-1.25rem}.md\:-m-6{margin:-1.5rem}.md\:-m-7{margin:-1.75rem}.md\:-m-8{margin:-2rem}.md\:-m-9{margin:-2.25rem}.md\:-m-10{margin:-2.5rem}.md\:-m-11{margin:-2.75rem}.md\:-m-12{margin:-3rem}.md\:-m-14{margin:-3.5rem}.md\:-m-16{margin:-4rem}.md\:-m-20{margin:-5rem}.md\:-m-24{margin:-6rem}.md\:-m-28{margin:-7rem}.md\:-m-32{margin:-8rem}.md\:-m-36{margin:-9rem}.md\:-m-40{margin:-10rem}.md\:-m-44{margin:-11rem}.md\:-m-48{margin:-12rem}.md\:-m-52{margin:-13rem}.md\:-m-56{margin:-14rem}.md\:-m-60{margin:-15rem}.md\:-m-64{margin:-16rem}.md\:-m-72{margin:-18rem}.md\:-m-80{margin:-20rem}.md\:-m-96{margin:-24rem}.md\:-m-px{margin:-1px}.md\:-m-0\.5{margin:-.125rem}.md\:-m-1\.5{margin:-.375rem}.md\:-m-2\.5{margin:-.625rem}.md\:-m-3\.5{margin:-.875rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-1{margin-left:.25rem;margin-right:.25rem}.md\:mx-2{margin-left:.5rem;margin-right:.5rem}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mx-4{margin-left:1rem;margin-right:1rem}.md\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.md\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.md\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.md\:mx-8{margin-left:2rem;margin-right:2rem}.md\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.md\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.md\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.md\:mx-12{margin-left:3rem;margin-right:3rem}.md\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.md\:mx-16{margin-left:4rem;margin-right:4rem}.md\:mx-20{margin-left:5rem;margin-right:5rem}.md\:mx-24{margin-left:6rem;margin-right:6rem}.md\:mx-28{margin-left:7rem;margin-right:7rem}.md\:mx-32{margin-left:8rem;margin-right:8rem}.md\:mx-36{margin-left:9rem;margin-right:9rem}.md\:mx-40{margin-left:10rem;margin-right:10rem}.md\:mx-44{margin-left:11rem;margin-right:11rem}.md\:mx-48{margin-left:12rem;margin-right:12rem}.md\:mx-52{margin-left:13rem;margin-right:13rem}.md\:mx-56{margin-left:14rem;margin-right:14rem}.md\:mx-60{margin-left:15rem;margin-right:15rem}.md\:mx-64{margin-left:16rem;margin-right:16rem}.md\:mx-72{margin-left:18rem;margin-right:18rem}.md\:mx-80{margin-left:20rem;margin-right:20rem}.md\:mx-96{margin-left:24rem;margin-right:24rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mx-px{margin-left:1px;margin-right:1px}.md\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.md\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.md\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.md\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.md\:-mx-0{margin-left:0;margin-right:0}.md\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.md\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.md\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.md\:-mx-4{margin-left:-1rem;margin-right:-1rem}.md\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.md\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.md\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.md\:-mx-8{margin-left:-2rem;margin-right:-2rem}.md\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.md\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.md\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.md\:-mx-12{margin-left:-3rem;margin-right:-3rem}.md\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.md\:-mx-16{margin-left:-4rem;margin-right:-4rem}.md\:-mx-20{margin-left:-5rem;margin-right:-5rem}.md\:-mx-24{margin-left:-6rem;margin-right:-6rem}.md\:-mx-28{margin-left:-7rem;margin-right:-7rem}.md\:-mx-32{margin-left:-8rem;margin-right:-8rem}.md\:-mx-36{margin-left:-9rem;margin-right:-9rem}.md\:-mx-40{margin-left:-10rem;margin-right:-10rem}.md\:-mx-44{margin-left:-11rem;margin-right:-11rem}.md\:-mx-48{margin-left:-12rem;margin-right:-12rem}.md\:-mx-52{margin-left:-13rem;margin-right:-13rem}.md\:-mx-56{margin-left:-14rem;margin-right:-14rem}.md\:-mx-60{margin-left:-15rem;margin-right:-15rem}.md\:-mx-64{margin-left:-16rem;margin-right:-16rem}.md\:-mx-72{margin-left:-18rem;margin-right:-18rem}.md\:-mx-80{margin-left:-20rem;margin-right:-20rem}.md\:-mx-96{margin-left:-24rem;margin-right:-24rem}.md\:-mx-px{margin-left:-1px;margin-right:-1px}.md\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.md\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.md\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.md\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.md\:my-0{margin-top:0;margin-bottom:0}.md\:my-1{margin-top:.25rem;margin-bottom:.25rem}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:my-3{margin-top:.75rem;margin-bottom:.75rem}.md\:my-4{margin-top:1rem;margin-bottom:1rem}.md\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.md\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.md\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.md\:my-8{margin-top:2rem;margin-bottom:2rem}.md\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.md\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.md\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.md\:my-12{margin-top:3rem;margin-bottom:3rem}.md\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.md\:my-16{margin-top:4rem;margin-bottom:4rem}.md\:my-20{margin-top:5rem;margin-bottom:5rem}.md\:my-24{margin-top:6rem;margin-bottom:6rem}.md\:my-28{margin-top:7rem;margin-bottom:7rem}.md\:my-32{margin-top:8rem;margin-bottom:8rem}.md\:my-36{margin-top:9rem;margin-bottom:9rem}.md\:my-40{margin-top:10rem;margin-bottom:10rem}.md\:my-44{margin-top:11rem;margin-bottom:11rem}.md\:my-48{margin-top:12rem;margin-bottom:12rem}.md\:my-52{margin-top:13rem;margin-bottom:13rem}.md\:my-56{margin-top:14rem;margin-bottom:14rem}.md\:my-60{margin-top:15rem;margin-bottom:15rem}.md\:my-64{margin-top:16rem;margin-bottom:16rem}.md\:my-72{margin-top:18rem;margin-bottom:18rem}.md\:my-80{margin-top:20rem;margin-bottom:20rem}.md\:my-96{margin-top:24rem;margin-bottom:24rem}.md\:my-auto{margin-top:auto;margin-bottom:auto}.md\:my-px{margin-top:1px;margin-bottom:1px}.md\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.md\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.md\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.md\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.md\:-my-0{margin-top:0;margin-bottom:0}.md\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.md\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.md\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.md\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.md\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.md\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.md\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.md\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.md\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.md\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.md\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.md\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.md\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.md\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.md\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.md\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.md\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.md\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.md\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.md\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.md\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.md\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.md\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.md\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.md\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.md\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.md\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.md\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.md\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.md\:-my-px{margin-top:-1px;margin-bottom:-1px}.md\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.md\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.md\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.md\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.md\:mt-0{margin-top:0}.md\:mt-1{margin-top:.25rem}.md\:mt-2{margin-top:.5rem}.md\:mt-3{margin-top:.75rem}.md\:mt-4{margin-top:1rem}.md\:mt-5{margin-top:1.25rem}.md\:mt-6{margin-top:1.5rem}.md\:mt-7{margin-top:1.75rem}.md\:mt-8{margin-top:2rem}.md\:mt-9{margin-top:2.25rem}.md\:mt-10{margin-top:2.5rem}.md\:mt-11{margin-top:2.75rem}.md\:mt-12{margin-top:3rem}.md\:mt-14{margin-top:3.5rem}.md\:mt-16{margin-top:4rem}.md\:mt-20{margin-top:5rem}.md\:mt-24{margin-top:6rem}.md\:mt-28{margin-top:7rem}.md\:mt-32{margin-top:8rem}.md\:mt-36{margin-top:9rem}.md\:mt-40{margin-top:10rem}.md\:mt-44{margin-top:11rem}.md\:mt-48{margin-top:12rem}.md\:mt-52{margin-top:13rem}.md\:mt-56{margin-top:14rem}.md\:mt-60{margin-top:15rem}.md\:mt-64{margin-top:16rem}.md\:mt-72{margin-top:18rem}.md\:mt-80{margin-top:20rem}.md\:mt-96{margin-top:24rem}.md\:mt-auto{margin-top:auto}.md\:mt-px{margin-top:1px}.md\:mt-0\.5{margin-top:.125rem}.md\:mt-1\.5{margin-top:.375rem}.md\:mt-2\.5{margin-top:.625rem}.md\:mt-3\.5{margin-top:.875rem}.md\:-mt-0{margin-top:0}.md\:-mt-1{margin-top:-.25rem}.md\:-mt-2{margin-top:-.5rem}.md\:-mt-3{margin-top:-.75rem}.md\:-mt-4{margin-top:-1rem}.md\:-mt-5{margin-top:-1.25rem}.md\:-mt-6{margin-top:-1.5rem}.md\:-mt-7{margin-top:-1.75rem}.md\:-mt-8{margin-top:-2rem}.md\:-mt-9{margin-top:-2.25rem}.md\:-mt-10{margin-top:-2.5rem}.md\:-mt-11{margin-top:-2.75rem}.md\:-mt-12{margin-top:-3rem}.md\:-mt-14{margin-top:-3.5rem}.md\:-mt-16{margin-top:-4rem}.md\:-mt-20{margin-top:-5rem}.md\:-mt-24{margin-top:-6rem}.md\:-mt-28{margin-top:-7rem}.md\:-mt-32{margin-top:-8rem}.md\:-mt-36{margin-top:-9rem}.md\:-mt-40{margin-top:-10rem}.md\:-mt-44{margin-top:-11rem}.md\:-mt-48{margin-top:-12rem}.md\:-mt-52{margin-top:-13rem}.md\:-mt-56{margin-top:-14rem}.md\:-mt-60{margin-top:-15rem}.md\:-mt-64{margin-top:-16rem}.md\:-mt-72{margin-top:-18rem}.md\:-mt-80{margin-top:-20rem}.md\:-mt-96{margin-top:-24rem}.md\:-mt-px{margin-top:-1px}.md\:-mt-0\.5{margin-top:-.125rem}.md\:-mt-1\.5{margin-top:-.375rem}.md\:-mt-2\.5{margin-top:-.625rem}.md\:-mt-3\.5{margin-top:-.875rem}.md\:mr-0{margin-right:0}.md\:mr-1{margin-right:.25rem}.md\:mr-2{margin-right:.5rem}.md\:mr-3{margin-right:.75rem}.md\:mr-4{margin-right:1rem}.md\:mr-5{margin-right:1.25rem}.md\:mr-6{margin-right:1.5rem}.md\:mr-7{margin-right:1.75rem}.md\:mr-8{margin-right:2rem}.md\:mr-9{margin-right:2.25rem}.md\:mr-10{margin-right:2.5rem}.md\:mr-11{margin-right:2.75rem}.md\:mr-12{margin-right:3rem}.md\:mr-14{margin-right:3.5rem}.md\:mr-16{margin-right:4rem}.md\:mr-20{margin-right:5rem}.md\:mr-24{margin-right:6rem}.md\:mr-28{margin-right:7rem}.md\:mr-32{margin-right:8rem}.md\:mr-36{margin-right:9rem}.md\:mr-40{margin-right:10rem}.md\:mr-44{margin-right:11rem}.md\:mr-48{margin-right:12rem}.md\:mr-52{margin-right:13rem}.md\:mr-56{margin-right:14rem}.md\:mr-60{margin-right:15rem}.md\:mr-64{margin-right:16rem}.md\:mr-72{margin-right:18rem}.md\:mr-80{margin-right:20rem}.md\:mr-96{margin-right:24rem}.md\:mr-auto{margin-right:auto}.md\:mr-px{margin-right:1px}.md\:mr-0\.5{margin-right:.125rem}.md\:mr-1\.5{margin-right:.375rem}.md\:mr-2\.5{margin-right:.625rem}.md\:mr-3\.5{margin-right:.875rem}.md\:-mr-0{margin-right:0}.md\:-mr-1{margin-right:-.25rem}.md\:-mr-2{margin-right:-.5rem}.md\:-mr-3{margin-right:-.75rem}.md\:-mr-4{margin-right:-1rem}.md\:-mr-5{margin-right:-1.25rem}.md\:-mr-6{margin-right:-1.5rem}.md\:-mr-7{margin-right:-1.75rem}.md\:-mr-8{margin-right:-2rem}.md\:-mr-9{margin-right:-2.25rem}.md\:-mr-10{margin-right:-2.5rem}.md\:-mr-11{margin-right:-2.75rem}.md\:-mr-12{margin-right:-3rem}.md\:-mr-14{margin-right:-3.5rem}.md\:-mr-16{margin-right:-4rem}.md\:-mr-20{margin-right:-5rem}.md\:-mr-24{margin-right:-6rem}.md\:-mr-28{margin-right:-7rem}.md\:-mr-32{margin-right:-8rem}.md\:-mr-36{margin-right:-9rem}.md\:-mr-40{margin-right:-10rem}.md\:-mr-44{margin-right:-11rem}.md\:-mr-48{margin-right:-12rem}.md\:-mr-52{margin-right:-13rem}.md\:-mr-56{margin-right:-14rem}.md\:-mr-60{margin-right:-15rem}.md\:-mr-64{margin-right:-16rem}.md\:-mr-72{margin-right:-18rem}.md\:-mr-80{margin-right:-20rem}.md\:-mr-96{margin-right:-24rem}.md\:-mr-px{margin-right:-1px}.md\:-mr-0\.5{margin-right:-.125rem}.md\:-mr-1\.5{margin-right:-.375rem}.md\:-mr-2\.5{margin-right:-.625rem}.md\:-mr-3\.5{margin-right:-.875rem}.md\:mb-0{margin-bottom:0}.md\:mb-1{margin-bottom:.25rem}.md\:mb-2{margin-bottom:.5rem}.md\:mb-3{margin-bottom:.75rem}.md\:mb-4{margin-bottom:1rem}.md\:mb-5{margin-bottom:1.25rem}.md\:mb-6{margin-bottom:1.5rem}.md\:mb-7{margin-bottom:1.75rem}.md\:mb-8{margin-bottom:2rem}.md\:mb-9{margin-bottom:2.25rem}.md\:mb-10{margin-bottom:2.5rem}.md\:mb-11{margin-bottom:2.75rem}.md\:mb-12{margin-bottom:3rem}.md\:mb-14{margin-bottom:3.5rem}.md\:mb-16{margin-bottom:4rem}.md\:mb-20{margin-bottom:5rem}.md\:mb-24{margin-bottom:6rem}.md\:mb-28{margin-bottom:7rem}.md\:mb-32{margin-bottom:8rem}.md\:mb-36{margin-bottom:9rem}.md\:mb-40{margin-bottom:10rem}.md\:mb-44{margin-bottom:11rem}.md\:mb-48{margin-bottom:12rem}.md\:mb-52{margin-bottom:13rem}.md\:mb-56{margin-bottom:14rem}.md\:mb-60{margin-bottom:15rem}.md\:mb-64{margin-bottom:16rem}.md\:mb-72{margin-bottom:18rem}.md\:mb-80{margin-bottom:20rem}.md\:mb-96{margin-bottom:24rem}.md\:mb-auto{margin-bottom:auto}.md\:mb-px{margin-bottom:1px}.md\:mb-0\.5{margin-bottom:.125rem}.md\:mb-1\.5{margin-bottom:.375rem}.md\:mb-2\.5{margin-bottom:.625rem}.md\:mb-3\.5{margin-bottom:.875rem}.md\:-mb-0{margin-bottom:0}.md\:-mb-1{margin-bottom:-.25rem}.md\:-mb-2{margin-bottom:-.5rem}.md\:-mb-3{margin-bottom:-.75rem}.md\:-mb-4{margin-bottom:-1rem}.md\:-mb-5{margin-bottom:-1.25rem}.md\:-mb-6{margin-bottom:-1.5rem}.md\:-mb-7{margin-bottom:-1.75rem}.md\:-mb-8{margin-bottom:-2rem}.md\:-mb-9{margin-bottom:-2.25rem}.md\:-mb-10{margin-bottom:-2.5rem}.md\:-mb-11{margin-bottom:-2.75rem}.md\:-mb-12{margin-bottom:-3rem}.md\:-mb-14{margin-bottom:-3.5rem}.md\:-mb-16{margin-bottom:-4rem}.md\:-mb-20{margin-bottom:-5rem}.md\:-mb-24{margin-bottom:-6rem}.md\:-mb-28{margin-bottom:-7rem}.md\:-mb-32{margin-bottom:-8rem}.md\:-mb-36{margin-bottom:-9rem}.md\:-mb-40{margin-bottom:-10rem}.md\:-mb-44{margin-bottom:-11rem}.md\:-mb-48{margin-bottom:-12rem}.md\:-mb-52{margin-bottom:-13rem}.md\:-mb-56{margin-bottom:-14rem}.md\:-mb-60{margin-bottom:-15rem}.md\:-mb-64{margin-bottom:-16rem}.md\:-mb-72{margin-bottom:-18rem}.md\:-mb-80{margin-bottom:-20rem}.md\:-mb-96{margin-bottom:-24rem}.md\:-mb-px{margin-bottom:-1px}.md\:-mb-0\.5{margin-bottom:-.125rem}.md\:-mb-1\.5{margin-bottom:-.375rem}.md\:-mb-2\.5{margin-bottom:-.625rem}.md\:-mb-3\.5{margin-bottom:-.875rem}.md\:ml-0{margin-left:0}.md\:ml-1{margin-left:.25rem}.md\:ml-2{margin-left:.5rem}.md\:ml-3{margin-left:.75rem}.md\:ml-4{margin-left:1rem}.md\:ml-5{margin-left:1.25rem}.md\:ml-6{margin-left:1.5rem}.md\:ml-7{margin-left:1.75rem}.md\:ml-8{margin-left:2rem}.md\:ml-9{margin-left:2.25rem}.md\:ml-10{margin-left:2.5rem}.md\:ml-11{margin-left:2.75rem}.md\:ml-12{margin-left:3rem}.md\:ml-14{margin-left:3.5rem}.md\:ml-16{margin-left:4rem}.md\:ml-20{margin-left:5rem}.md\:ml-24{margin-left:6rem}.md\:ml-28{margin-left:7rem}.md\:ml-32{margin-left:8rem}.md\:ml-36{margin-left:9rem}.md\:ml-40{margin-left:10rem}.md\:ml-44{margin-left:11rem}.md\:ml-48{margin-left:12rem}.md\:ml-52{margin-left:13rem}.md\:ml-56{margin-left:14rem}.md\:ml-60{margin-left:15rem}.md\:ml-64{margin-left:16rem}.md\:ml-72{margin-left:18rem}.md\:ml-80{margin-left:20rem}.md\:ml-96{margin-left:24rem}.md\:ml-auto{margin-left:auto}.md\:ml-px{margin-left:1px}.md\:ml-0\.5{margin-left:.125rem}.md\:ml-1\.5{margin-left:.375rem}.md\:ml-2\.5{margin-left:.625rem}.md\:ml-3\.5{margin-left:.875rem}.md\:-ml-0{margin-left:0}.md\:-ml-1{margin-left:-.25rem}.md\:-ml-2{margin-left:-.5rem}.md\:-ml-3{margin-left:-.75rem}.md\:-ml-4{margin-left:-1rem}.md\:-ml-5{margin-left:-1.25rem}.md\:-ml-6{margin-left:-1.5rem}.md\:-ml-7{margin-left:-1.75rem}.md\:-ml-8{margin-left:-2rem}.md\:-ml-9{margin-left:-2.25rem}.md\:-ml-10{margin-left:-2.5rem}.md\:-ml-11{margin-left:-2.75rem}.md\:-ml-12{margin-left:-3rem}.md\:-ml-14{margin-left:-3.5rem}.md\:-ml-16{margin-left:-4rem}.md\:-ml-20{margin-left:-5rem}.md\:-ml-24{margin-left:-6rem}.md\:-ml-28{margin-left:-7rem}.md\:-ml-32{margin-left:-8rem}.md\:-ml-36{margin-left:-9rem}.md\:-ml-40{margin-left:-10rem}.md\:-ml-44{margin-left:-11rem}.md\:-ml-48{margin-left:-12rem}.md\:-ml-52{margin-left:-13rem}.md\:-ml-56{margin-left:-14rem}.md\:-ml-60{margin-left:-15rem}.md\:-ml-64{margin-left:-16rem}.md\:-ml-72{margin-left:-18rem}.md\:-ml-80{margin-left:-20rem}.md\:-ml-96{margin-left:-24rem}.md\:-ml-px{margin-left:-1px}.md\:-ml-0\.5{margin-left:-.125rem}.md\:-ml-1\.5{margin-left:-.375rem}.md\:-ml-2\.5{margin-left:-.625rem}.md\:-ml-3\.5{margin-left:-.875rem}.md\:box-border{box-sizing:border-box}.md\:box-content{box-sizing:initial}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:table{display:table}.md\:inline-table{display:inline-table}.md\:table-caption{display:table-caption}.md\:table-cell{display:table-cell}.md\:table-column{display:table-column}.md\:table-column-group{display:table-column-group}.md\:table-footer-group{display:table-footer-group}.md\:table-header-group{display:table-header-group}.md\:table-row-group{display:table-row-group}.md\:table-row{display:table-row}.md\:flow-root{display:flow-root}.md\:grid{display:grid}.md\:inline-grid{display:inline-grid}.md\:contents{display:contents}.md\:list-item{display:list-item}.md\:hidden{display:none}.md\:h-0{height:0}.md\:h-1{height:.25rem}.md\:h-2{height:.5rem}.md\:h-3{height:.75rem}.md\:h-4{height:1rem}.md\:h-5{height:1.25rem}.md\:h-6{height:1.5rem}.md\:h-7{height:1.75rem}.md\:h-8{height:2rem}.md\:h-9{height:2.25rem}.md\:h-10{height:2.5rem}.md\:h-11{height:2.75rem}.md\:h-12{height:3rem}.md\:h-14{height:3.5rem}.md\:h-16{height:4rem}.md\:h-20{height:5rem}.md\:h-24{height:6rem}.md\:h-28{height:7rem}.md\:h-32{height:8rem}.md\:h-36{height:9rem}.md\:h-40{height:10rem}.md\:h-44{height:11rem}.md\:h-48{height:12rem}.md\:h-52{height:13rem}.md\:h-56{height:14rem}.md\:h-60{height:15rem}.md\:h-64{height:16rem}.md\:h-72{height:18rem}.md\:h-80{height:20rem}.md\:h-96{height:24rem}.md\:h-auto{height:auto}.md\:h-px{height:1px}.md\:h-0\.5{height:.125rem}.md\:h-1\.5{height:.375rem}.md\:h-2\.5{height:.625rem}.md\:h-3\.5{height:.875rem}.md\:h-1\/2{height:50%}.md\:h-1\/3{height:33.333333%}.md\:h-2\/3{height:66.666667%}.md\:h-1\/4{height:25%}.md\:h-2\/4{height:50%}.md\:h-3\/4{height:75%}.md\:h-1\/5{height:20%}.md\:h-2\/5{height:40%}.md\:h-3\/5{height:60%}.md\:h-4\/5{height:80%}.md\:h-1\/6{height:16.666667%}.md\:h-2\/6{height:33.333333%}.md\:h-3\/6{height:50%}.md\:h-4\/6{height:66.666667%}.md\:h-5\/6{height:83.333333%}.md\:h-full{height:100%}.md\:h-screen{height:100vh}.md\:max-h-0{max-height:0}.md\:max-h-1{max-height:.25rem}.md\:max-h-2{max-height:.5rem}.md\:max-h-3{max-height:.75rem}.md\:max-h-4{max-height:1rem}.md\:max-h-5{max-height:1.25rem}.md\:max-h-6{max-height:1.5rem}.md\:max-h-7{max-height:1.75rem}.md\:max-h-8{max-height:2rem}.md\:max-h-9{max-height:2.25rem}.md\:max-h-10{max-height:2.5rem}.md\:max-h-11{max-height:2.75rem}.md\:max-h-12{max-height:3rem}.md\:max-h-14{max-height:3.5rem}.md\:max-h-16{max-height:4rem}.md\:max-h-20{max-height:5rem}.md\:max-h-24{max-height:6rem}.md\:max-h-28{max-height:7rem}.md\:max-h-32{max-height:8rem}.md\:max-h-36{max-height:9rem}.md\:max-h-40{max-height:10rem}.md\:max-h-44{max-height:11rem}.md\:max-h-48{max-height:12rem}.md\:max-h-52{max-height:13rem}.md\:max-h-56{max-height:14rem}.md\:max-h-60{max-height:15rem}.md\:max-h-64{max-height:16rem}.md\:max-h-72{max-height:18rem}.md\:max-h-80{max-height:20rem}.md\:max-h-96{max-height:24rem}.md\:max-h-px{max-height:1px}.md\:max-h-0\.5{max-height:.125rem}.md\:max-h-1\.5{max-height:.375rem}.md\:max-h-2\.5{max-height:.625rem}.md\:max-h-3\.5{max-height:.875rem}.md\:max-h-full{max-height:100%}.md\:max-h-screen{max-height:100vh}.md\:min-h-0{min-height:0}.md\:min-h-full{min-height:100%}.md\:min-h-screen{min-height:100vh}.md\:w-0{width:0}.md\:w-1{width:.25rem}.md\:w-2{width:.5rem}.md\:w-3{width:.75rem}.md\:w-4{width:1rem}.md\:w-5{width:1.25rem}.md\:w-6{width:1.5rem}.md\:w-7{width:1.75rem}.md\:w-8{width:2rem}.md\:w-9{width:2.25rem}.md\:w-10{width:2.5rem}.md\:w-11{width:2.75rem}.md\:w-12{width:3rem}.md\:w-14{width:3.5rem}.md\:w-16{width:4rem}.md\:w-20{width:5rem}.md\:w-24{width:6rem}.md\:w-28{width:7rem}.md\:w-32{width:8rem}.md\:w-36{width:9rem}.md\:w-40{width:10rem}.md\:w-44{width:11rem}.md\:w-48{width:12rem}.md\:w-52{width:13rem}.md\:w-56{width:14rem}.md\:w-60{width:15rem}.md\:w-64{width:16rem}.md\:w-72{width:18rem}.md\:w-80{width:20rem}.md\:w-96{width:24rem}.md\:w-auto{width:auto}.md\:w-px{width:1px}.md\:w-0\.5{width:.125rem}.md\:w-1\.5{width:.375rem}.md\:w-2\.5{width:.625rem}.md\:w-3\.5{width:.875rem}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/4{width:25%}.md\:w-2\/4{width:50%}.md\:w-3\/4{width:75%}.md\:w-1\/5{width:20%}.md\:w-2\/5{width:40%}.md\:w-3\/5{width:60%}.md\:w-4\/5{width:80%}.md\:w-1\/6{width:16.666667%}.md\:w-2\/6{width:33.333333%}.md\:w-3\/6{width:50%}.md\:w-4\/6{width:66.666667%}.md\:w-5\/6{width:83.333333%}.md\:w-1\/12{width:8.333333%}.md\:w-2\/12{width:16.666667%}.md\:w-3\/12{width:25%}.md\:w-4\/12{width:33.333333%}.md\:w-5\/12{width:41.666667%}.md\:w-6\/12{width:50%}.md\:w-7\/12{width:58.333333%}.md\:w-8\/12{width:66.666667%}.md\:w-9\/12{width:75%}.md\:w-10\/12{width:83.333333%}.md\:w-11\/12{width:91.666667%}.md\:w-full{width:100%}.md\:w-screen{width:100vw}.md\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.md\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.md\:min-w-0{min-width:0}.md\:min-w-full{min-width:100%}.md\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.md\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.md\:max-w-0{max-width:0}.md\:max-w-none{max-width:none}.md\:max-w-xs{max-width:20rem}.md\:max-w-sm{max-width:24rem}.md\:max-w-md{max-width:28rem}.md\:max-w-lg{max-width:32rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-2xl{max-width:42rem}.md\:max-w-3xl{max-width:48rem}.md\:max-w-4xl{max-width:56rem}.md\:max-w-5xl{max-width:64rem}.md\:max-w-6xl{max-width:72rem}.md\:max-w-7xl{max-width:80rem}.md\:max-w-full{max-width:100%}.md\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.md\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.md\:max-w-prose{max-width:65ch}.md\:max-w-screen-sm{max-width:640px}.md\:max-w-screen-md{max-width:768px}.md\:max-w-screen-lg{max-width:1024px}.md\:max-w-screen-xl{max-width:1280px}.md\:max-w-screen-2xl{max-width:1536px}.md\:flex-1{flex:1 1 0%}.md\:flex-auto{flex:1 1 auto}.md\:flex-initial{flex:0 1 auto}.md\:flex-none{flex:none}.md\:flex-shrink-0{flex-shrink:0}.md\:flex-shrink{flex-shrink:1}.md\:flex-grow-0{flex-grow:0}.md\:flex-grow{flex-grow:1}.md\:table-auto{table-layout:auto}.md\:table-fixed{table-layout:fixed}.md\:border-collapse{border-collapse:collapse}.md\:border-separate{border-collapse:initial}.md\:origin-center{transform-origin:center}.md\:origin-top{transform-origin:top}.md\:origin-top-right{transform-origin:top right}.md\:origin-right{transform-origin:right}.md\:origin-bottom-right{transform-origin:bottom right}.md\:origin-bottom{transform-origin:bottom}.md\:origin-bottom-left{transform-origin:bottom left}.md\:origin-left{transform-origin:left}.md\:origin-top-left{transform-origin:top left}.md\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:transform,.md\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.md\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:transform-none{transform:none}.md\:translate-x-0{--tw-translate-x:0px}.md\:translate-x-1{--tw-translate-x:0.25rem}.md\:translate-x-2{--tw-translate-x:0.5rem}.md\:translate-x-3{--tw-translate-x:0.75rem}.md\:translate-x-4{--tw-translate-x:1rem}.md\:translate-x-5{--tw-translate-x:1.25rem}.md\:translate-x-6{--tw-translate-x:1.5rem}.md\:translate-x-7{--tw-translate-x:1.75rem}.md\:translate-x-8{--tw-translate-x:2rem}.md\:translate-x-9{--tw-translate-x:2.25rem}.md\:translate-x-10{--tw-translate-x:2.5rem}.md\:translate-x-11{--tw-translate-x:2.75rem}.md\:translate-x-12{--tw-translate-x:3rem}.md\:translate-x-14{--tw-translate-x:3.5rem}.md\:translate-x-16{--tw-translate-x:4rem}.md\:translate-x-20{--tw-translate-x:5rem}.md\:translate-x-24{--tw-translate-x:6rem}.md\:translate-x-28{--tw-translate-x:7rem}.md\:translate-x-32{--tw-translate-x:8rem}.md\:translate-x-36{--tw-translate-x:9rem}.md\:translate-x-40{--tw-translate-x:10rem}.md\:translate-x-44{--tw-translate-x:11rem}.md\:translate-x-48{--tw-translate-x:12rem}.md\:translate-x-52{--tw-translate-x:13rem}.md\:translate-x-56{--tw-translate-x:14rem}.md\:translate-x-60{--tw-translate-x:15rem}.md\:translate-x-64{--tw-translate-x:16rem}.md\:translate-x-72{--tw-translate-x:18rem}.md\:translate-x-80{--tw-translate-x:20rem}.md\:translate-x-96{--tw-translate-x:24rem}.md\:translate-x-px{--tw-translate-x:1px}.md\:translate-x-0\.5{--tw-translate-x:0.125rem}.md\:translate-x-1\.5{--tw-translate-x:0.375rem}.md\:translate-x-2\.5{--tw-translate-x:0.625rem}.md\:translate-x-3\.5{--tw-translate-x:0.875rem}.md\:-translate-x-0{--tw-translate-x:0px}.md\:-translate-x-1{--tw-translate-x:-0.25rem}.md\:-translate-x-2{--tw-translate-x:-0.5rem}.md\:-translate-x-3{--tw-translate-x:-0.75rem}.md\:-translate-x-4{--tw-translate-x:-1rem}.md\:-translate-x-5{--tw-translate-x:-1.25rem}.md\:-translate-x-6{--tw-translate-x:-1.5rem}.md\:-translate-x-7{--tw-translate-x:-1.75rem}.md\:-translate-x-8{--tw-translate-x:-2rem}.md\:-translate-x-9{--tw-translate-x:-2.25rem}.md\:-translate-x-10{--tw-translate-x:-2.5rem}.md\:-translate-x-11{--tw-translate-x:-2.75rem}.md\:-translate-x-12{--tw-translate-x:-3rem}.md\:-translate-x-14{--tw-translate-x:-3.5rem}.md\:-translate-x-16{--tw-translate-x:-4rem}.md\:-translate-x-20{--tw-translate-x:-5rem}.md\:-translate-x-24{--tw-translate-x:-6rem}.md\:-translate-x-28{--tw-translate-x:-7rem}.md\:-translate-x-32{--tw-translate-x:-8rem}.md\:-translate-x-36{--tw-translate-x:-9rem}.md\:-translate-x-40{--tw-translate-x:-10rem}.md\:-translate-x-44{--tw-translate-x:-11rem}.md\:-translate-x-48{--tw-translate-x:-12rem}.md\:-translate-x-52{--tw-translate-x:-13rem}.md\:-translate-x-56{--tw-translate-x:-14rem}.md\:-translate-x-60{--tw-translate-x:-15rem}.md\:-translate-x-64{--tw-translate-x:-16rem}.md\:-translate-x-72{--tw-translate-x:-18rem}.md\:-translate-x-80{--tw-translate-x:-20rem}.md\:-translate-x-96{--tw-translate-x:-24rem}.md\:-translate-x-px{--tw-translate-x:-1px}.md\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.md\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.md\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.md\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.md\:translate-x-1\/2{--tw-translate-x:50%}.md\:translate-x-1\/3{--tw-translate-x:33.333333%}.md\:translate-x-2\/3{--tw-translate-x:66.666667%}.md\:translate-x-1\/4{--tw-translate-x:25%}.md\:translate-x-2\/4{--tw-translate-x:50%}.md\:translate-x-3\/4{--tw-translate-x:75%}.md\:translate-x-full{--tw-translate-x:100%}.md\:-translate-x-1\/2{--tw-translate-x:-50%}.md\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.md\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.md\:-translate-x-1\/4{--tw-translate-x:-25%}.md\:-translate-x-2\/4{--tw-translate-x:-50%}.md\:-translate-x-3\/4{--tw-translate-x:-75%}.md\:-translate-x-full{--tw-translate-x:-100%}.md\:translate-y-0{--tw-translate-y:0px}.md\:translate-y-1{--tw-translate-y:0.25rem}.md\:translate-y-2{--tw-translate-y:0.5rem}.md\:translate-y-3{--tw-translate-y:0.75rem}.md\:translate-y-4{--tw-translate-y:1rem}.md\:translate-y-5{--tw-translate-y:1.25rem}.md\:translate-y-6{--tw-translate-y:1.5rem}.md\:translate-y-7{--tw-translate-y:1.75rem}.md\:translate-y-8{--tw-translate-y:2rem}.md\:translate-y-9{--tw-translate-y:2.25rem}.md\:translate-y-10{--tw-translate-y:2.5rem}.md\:translate-y-11{--tw-translate-y:2.75rem}.md\:translate-y-12{--tw-translate-y:3rem}.md\:translate-y-14{--tw-translate-y:3.5rem}.md\:translate-y-16{--tw-translate-y:4rem}.md\:translate-y-20{--tw-translate-y:5rem}.md\:translate-y-24{--tw-translate-y:6rem}.md\:translate-y-28{--tw-translate-y:7rem}.md\:translate-y-32{--tw-translate-y:8rem}.md\:translate-y-36{--tw-translate-y:9rem}.md\:translate-y-40{--tw-translate-y:10rem}.md\:translate-y-44{--tw-translate-y:11rem}.md\:translate-y-48{--tw-translate-y:12rem}.md\:translate-y-52{--tw-translate-y:13rem}.md\:translate-y-56{--tw-translate-y:14rem}.md\:translate-y-60{--tw-translate-y:15rem}.md\:translate-y-64{--tw-translate-y:16rem}.md\:translate-y-72{--tw-translate-y:18rem}.md\:translate-y-80{--tw-translate-y:20rem}.md\:translate-y-96{--tw-translate-y:24rem}.md\:translate-y-px{--tw-translate-y:1px}.md\:translate-y-0\.5{--tw-translate-y:0.125rem}.md\:translate-y-1\.5{--tw-translate-y:0.375rem}.md\:translate-y-2\.5{--tw-translate-y:0.625rem}.md\:translate-y-3\.5{--tw-translate-y:0.875rem}.md\:-translate-y-0{--tw-translate-y:0px}.md\:-translate-y-1{--tw-translate-y:-0.25rem}.md\:-translate-y-2{--tw-translate-y:-0.5rem}.md\:-translate-y-3{--tw-translate-y:-0.75rem}.md\:-translate-y-4{--tw-translate-y:-1rem}.md\:-translate-y-5{--tw-translate-y:-1.25rem}.md\:-translate-y-6{--tw-translate-y:-1.5rem}.md\:-translate-y-7{--tw-translate-y:-1.75rem}.md\:-translate-y-8{--tw-translate-y:-2rem}.md\:-translate-y-9{--tw-translate-y:-2.25rem}.md\:-translate-y-10{--tw-translate-y:-2.5rem}.md\:-translate-y-11{--tw-translate-y:-2.75rem}.md\:-translate-y-12{--tw-translate-y:-3rem}.md\:-translate-y-14{--tw-translate-y:-3.5rem}.md\:-translate-y-16{--tw-translate-y:-4rem}.md\:-translate-y-20{--tw-translate-y:-5rem}.md\:-translate-y-24{--tw-translate-y:-6rem}.md\:-translate-y-28{--tw-translate-y:-7rem}.md\:-translate-y-32{--tw-translate-y:-8rem}.md\:-translate-y-36{--tw-translate-y:-9rem}.md\:-translate-y-40{--tw-translate-y:-10rem}.md\:-translate-y-44{--tw-translate-y:-11rem}.md\:-translate-y-48{--tw-translate-y:-12rem}.md\:-translate-y-52{--tw-translate-y:-13rem}.md\:-translate-y-56{--tw-translate-y:-14rem}.md\:-translate-y-60{--tw-translate-y:-15rem}.md\:-translate-y-64{--tw-translate-y:-16rem}.md\:-translate-y-72{--tw-translate-y:-18rem}.md\:-translate-y-80{--tw-translate-y:-20rem}.md\:-translate-y-96{--tw-translate-y:-24rem}.md\:-translate-y-px{--tw-translate-y:-1px}.md\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.md\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.md\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.md\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.md\:translate-y-1\/2{--tw-translate-y:50%}.md\:translate-y-1\/3{--tw-translate-y:33.333333%}.md\:translate-y-2\/3{--tw-translate-y:66.666667%}.md\:translate-y-1\/4{--tw-translate-y:25%}.md\:translate-y-2\/4{--tw-translate-y:50%}.md\:translate-y-3\/4{--tw-translate-y:75%}.md\:translate-y-full{--tw-translate-y:100%}.md\:-translate-y-1\/2{--tw-translate-y:-50%}.md\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.md\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.md\:-translate-y-1\/4{--tw-translate-y:-25%}.md\:-translate-y-2\/4{--tw-translate-y:-50%}.md\:-translate-y-3\/4{--tw-translate-y:-75%}.md\:-translate-y-full{--tw-translate-y:-100%}.md\:hover\:translate-x-0:hover{--tw-translate-x:0px}.md\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.md\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.md\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.md\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.md\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.md\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.md\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.md\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.md\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.md\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.md\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.md\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.md\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.md\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.md\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.md\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.md\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.md\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.md\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.md\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.md\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.md\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.md\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.md\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.md\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.md\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.md\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.md\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.md\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.md\:hover\:translate-x-px:hover{--tw-translate-x:1px}.md\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.md\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.md\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.md\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.md\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.md\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.md\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.md\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.md\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.md\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.md\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.md\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.md\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.md\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.md\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.md\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.md\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.md\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.md\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.md\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.md\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.md\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.md\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.md\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.md\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.md\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.md\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.md\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.md\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.md\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.md\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.md\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.md\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.md\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.md\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.md\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.md\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.md\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.md\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.md\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.md\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.md\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.md\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.md\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.md\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.md\:hover\:translate-x-full:hover{--tw-translate-x:100%}.md\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.md\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.md\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.md\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.md\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.md\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.md\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.md\:hover\:translate-y-0:hover{--tw-translate-y:0px}.md\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.md\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.md\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.md\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.md\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.md\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.md\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.md\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.md\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.md\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.md\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.md\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.md\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.md\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.md\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.md\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.md\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.md\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.md\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.md\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.md\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.md\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.md\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.md\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.md\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.md\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.md\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.md\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.md\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.md\:hover\:translate-y-px:hover{--tw-translate-y:1px}.md\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.md\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.md\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.md\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.md\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.md\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.md\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.md\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.md\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.md\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.md\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.md\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.md\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.md\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.md\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.md\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.md\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.md\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.md\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.md\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.md\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.md\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.md\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.md\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.md\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.md\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.md\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.md\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.md\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.md\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.md\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.md\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.md\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.md\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.md\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.md\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.md\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.md\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.md\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.md\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.md\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.md\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.md\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.md\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.md\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.md\:hover\:translate-y-full:hover{--tw-translate-y:100%}.md\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.md\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.md\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.md\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.md\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.md\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.md\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.md\:focus\:translate-x-0:focus{--tw-translate-x:0px}.md\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.md\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.md\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.md\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.md\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.md\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.md\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.md\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.md\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.md\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.md\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.md\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.md\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.md\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.md\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.md\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.md\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.md\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.md\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.md\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.md\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.md\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.md\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.md\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.md\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.md\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.md\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.md\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.md\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.md\:focus\:translate-x-px:focus{--tw-translate-x:1px}.md\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.md\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.md\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.md\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.md\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.md\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.md\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.md\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.md\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.md\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.md\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.md\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.md\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.md\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.md\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.md\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.md\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.md\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.md\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.md\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.md\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.md\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.md\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.md\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.md\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.md\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.md\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.md\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.md\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.md\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.md\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.md\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.md\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.md\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.md\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.md\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.md\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.md\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.md\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.md\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.md\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.md\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.md\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.md\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.md\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.md\:focus\:translate-x-full:focus{--tw-translate-x:100%}.md\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.md\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.md\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.md\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.md\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.md\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.md\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.md\:focus\:translate-y-0:focus{--tw-translate-y:0px}.md\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.md\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.md\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.md\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.md\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.md\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.md\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.md\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.md\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.md\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.md\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.md\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.md\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.md\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.md\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.md\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.md\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.md\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.md\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.md\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.md\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.md\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.md\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.md\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.md\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.md\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.md\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.md\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.md\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.md\:focus\:translate-y-px:focus{--tw-translate-y:1px}.md\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.md\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.md\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.md\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.md\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.md\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.md\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.md\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.md\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.md\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.md\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.md\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.md\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.md\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.md\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.md\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.md\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.md\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.md\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.md\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.md\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.md\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.md\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.md\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.md\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.md\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.md\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.md\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.md\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.md\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.md\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.md\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.md\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.md\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.md\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.md\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.md\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.md\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.md\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.md\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.md\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.md\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.md\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.md\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.md\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.md\:focus\:translate-y-full:focus{--tw-translate-y:100%}.md\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.md\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.md\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.md\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.md\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.md\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.md\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.md\:rotate-0{--tw-rotate:0deg}.md\:rotate-1{--tw-rotate:1deg}.md\:rotate-2{--tw-rotate:2deg}.md\:rotate-3{--tw-rotate:3deg}.md\:rotate-6{--tw-rotate:6deg}.md\:rotate-12{--tw-rotate:12deg}.md\:rotate-45{--tw-rotate:45deg}.md\:rotate-90{--tw-rotate:90deg}.md\:rotate-180{--tw-rotate:180deg}.md\:-rotate-180{--tw-rotate:-180deg}.md\:-rotate-90{--tw-rotate:-90deg}.md\:-rotate-45{--tw-rotate:-45deg}.md\:-rotate-12{--tw-rotate:-12deg}.md\:-rotate-6{--tw-rotate:-6deg}.md\:-rotate-3{--tw-rotate:-3deg}.md\:-rotate-2{--tw-rotate:-2deg}.md\:-rotate-1{--tw-rotate:-1deg}.md\:hover\:rotate-0:hover{--tw-rotate:0deg}.md\:hover\:rotate-1:hover{--tw-rotate:1deg}.md\:hover\:rotate-2:hover{--tw-rotate:2deg}.md\:hover\:rotate-3:hover{--tw-rotate:3deg}.md\:hover\:rotate-6:hover{--tw-rotate:6deg}.md\:hover\:rotate-12:hover{--tw-rotate:12deg}.md\:hover\:rotate-45:hover{--tw-rotate:45deg}.md\:hover\:rotate-90:hover{--tw-rotate:90deg}.md\:hover\:rotate-180:hover{--tw-rotate:180deg}.md\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.md\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.md\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.md\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.md\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.md\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.md\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.md\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.md\:focus\:rotate-0:focus{--tw-rotate:0deg}.md\:focus\:rotate-1:focus{--tw-rotate:1deg}.md\:focus\:rotate-2:focus{--tw-rotate:2deg}.md\:focus\:rotate-3:focus{--tw-rotate:3deg}.md\:focus\:rotate-6:focus{--tw-rotate:6deg}.md\:focus\:rotate-12:focus{--tw-rotate:12deg}.md\:focus\:rotate-45:focus{--tw-rotate:45deg}.md\:focus\:rotate-90:focus{--tw-rotate:90deg}.md\:focus\:rotate-180:focus{--tw-rotate:180deg}.md\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.md\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.md\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.md\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.md\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.md\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.md\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.md\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.md\:skew-x-0{--tw-skew-x:0deg}.md\:skew-x-1{--tw-skew-x:1deg}.md\:skew-x-2{--tw-skew-x:2deg}.md\:skew-x-3{--tw-skew-x:3deg}.md\:skew-x-6{--tw-skew-x:6deg}.md\:skew-x-12{--tw-skew-x:12deg}.md\:-skew-x-12{--tw-skew-x:-12deg}.md\:-skew-x-6{--tw-skew-x:-6deg}.md\:-skew-x-3{--tw-skew-x:-3deg}.md\:-skew-x-2{--tw-skew-x:-2deg}.md\:-skew-x-1{--tw-skew-x:-1deg}.md\:skew-y-0{--tw-skew-y:0deg}.md\:skew-y-1{--tw-skew-y:1deg}.md\:skew-y-2{--tw-skew-y:2deg}.md\:skew-y-3{--tw-skew-y:3deg}.md\:skew-y-6{--tw-skew-y:6deg}.md\:skew-y-12{--tw-skew-y:12deg}.md\:-skew-y-12{--tw-skew-y:-12deg}.md\:-skew-y-6{--tw-skew-y:-6deg}.md\:-skew-y-3{--tw-skew-y:-3deg}.md\:-skew-y-2{--tw-skew-y:-2deg}.md\:-skew-y-1{--tw-skew-y:-1deg}.md\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.md\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.md\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.md\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.md\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.md\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.md\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.md\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.md\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.md\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.md\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.md\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.md\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.md\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.md\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.md\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.md\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.md\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.md\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.md\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.md\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.md\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.md\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.md\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.md\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.md\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.md\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.md\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.md\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.md\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.md\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.md\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.md\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.md\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.md\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.md\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.md\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.md\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.md\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.md\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.md\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.md\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.md\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.md\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.md\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.md\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.md\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.md\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.md\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.md\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.md\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.md\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.md\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.md\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.md\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.md\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.md\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.md\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.md\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.md\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.md\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.md\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.md\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.md\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.md\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.md\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.md\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.md\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.md\:scale-x-0{--tw-scale-x:0}.md\:scale-x-50{--tw-scale-x:.5}.md\:scale-x-75{--tw-scale-x:.75}.md\:scale-x-90{--tw-scale-x:.9}.md\:scale-x-95{--tw-scale-x:.95}.md\:scale-x-100{--tw-scale-x:1}.md\:scale-x-105{--tw-scale-x:1.05}.md\:scale-x-110{--tw-scale-x:1.1}.md\:scale-x-125{--tw-scale-x:1.25}.md\:scale-x-150{--tw-scale-x:1.5}.md\:scale-y-0{--tw-scale-y:0}.md\:scale-y-50{--tw-scale-y:.5}.md\:scale-y-75{--tw-scale-y:.75}.md\:scale-y-90{--tw-scale-y:.9}.md\:scale-y-95{--tw-scale-y:.95}.md\:scale-y-100{--tw-scale-y:1}.md\:scale-y-105{--tw-scale-y:1.05}.md\:scale-y-110{--tw-scale-y:1.1}.md\:scale-y-125{--tw-scale-y:1.25}.md\:scale-y-150{--tw-scale-y:1.5}.md\:hover\:scale-x-0:hover{--tw-scale-x:0}.md\:hover\:scale-x-50:hover{--tw-scale-x:.5}.md\:hover\:scale-x-75:hover{--tw-scale-x:.75}.md\:hover\:scale-x-90:hover{--tw-scale-x:.9}.md\:hover\:scale-x-95:hover{--tw-scale-x:.95}.md\:hover\:scale-x-100:hover{--tw-scale-x:1}.md\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.md\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.md\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.md\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.md\:hover\:scale-y-0:hover{--tw-scale-y:0}.md\:hover\:scale-y-50:hover{--tw-scale-y:.5}.md\:hover\:scale-y-75:hover{--tw-scale-y:.75}.md\:hover\:scale-y-90:hover{--tw-scale-y:.9}.md\:hover\:scale-y-95:hover{--tw-scale-y:.95}.md\:hover\:scale-y-100:hover{--tw-scale-y:1}.md\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.md\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.md\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.md\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.md\:focus\:scale-x-0:focus{--tw-scale-x:0}.md\:focus\:scale-x-50:focus{--tw-scale-x:.5}.md\:focus\:scale-x-75:focus{--tw-scale-x:.75}.md\:focus\:scale-x-90:focus{--tw-scale-x:.9}.md\:focus\:scale-x-95:focus{--tw-scale-x:.95}.md\:focus\:scale-x-100:focus{--tw-scale-x:1}.md\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.md\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.md\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.md\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.md\:focus\:scale-y-0:focus{--tw-scale-y:0}.md\:focus\:scale-y-50:focus{--tw-scale-y:.5}.md\:focus\:scale-y-75:focus{--tw-scale-y:.75}.md\:focus\:scale-y-90:focus{--tw-scale-y:.9}.md\:focus\:scale-y-95:focus{--tw-scale-y:.95}.md\:focus\:scale-y-100:focus{--tw-scale-y:1}.md\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.md\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.md\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.md\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.md\:animate-none{-webkit-animation:none;animation:none}.md\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.md\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.md\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.md\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.md\:cursor-auto{cursor:auto}.md\:cursor-default{cursor:default}.md\:cursor-pointer{cursor:pointer}.md\:cursor-wait{cursor:wait}.md\:cursor-text{cursor:text}.md\:cursor-move{cursor:move}.md\:cursor-help{cursor:help}.md\:cursor-not-allowed{cursor:not-allowed}.md\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.md\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.md\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.md\:resize-none{resize:none}.md\:resize-y{resize:vertical}.md\:resize-x{resize:horizontal}.md\:resize{resize:both}.md\:list-inside{list-style-position:inside}.md\:list-outside{list-style-position:outside}.md\:list-none{list-style-type:none}.md\:list-disc{list-style-type:disc}.md\:list-decimal{list-style-type:decimal}.md\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.md\:auto-cols-auto{grid-auto-columns:auto}.md\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.md\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.md\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.md\:grid-flow-row{grid-auto-flow:row}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-flow-row-dense{grid-auto-flow:row dense}.md\:grid-flow-col-dense{grid-auto-flow:column dense}.md\:auto-rows-auto{grid-auto-rows:auto}.md\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.md\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.md\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.md\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.md\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.md\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.md\:grid-rows-none{grid-template-rows:none}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-col{flex-direction:column}.md\:flex-col-reverse{flex-direction:column-reverse}.md\:flex-wrap{flex-wrap:wrap}.md\:flex-wrap-reverse{flex-wrap:wrap-reverse}.md\:flex-nowrap{flex-wrap:nowrap}.md\:place-content-center{place-content:center}.md\:place-content-start{place-content:start}.md\:place-content-end{place-content:end}.md\:place-content-between{place-content:space-between}.md\:place-content-around{place-content:space-around}.md\:place-content-evenly{place-content:space-evenly}.md\:place-content-stretch{place-content:stretch}.md\:place-items-start{place-items:start}.md\:place-items-end{place-items:end}.md\:place-items-center{place-items:center}.md\:place-items-stretch{place-items:stretch}.md\:content-center{align-content:center}.md\:content-start{align-content:flex-start}.md\:content-end{align-content:flex-end}.md\:content-between{align-content:space-between}.md\:content-around{align-content:space-around}.md\:content-evenly{align-content:space-evenly}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:items-baseline{align-items:baseline}.md\:items-stretch{align-items:stretch}.md\:justify-start{justify-content:flex-start}.md\:justify-end{justify-content:flex-end}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:justify-around{justify-content:space-around}.md\:justify-evenly{justify-content:space-evenly}.md\:justify-items-start{justify-items:start}.md\:justify-items-end{justify-items:end}.md\:justify-items-center{justify-items:center}.md\:justify-items-stretch{justify-items:stretch}.md\:gap-0{gap:0}.md\:gap-1{gap:.25rem}.md\:gap-2{gap:.5rem}.md\:gap-3{gap:.75rem}.md\:gap-4{gap:1rem}.md\:gap-5{gap:1.25rem}.md\:gap-6{gap:1.5rem}.md\:gap-7{gap:1.75rem}.md\:gap-8{gap:2rem}.md\:gap-9{gap:2.25rem}.md\:gap-10{gap:2.5rem}.md\:gap-11{gap:2.75rem}.md\:gap-12{gap:3rem}.md\:gap-14{gap:3.5rem}.md\:gap-16{gap:4rem}.md\:gap-20{gap:5rem}.md\:gap-24{gap:6rem}.md\:gap-28{gap:7rem}.md\:gap-32{gap:8rem}.md\:gap-36{gap:9rem}.md\:gap-40{gap:10rem}.md\:gap-44{gap:11rem}.md\:gap-48{gap:12rem}.md\:gap-52{gap:13rem}.md\:gap-56{gap:14rem}.md\:gap-60{gap:15rem}.md\:gap-64{gap:16rem}.md\:gap-72{gap:18rem}.md\:gap-80{gap:20rem}.md\:gap-96{gap:24rem}.md\:gap-px{gap:1px}.md\:gap-0\.5{gap:.125rem}.md\:gap-1\.5{gap:.375rem}.md\:gap-2\.5{gap:.625rem}.md\:gap-3\.5{gap:.875rem}.md\:gap-x-0{-moz-column-gap:0;column-gap:0}.md\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.md\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.md\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.md\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.md\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.md\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.md\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.md\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.md\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.md\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.md\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.md\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.md\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.md\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.md\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.md\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.md\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.md\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.md\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.md\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.md\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.md\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.md\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.md\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.md\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.md\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.md\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.md\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.md\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.md\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.md\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.md\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.md\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.md\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.md\:gap-y-0{row-gap:0}.md\:gap-y-1{row-gap:.25rem}.md\:gap-y-2{row-gap:.5rem}.md\:gap-y-3{row-gap:.75rem}.md\:gap-y-4{row-gap:1rem}.md\:gap-y-5{row-gap:1.25rem}.md\:gap-y-6{row-gap:1.5rem}.md\:gap-y-7{row-gap:1.75rem}.md\:gap-y-8{row-gap:2rem}.md\:gap-y-9{row-gap:2.25rem}.md\:gap-y-10{row-gap:2.5rem}.md\:gap-y-11{row-gap:2.75rem}.md\:gap-y-12{row-gap:3rem}.md\:gap-y-14{row-gap:3.5rem}.md\:gap-y-16{row-gap:4rem}.md\:gap-y-20{row-gap:5rem}.md\:gap-y-24{row-gap:6rem}.md\:gap-y-28{row-gap:7rem}.md\:gap-y-32{row-gap:8rem}.md\:gap-y-36{row-gap:9rem}.md\:gap-y-40{row-gap:10rem}.md\:gap-y-44{row-gap:11rem}.md\:gap-y-48{row-gap:12rem}.md\:gap-y-52{row-gap:13rem}.md\:gap-y-56{row-gap:14rem}.md\:gap-y-60{row-gap:15rem}.md\:gap-y-64{row-gap:16rem}.md\:gap-y-72{row-gap:18rem}.md\:gap-y-80{row-gap:20rem}.md\:gap-y-96{row-gap:24rem}.md\:gap-y-px{row-gap:1px}.md\:gap-y-0\.5{row-gap:.125rem}.md\:gap-y-1\.5{row-gap:.375rem}.md\:gap-y-2\.5{row-gap:.625rem}.md\:gap-y-3\.5{row-gap:.875rem}.md\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.md\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.md\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.md\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.md\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.md\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.md\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.md\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.md\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.md\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.md\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.md\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.md\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.md\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.md\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.md\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.md\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.md\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.md\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.md\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.md\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.md\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.md\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.md\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.md\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.md\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.md\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.md\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.md\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.md\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.md\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.md\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.md\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.md\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.md\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.md\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.md\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.md\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.md\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.md\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.md\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.md\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.md\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.md\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.md\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.md\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.md\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.md\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.md\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.md\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.md\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.md\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.md\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.md\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.md\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.md\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.md\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.md\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.md\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.md\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.md\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.md\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.md\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.md\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.md\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.md\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.md\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.md\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.md\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.md\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.md\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.md\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.md\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.md\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.md\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.md\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.md\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.md\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.md\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.md\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.md\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.md\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.md\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.md\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.md\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.md\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.md\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.md\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.md\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.md\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.md\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.md\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.md\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.md\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.md\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.md\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.md\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.md\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.md\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.md\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.md\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.md\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.md\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.md\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.md\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.md\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.md\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.md\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.md\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.md\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.md\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.md\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.md\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.md\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.md\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.md\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.md\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.md\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.md\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.md\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.md\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.md\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.md\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.md\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.md\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.md\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.md\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.md\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.md\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.md\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.md\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.md\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.md\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.md\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.md\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.md\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.md\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.md\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.md\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.md\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.md\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.md\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.md\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.md\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.md\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.md\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.md\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.md\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.md\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.md\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.md\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.md\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.md\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.md\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.md\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.md\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.md\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.md\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.md\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.md\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.md\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.md\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.md\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.md\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.md\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.md\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.md\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.md\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.md\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.md\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.md\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.md\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.md\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.md\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.md\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.md\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.md\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.md\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.md\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.md\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.md\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.md\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.md\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.md\:place-self-auto{place-self:auto}.md\:place-self-start{place-self:start}.md\:place-self-end{place-self:end}.md\:place-self-center{place-self:center}.md\:place-self-stretch{place-self:stretch}.md\:self-auto{align-self:auto}.md\:self-start{align-self:flex-start}.md\:self-end{align-self:flex-end}.md\:self-center{align-self:center}.md\:self-stretch{align-self:stretch}.md\:self-baseline{align-self:baseline}.md\:justify-self-auto{justify-self:auto}.md\:justify-self-start{justify-self:start}.md\:justify-self-end{justify-self:end}.md\:justify-self-center{justify-self:center}.md\:justify-self-stretch{justify-self:stretch}.md\:overflow-auto{overflow:auto}.md\:overflow-hidden{overflow:hidden}.md\:overflow-visible{overflow:visible}.md\:overflow-scroll{overflow:scroll}.md\:overflow-x-auto{overflow-x:auto}.md\:overflow-y-auto{overflow-y:auto}.md\:overflow-x-hidden{overflow-x:hidden}.md\:overflow-y-hidden{overflow-y:hidden}.md\:overflow-x-visible{overflow-x:visible}.md\:overflow-y-visible{overflow-y:visible}.md\:overflow-x-scroll{overflow-x:scroll}.md\:overflow-y-scroll{overflow-y:scroll}.md\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.md\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.md\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.md\:overscroll-y-auto{overscroll-behavior-y:auto}.md\:overscroll-y-contain{overscroll-behavior-y:contain}.md\:overscroll-y-none{overscroll-behavior-y:none}.md\:overscroll-x-auto{overscroll-behavior-x:auto}.md\:overscroll-x-contain{overscroll-behavior-x:contain}.md\:overscroll-x-none{overscroll-behavior-x:none}.md\:truncate{overflow:hidden;white-space:nowrap}.md\:overflow-ellipsis,.md\:truncate{text-overflow:ellipsis}.md\:overflow-clip{text-overflow:clip}.md\:whitespace-normal{white-space:normal}.md\:whitespace-nowrap{white-space:nowrap}.md\:whitespace-pre{white-space:pre}.md\:whitespace-pre-line{white-space:pre-line}.md\:whitespace-pre-wrap{white-space:pre-wrap}.md\:break-normal{overflow-wrap:normal;word-break:normal}.md\:break-words{overflow-wrap:break-word}.md\:break-all{word-break:break-all}.md\:rounded-none{border-radius:0}.md\:rounded-sm{border-radius:.125rem}.md\:rounded{border-radius:.25rem}.md\:rounded-md{border-radius:.375rem}.md\:rounded-lg{border-radius:.5rem}.md\:rounded-xl{border-radius:.75rem}.md\:rounded-2xl{border-radius:1rem}.md\:rounded-3xl{border-radius:1.5rem}.md\:rounded-full{border-radius:9999px}.md\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.md\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.md\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.md\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.md\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.md\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.md\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.md\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.md\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.md\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.md\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.md\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.md\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.md\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.md\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.md\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.md\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.md\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.md\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.md\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.md\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-tl-none{border-top-left-radius:0}.md\:rounded-tl-sm{border-top-left-radius:.125rem}.md\:rounded-tl{border-top-left-radius:.25rem}.md\:rounded-tl-md{border-top-left-radius:.375rem}.md\:rounded-tl-lg{border-top-left-radius:.5rem}.md\:rounded-tl-xl{border-top-left-radius:.75rem}.md\:rounded-tl-2xl{border-top-left-radius:1rem}.md\:rounded-tl-3xl{border-top-left-radius:1.5rem}.md\:rounded-tl-full{border-top-left-radius:9999px}.md\:rounded-tr-none{border-top-right-radius:0}.md\:rounded-tr-sm{border-top-right-radius:.125rem}.md\:rounded-tr{border-top-right-radius:.25rem}.md\:rounded-tr-md{border-top-right-radius:.375rem}.md\:rounded-tr-lg{border-top-right-radius:.5rem}.md\:rounded-tr-xl{border-top-right-radius:.75rem}.md\:rounded-tr-2xl{border-top-right-radius:1rem}.md\:rounded-tr-3xl{border-top-right-radius:1.5rem}.md\:rounded-tr-full{border-top-right-radius:9999px}.md\:rounded-br-none{border-bottom-right-radius:0}.md\:rounded-br-sm{border-bottom-right-radius:.125rem}.md\:rounded-br{border-bottom-right-radius:.25rem}.md\:rounded-br-md{border-bottom-right-radius:.375rem}.md\:rounded-br-lg{border-bottom-right-radius:.5rem}.md\:rounded-br-xl{border-bottom-right-radius:.75rem}.md\:rounded-br-2xl{border-bottom-right-radius:1rem}.md\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.md\:rounded-br-full{border-bottom-right-radius:9999px}.md\:rounded-bl-none{border-bottom-left-radius:0}.md\:rounded-bl-sm{border-bottom-left-radius:.125rem}.md\:rounded-bl{border-bottom-left-radius:.25rem}.md\:rounded-bl-md{border-bottom-left-radius:.375rem}.md\:rounded-bl-lg{border-bottom-left-radius:.5rem}.md\:rounded-bl-xl{border-bottom-left-radius:.75rem}.md\:rounded-bl-2xl{border-bottom-left-radius:1rem}.md\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.md\:rounded-bl-full{border-bottom-left-radius:9999px}.md\:border-0{border-width:0}.md\:border-2{border-width:2px}.md\:border-4{border-width:4px}.md\:border-8{border-width:8px}.md\:border{border-width:1px}.md\:border-t-0{border-top-width:0}.md\:border-t-2{border-top-width:2px}.md\:border-t-4{border-top-width:4px}.md\:border-t-8{border-top-width:8px}.md\:border-t{border-top-width:1px}.md\:border-r-0{border-right-width:0}.md\:border-r-2{border-right-width:2px}.md\:border-r-4{border-right-width:4px}.md\:border-r-8{border-right-width:8px}.md\:border-r{border-right-width:1px}.md\:border-b-0{border-bottom-width:0}.md\:border-b-2{border-bottom-width:2px}.md\:border-b-4{border-bottom-width:4px}.md\:border-b-8{border-bottom-width:8px}.md\:border-b{border-bottom-width:1px}.md\:border-l-0{border-left-width:0}.md\:border-l-2{border-left-width:2px}.md\:border-l-4{border-left-width:4px}.md\:border-l-8{border-left-width:8px}.md\:border-l{border-left-width:1px}.md\:border-solid{border-style:solid}.md\:border-dashed{border-style:dashed}.md\:border-dotted{border-style:dotted}.md\:border-double{border-style:double}.md\:border-none{border-style:none}.md\:border-transparent{border-color:transparent}.md\:border-current{border-color:currentColor}.md\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-transparent{border-color:transparent}.group:hover .md\:group-hover\:border-current{border-color:currentColor}.group:hover .md\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:focus-within\:border-transparent:focus-within{border-color:transparent}.md\:focus-within\:border-current:focus-within{border-color:currentColor}.md\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:hover\:border-transparent:hover{border-color:transparent}.md\:hover\:border-current:hover{border-color:currentColor}.md\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:focus\:border-transparent:focus{border-color:transparent}.md\:focus\:border-current:focus{border-color:currentColor}.md\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:border-opacity-0{--tw-border-opacity:0}.md\:border-opacity-5{--tw-border-opacity:0.05}.md\:border-opacity-10{--tw-border-opacity:0.1}.md\:border-opacity-20{--tw-border-opacity:0.2}.md\:border-opacity-25{--tw-border-opacity:0.25}.md\:border-opacity-30{--tw-border-opacity:0.3}.md\:border-opacity-40{--tw-border-opacity:0.4}.md\:border-opacity-50{--tw-border-opacity:0.5}.md\:border-opacity-60{--tw-border-opacity:0.6}.md\:border-opacity-70{--tw-border-opacity:0.7}.md\:border-opacity-75{--tw-border-opacity:0.75}.md\:border-opacity-80{--tw-border-opacity:0.8}.md\:border-opacity-90{--tw-border-opacity:0.9}.md\:border-opacity-95{--tw-border-opacity:0.95}.md\:border-opacity-100{--tw-border-opacity:1}.group:hover .md\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .md\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .md\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .md\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .md\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .md\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .md\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .md\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .md\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .md\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .md\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .md\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .md\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .md\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .md\:group-hover\:border-opacity-100{--tw-border-opacity:1}.md\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.md\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.md\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.md\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.md\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.md\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.md\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.md\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.md\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.md\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.md\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.md\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.md\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.md\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.md\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.md\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.md\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.md\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.md\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.md\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.md\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.md\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.md\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.md\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.md\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.md\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.md\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.md\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.md\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.md\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.md\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.md\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.md\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.md\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.md\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.md\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.md\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.md\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.md\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.md\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.md\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.md\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.md\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.md\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.md\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.md\:bg-transparent{background-color:initial}.md\:bg-current{background-color:currentColor}.md\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-transparent{background-color:initial}.group:hover .md\:group-hover\:bg-current{background-color:currentColor}.group:hover .md\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:focus-within\:bg-transparent:focus-within{background-color:initial}.md\:focus-within\:bg-current:focus-within{background-color:currentColor}.md\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:hover\:bg-transparent:hover{background-color:initial}.md\:hover\:bg-current:hover{background-color:currentColor}.md\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:focus\:bg-transparent:focus{background-color:initial}.md\:focus\:bg-current:focus{background-color:currentColor}.md\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:bg-opacity-0{--tw-bg-opacity:0}.md\:bg-opacity-5{--tw-bg-opacity:0.05}.md\:bg-opacity-10{--tw-bg-opacity:0.1}.md\:bg-opacity-20{--tw-bg-opacity:0.2}.md\:bg-opacity-25{--tw-bg-opacity:0.25}.md\:bg-opacity-30{--tw-bg-opacity:0.3}.md\:bg-opacity-40{--tw-bg-opacity:0.4}.md\:bg-opacity-50{--tw-bg-opacity:0.5}.md\:bg-opacity-60{--tw-bg-opacity:0.6}.md\:bg-opacity-70{--tw-bg-opacity:0.7}.md\:bg-opacity-75{--tw-bg-opacity:0.75}.md\:bg-opacity-80{--tw-bg-opacity:0.8}.md\:bg-opacity-90{--tw-bg-opacity:0.9}.md\:bg-opacity-95{--tw-bg-opacity:0.95}.md\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .md\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .md\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .md\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .md\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .md\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .md\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .md\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .md\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .md\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .md\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .md\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .md\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .md\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .md\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .md\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.md\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.md\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.md\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.md\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.md\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.md\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.md\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.md\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.md\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.md\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.md\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.md\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.md\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.md\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.md\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.md\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.md\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.md\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.md\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.md\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.md\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.md\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.md\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.md\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.md\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.md\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.md\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.md\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.md\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.md\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.md\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.md\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.md\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.md\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.md\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.md\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.md\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.md\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.md\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.md\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.md\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.md\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.md\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.md\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.md\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.md\:bg-none{background-image:none}.md\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.md\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.md\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.md\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.md\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.md\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.md\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.md\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.md\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.md\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.md\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.md\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.md\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.md\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.md\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.md\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.md\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.md\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.md\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.md\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.md\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.md\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.md\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.md\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.md\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.md\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.md\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.md\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.md\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.md\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.md\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.md\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.md\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.md\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.md\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.md\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.md\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.md\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.md\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.md\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.md\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.md\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.md\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.md\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.md\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.md\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.md\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.md\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.md\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.md\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.md\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.md\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.md\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.md\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.md\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.md\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.md\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.md\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.md\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.md\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.md\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.md\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.md\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.md\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.md\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.md\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.md\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.md\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.md\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.md\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.md\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.md\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.md\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.md\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.md\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.md\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.md\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.md\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.md\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.md\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.md\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.md\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.md\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.md\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.md\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.md\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.md\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.md\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.md\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.md\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.md\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.md\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.md\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.md\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.md\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.md\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.md\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.md\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.md\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.md\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.md\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.md\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.md\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.md\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.md\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.md\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.md\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.md\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.md\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.md\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.md\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.md\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.md\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.md\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.md\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.md\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.md\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.md\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.md\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.md\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.md\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.md\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.md\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.md\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.md\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.md\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.md\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.md\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.md\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.md\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.md\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.md\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.md\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.md\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.md\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.md\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.md\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.md\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.md\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.md\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.md\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.md\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.md\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.md\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.md\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.md\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.md\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.md\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.md\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.md\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.md\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.md\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.md\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.md\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.md\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.md\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.md\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.md\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.md\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.md\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.md\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.md\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.md\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.md\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.md\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.md\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.md\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.md\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.md\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.md\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.md\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.md\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.md\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.md\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.md\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.md\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.md\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.md\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.md\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.md\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.md\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.md\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.md\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.md\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.md\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.md\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.md\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.md\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.md\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.md\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.md\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.md\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.md\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.md\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.md\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.md\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.md\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.md\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.md\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.md\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.md\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.md\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.md\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.md\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.md\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.md\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.md\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.md\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.md\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.md\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.md\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.md\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.md\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.md\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.md\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.md\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.md\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.md\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.md\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.md\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.md\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.md\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.md\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.md\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.md\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.md\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.md\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.md\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.md\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.md\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.md\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.md\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.md\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.md\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.md\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.md\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.md\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.md\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.md\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.md\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.md\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.md\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.md\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.md\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.md\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.md\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.md\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.md\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.md\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.md\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.md\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.md\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.md\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.md\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.md\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.md\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.md\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.md\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.md\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.md\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.md\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.md\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.md\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.md\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.md\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.md\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.md\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.md\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.md\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.md\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.md\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.md\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.md\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.md\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.md\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.md\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.md\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.md\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.md\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.md\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.md\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.md\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.md\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.md\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.md\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.md\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.md\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.md\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.md\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.md\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.md\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.md\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.md\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.md\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.md\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.md\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.md\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.md\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.md\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.md\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.md\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.md\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.md\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.md\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.md\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.md\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.md\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.md\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.md\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.md\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.md\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.md\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.md\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.md\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.md\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.md\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.md\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.md\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.md\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.md\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.md\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.md\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.md\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.md\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.md\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.md\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.md\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.md\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.md\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.md\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.md\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.md\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.md\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.md\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.md\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.md\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.md\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.md\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.md\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.md\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.md\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.md\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.md\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.md\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.md\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.md\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.md\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.md\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.md\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.md\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.md\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.md\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.md\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.md\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.md\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.md\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.md\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.md\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.md\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.md\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.md\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.md\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.md\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.md\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.md\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.md\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.md\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.md\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.md\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.md\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.md\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.md\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.md\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.md\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.md\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.md\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.md\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.md\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.md\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.md\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.md\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.md\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.md\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.md\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.md\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.md\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.md\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.md\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.md\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.md\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.md\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.md\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.md\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.md\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.md\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.md\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.md\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.md\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.md\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.md\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.md\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.md\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.md\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.md\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.md\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.md\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.md\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.md\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.md\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.md\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.md\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.md\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.md\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.md\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.md\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.md\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.md\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.md\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.md\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.md\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.md\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.md\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.md\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.md\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.md\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.md\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.md\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.md\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.md\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.md\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.md\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.md\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.md\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.md\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.md\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.md\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.md\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.md\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.md\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.md\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.md\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.md\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.md\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.md\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.md\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.md\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.md\:to-transparent{--tw-gradient-to:transparent}.md\:to-current{--tw-gradient-to:currentColor}.md\:to-black{--tw-gradient-to:#000}.md\:to-white{--tw-gradient-to:#fff}.md\:to-gray-50{--tw-gradient-to:#f9fafb}.md\:to-gray-100{--tw-gradient-to:#f3f4f6}.md\:to-gray-200{--tw-gradient-to:#e5e7eb}.md\:to-gray-300{--tw-gradient-to:#d1d5db}.md\:to-gray-400{--tw-gradient-to:#9ca3af}.md\:to-gray-500{--tw-gradient-to:#6b7280}.md\:to-gray-600{--tw-gradient-to:#4b5563}.md\:to-gray-700{--tw-gradient-to:#374151}.md\:to-gray-800{--tw-gradient-to:#1f2937}.md\:to-gray-900{--tw-gradient-to:#111827}.md\:to-red-50{--tw-gradient-to:#fef2f2}.md\:to-red-100{--tw-gradient-to:#fee2e2}.md\:to-red-200{--tw-gradient-to:#fecaca}.md\:to-red-300{--tw-gradient-to:#fca5a5}.md\:to-red-400{--tw-gradient-to:#f87171}.md\:to-red-500{--tw-gradient-to:#ef4444}.md\:to-red-600{--tw-gradient-to:#dc2626}.md\:to-red-700{--tw-gradient-to:#b91c1c}.md\:to-red-800{--tw-gradient-to:#991b1b}.md\:to-red-900{--tw-gradient-to:#7f1d1d}.md\:to-yellow-50{--tw-gradient-to:#fffbeb}.md\:to-yellow-100{--tw-gradient-to:#fef3c7}.md\:to-yellow-200{--tw-gradient-to:#fde68a}.md\:to-yellow-300{--tw-gradient-to:#fcd34d}.md\:to-yellow-400{--tw-gradient-to:#fbbf24}.md\:to-yellow-500{--tw-gradient-to:#f59e0b}.md\:to-yellow-600{--tw-gradient-to:#d97706}.md\:to-yellow-700{--tw-gradient-to:#b45309}.md\:to-yellow-800{--tw-gradient-to:#92400e}.md\:to-yellow-900{--tw-gradient-to:#78350f}.md\:to-green-50{--tw-gradient-to:#ecfdf5}.md\:to-green-100{--tw-gradient-to:#d1fae5}.md\:to-green-200{--tw-gradient-to:#a7f3d0}.md\:to-green-300{--tw-gradient-to:#6ee7b7}.md\:to-green-400{--tw-gradient-to:#34d399}.md\:to-green-500{--tw-gradient-to:#10b981}.md\:to-green-600{--tw-gradient-to:#059669}.md\:to-green-700{--tw-gradient-to:#047857}.md\:to-green-800{--tw-gradient-to:#065f46}.md\:to-green-900{--tw-gradient-to:#064e3b}.md\:to-blue-50{--tw-gradient-to:#eff6ff}.md\:to-blue-100{--tw-gradient-to:#dbeafe}.md\:to-blue-200{--tw-gradient-to:#bfdbfe}.md\:to-blue-300{--tw-gradient-to:#93c5fd}.md\:to-blue-400{--tw-gradient-to:#60a5fa}.md\:to-blue-500{--tw-gradient-to:#3b82f6}.md\:to-blue-600{--tw-gradient-to:#2563eb}.md\:to-blue-700{--tw-gradient-to:#1d4ed8}.md\:to-blue-800{--tw-gradient-to:#1e40af}.md\:to-blue-900{--tw-gradient-to:#1e3a8a}.md\:to-indigo-50{--tw-gradient-to:#eef2ff}.md\:to-indigo-100{--tw-gradient-to:#e0e7ff}.md\:to-indigo-200{--tw-gradient-to:#c7d2fe}.md\:to-indigo-300{--tw-gradient-to:#a5b4fc}.md\:to-indigo-400{--tw-gradient-to:#818cf8}.md\:to-indigo-500{--tw-gradient-to:#6366f1}.md\:to-indigo-600{--tw-gradient-to:#4f46e5}.md\:to-indigo-700{--tw-gradient-to:#4338ca}.md\:to-indigo-800{--tw-gradient-to:#3730a3}.md\:to-indigo-900{--tw-gradient-to:#312e81}.md\:to-purple-50{--tw-gradient-to:#f5f3ff}.md\:to-purple-100{--tw-gradient-to:#ede9fe}.md\:to-purple-200{--tw-gradient-to:#ddd6fe}.md\:to-purple-300{--tw-gradient-to:#c4b5fd}.md\:to-purple-400{--tw-gradient-to:#a78bfa}.md\:to-purple-500{--tw-gradient-to:#8b5cf6}.md\:to-purple-600{--tw-gradient-to:#7c3aed}.md\:to-purple-700{--tw-gradient-to:#6d28d9}.md\:to-purple-800{--tw-gradient-to:#5b21b6}.md\:to-purple-900{--tw-gradient-to:#4c1d95}.md\:to-pink-50{--tw-gradient-to:#fdf2f8}.md\:to-pink-100{--tw-gradient-to:#fce7f3}.md\:to-pink-200{--tw-gradient-to:#fbcfe8}.md\:to-pink-300{--tw-gradient-to:#f9a8d4}.md\:to-pink-400{--tw-gradient-to:#f472b6}.md\:to-pink-500{--tw-gradient-to:#ec4899}.md\:to-pink-600{--tw-gradient-to:#db2777}.md\:to-pink-700{--tw-gradient-to:#be185d}.md\:to-pink-800{--tw-gradient-to:#9d174d}.md\:to-pink-900{--tw-gradient-to:#831843}.md\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.md\:hover\:to-current:hover{--tw-gradient-to:currentColor}.md\:hover\:to-black:hover{--tw-gradient-to:#000}.md\:hover\:to-white:hover{--tw-gradient-to:#fff}.md\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.md\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.md\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.md\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.md\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.md\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.md\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.md\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.md\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.md\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.md\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.md\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.md\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.md\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.md\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.md\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.md\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.md\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.md\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.md\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.md\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.md\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.md\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.md\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.md\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.md\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.md\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.md\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.md\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.md\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.md\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.md\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.md\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.md\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.md\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.md\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.md\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.md\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.md\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.md\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.md\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.md\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.md\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.md\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.md\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.md\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.md\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.md\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.md\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.md\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.md\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.md\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.md\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.md\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.md\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.md\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.md\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.md\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.md\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.md\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.md\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.md\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.md\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.md\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.md\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.md\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.md\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.md\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.md\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.md\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.md\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.md\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.md\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.md\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.md\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.md\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.md\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.md\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.md\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.md\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.md\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.md\:focus\:to-current:focus{--tw-gradient-to:currentColor}.md\:focus\:to-black:focus{--tw-gradient-to:#000}.md\:focus\:to-white:focus{--tw-gradient-to:#fff}.md\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.md\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.md\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.md\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.md\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.md\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.md\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.md\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.md\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.md\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.md\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.md\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.md\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.md\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.md\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.md\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.md\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.md\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.md\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.md\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.md\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.md\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.md\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.md\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.md\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.md\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.md\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.md\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.md\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.md\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.md\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.md\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.md\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.md\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.md\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.md\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.md\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.md\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.md\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.md\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.md\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.md\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.md\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.md\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.md\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.md\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.md\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.md\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.md\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.md\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.md\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.md\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.md\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.md\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.md\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.md\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.md\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.md\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.md\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.md\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.md\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.md\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.md\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.md\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.md\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.md\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.md\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.md\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.md\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.md\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.md\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.md\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.md\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.md\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.md\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.md\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.md\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.md\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.md\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.md\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.md\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.md\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md\:bg-auto{background-size:auto}.md\:bg-cover{background-size:cover}.md\:bg-contain{background-size:contain}.md\:bg-fixed{background-attachment:fixed}.md\:bg-local{background-attachment:local}.md\:bg-scroll{background-attachment:scroll}.md\:bg-clip-border{background-clip:initial}.md\:bg-clip-padding{background-clip:padding-box}.md\:bg-clip-content{background-clip:content-box}.md\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.md\:bg-bottom{background-position:bottom}.md\:bg-center{background-position:50%}.md\:bg-left{background-position:0}.md\:bg-left-bottom{background-position:0 100%}.md\:bg-left-top{background-position:0 0}.md\:bg-right{background-position:100%}.md\:bg-right-bottom{background-position:100% 100%}.md\:bg-right-top{background-position:100% 0}.md\:bg-top{background-position:top}.md\:bg-repeat{background-repeat:repeat}.md\:bg-no-repeat{background-repeat:no-repeat}.md\:bg-repeat-x{background-repeat:repeat-x}.md\:bg-repeat-y{background-repeat:repeat-y}.md\:bg-repeat-round{background-repeat:round}.md\:bg-repeat-space{background-repeat:space}.md\:bg-origin-border{background-origin:border-box}.md\:bg-origin-padding{background-origin:initial}.md\:bg-origin-content{background-origin:content-box}.md\:fill-current{fill:currentColor}.md\:stroke-current{stroke:currentColor}.md\:stroke-0{stroke-width:0}.md\:stroke-1{stroke-width:1}.md\:stroke-2{stroke-width:2}.md\:object-contain{-o-object-fit:contain;object-fit:contain}.md\:object-cover{-o-object-fit:cover;object-fit:cover}.md\:object-fill{-o-object-fit:fill;object-fit:fill}.md\:object-none{-o-object-fit:none;object-fit:none}.md\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.md\:object-bottom{-o-object-position:bottom;object-position:bottom}.md\:object-center{-o-object-position:center;object-position:center}.md\:object-left{-o-object-position:left;object-position:left}.md\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.md\:object-left-top{-o-object-position:left top;object-position:left top}.md\:object-right{-o-object-position:right;object-position:right}.md\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.md\:object-right-top{-o-object-position:right top;object-position:right top}.md\:object-top{-o-object-position:top;object-position:top}.md\:p-0{padding:0}.md\:p-1{padding:.25rem}.md\:p-2{padding:.5rem}.md\:p-3{padding:.75rem}.md\:p-4{padding:1rem}.md\:p-5{padding:1.25rem}.md\:p-6{padding:1.5rem}.md\:p-7{padding:1.75rem}.md\:p-8{padding:2rem}.md\:p-9{padding:2.25rem}.md\:p-10{padding:2.5rem}.md\:p-11{padding:2.75rem}.md\:p-12{padding:3rem}.md\:p-14{padding:3.5rem}.md\:p-16{padding:4rem}.md\:p-20{padding:5rem}.md\:p-24{padding:6rem}.md\:p-28{padding:7rem}.md\:p-32{padding:8rem}.md\:p-36{padding:9rem}.md\:p-40{padding:10rem}.md\:p-44{padding:11rem}.md\:p-48{padding:12rem}.md\:p-52{padding:13rem}.md\:p-56{padding:14rem}.md\:p-60{padding:15rem}.md\:p-64{padding:16rem}.md\:p-72{padding:18rem}.md\:p-80{padding:20rem}.md\:p-96{padding:24rem}.md\:p-px{padding:1px}.md\:p-0\.5{padding:.125rem}.md\:p-1\.5{padding:.375rem}.md\:p-2\.5{padding:.625rem}.md\:p-3\.5{padding:.875rem}.md\:px-0{padding-left:0;padding-right:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:px-7{padding-left:1.75rem;padding-right:1.75rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-9{padding-left:2.25rem;padding-right:2.25rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:px-11{padding-left:2.75rem;padding-right:2.75rem}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:px-14{padding-left:3.5rem;padding-right:3.5rem}.md\:px-16{padding-left:4rem;padding-right:4rem}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:px-24{padding-left:6rem;padding-right:6rem}.md\:px-28{padding-left:7rem;padding-right:7rem}.md\:px-32{padding-left:8rem;padding-right:8rem}.md\:px-36{padding-left:9rem;padding-right:9rem}.md\:px-40{padding-left:10rem;padding-right:10rem}.md\:px-44{padding-left:11rem;padding-right:11rem}.md\:px-48{padding-left:12rem;padding-right:12rem}.md\:px-52{padding-left:13rem;padding-right:13rem}.md\:px-56{padding-left:14rem;padding-right:14rem}.md\:px-60{padding-left:15rem;padding-right:15rem}.md\:px-64{padding-left:16rem;padding-right:16rem}.md\:px-72{padding-left:18rem;padding-right:18rem}.md\:px-80{padding-left:20rem;padding-right:20rem}.md\:px-96{padding-left:24rem;padding-right:24rem}.md\:px-px{padding-left:1px;padding-right:1px}.md\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.md\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.md\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.md\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:py-1{padding-top:.25rem;padding-bottom:.25rem}.md\:py-2{padding-top:.5rem;padding-bottom:.5rem}.md\:py-3{padding-top:.75rem;padding-bottom:.75rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.md\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.md\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}.md\:py-24{padding-top:6rem;padding-bottom:6rem}.md\:py-28{padding-top:7rem;padding-bottom:7rem}.md\:py-32{padding-top:8rem;padding-bottom:8rem}.md\:py-36{padding-top:9rem;padding-bottom:9rem}.md\:py-40{padding-top:10rem;padding-bottom:10rem}.md\:py-44{padding-top:11rem;padding-bottom:11rem}.md\:py-48{padding-top:12rem;padding-bottom:12rem}.md\:py-52{padding-top:13rem;padding-bottom:13rem}.md\:py-56{padding-top:14rem;padding-bottom:14rem}.md\:py-60{padding-top:15rem;padding-bottom:15rem}.md\:py-64{padding-top:16rem;padding-bottom:16rem}.md\:py-72{padding-top:18rem;padding-bottom:18rem}.md\:py-80{padding-top:20rem;padding-bottom:20rem}.md\:py-96{padding-top:24rem;padding-bottom:24rem}.md\:py-px{padding-top:1px;padding-bottom:1px}.md\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.md\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.md\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.md\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.md\:pt-0{padding-top:0}.md\:pt-1{padding-top:.25rem}.md\:pt-2{padding-top:.5rem}.md\:pt-3{padding-top:.75rem}.md\:pt-4{padding-top:1rem}.md\:pt-5{padding-top:1.25rem}.md\:pt-6{padding-top:1.5rem}.md\:pt-7{padding-top:1.75rem}.md\:pt-8{padding-top:2rem}.md\:pt-9{padding-top:2.25rem}.md\:pt-10{padding-top:2.5rem}.md\:pt-11{padding-top:2.75rem}.md\:pt-12{padding-top:3rem}.md\:pt-14{padding-top:3.5rem}.md\:pt-16{padding-top:4rem}.md\:pt-20{padding-top:5rem}.md\:pt-24{padding-top:6rem}.md\:pt-28{padding-top:7rem}.md\:pt-32{padding-top:8rem}.md\:pt-36{padding-top:9rem}.md\:pt-40{padding-top:10rem}.md\:pt-44{padding-top:11rem}.md\:pt-48{padding-top:12rem}.md\:pt-52{padding-top:13rem}.md\:pt-56{padding-top:14rem}.md\:pt-60{padding-top:15rem}.md\:pt-64{padding-top:16rem}.md\:pt-72{padding-top:18rem}.md\:pt-80{padding-top:20rem}.md\:pt-96{padding-top:24rem}.md\:pt-px{padding-top:1px}.md\:pt-0\.5{padding-top:.125rem}.md\:pt-1\.5{padding-top:.375rem}.md\:pt-2\.5{padding-top:.625rem}.md\:pt-3\.5{padding-top:.875rem}.md\:pr-0{padding-right:0}.md\:pr-1{padding-right:.25rem}.md\:pr-2{padding-right:.5rem}.md\:pr-3{padding-right:.75rem}.md\:pr-4{padding-right:1rem}.md\:pr-5{padding-right:1.25rem}.md\:pr-6{padding-right:1.5rem}.md\:pr-7{padding-right:1.75rem}.md\:pr-8{padding-right:2rem}.md\:pr-9{padding-right:2.25rem}.md\:pr-10{padding-right:2.5rem}.md\:pr-11{padding-right:2.75rem}.md\:pr-12{padding-right:3rem}.md\:pr-14{padding-right:3.5rem}.md\:pr-16{padding-right:4rem}.md\:pr-20{padding-right:5rem}.md\:pr-24{padding-right:6rem}.md\:pr-28{padding-right:7rem}.md\:pr-32{padding-right:8rem}.md\:pr-36{padding-right:9rem}.md\:pr-40{padding-right:10rem}.md\:pr-44{padding-right:11rem}.md\:pr-48{padding-right:12rem}.md\:pr-52{padding-right:13rem}.md\:pr-56{padding-right:14rem}.md\:pr-60{padding-right:15rem}.md\:pr-64{padding-right:16rem}.md\:pr-72{padding-right:18rem}.md\:pr-80{padding-right:20rem}.md\:pr-96{padding-right:24rem}.md\:pr-px{padding-right:1px}.md\:pr-0\.5{padding-right:.125rem}.md\:pr-1\.5{padding-right:.375rem}.md\:pr-2\.5{padding-right:.625rem}.md\:pr-3\.5{padding-right:.875rem}.md\:pb-0{padding-bottom:0}.md\:pb-1{padding-bottom:.25rem}.md\:pb-2{padding-bottom:.5rem}.md\:pb-3{padding-bottom:.75rem}.md\:pb-4{padding-bottom:1rem}.md\:pb-5{padding-bottom:1.25rem}.md\:pb-6{padding-bottom:1.5rem}.md\:pb-7{padding-bottom:1.75rem}.md\:pb-8{padding-bottom:2rem}.md\:pb-9{padding-bottom:2.25rem}.md\:pb-10{padding-bottom:2.5rem}.md\:pb-11{padding-bottom:2.75rem}.md\:pb-12{padding-bottom:3rem}.md\:pb-14{padding-bottom:3.5rem}.md\:pb-16{padding-bottom:4rem}.md\:pb-20{padding-bottom:5rem}.md\:pb-24{padding-bottom:6rem}.md\:pb-28{padding-bottom:7rem}.md\:pb-32{padding-bottom:8rem}.md\:pb-36{padding-bottom:9rem}.md\:pb-40{padding-bottom:10rem}.md\:pb-44{padding-bottom:11rem}.md\:pb-48{padding-bottom:12rem}.md\:pb-52{padding-bottom:13rem}.md\:pb-56{padding-bottom:14rem}.md\:pb-60{padding-bottom:15rem}.md\:pb-64{padding-bottom:16rem}.md\:pb-72{padding-bottom:18rem}.md\:pb-80{padding-bottom:20rem}.md\:pb-96{padding-bottom:24rem}.md\:pb-px{padding-bottom:1px}.md\:pb-0\.5{padding-bottom:.125rem}.md\:pb-1\.5{padding-bottom:.375rem}.md\:pb-2\.5{padding-bottom:.625rem}.md\:pb-3\.5{padding-bottom:.875rem}.md\:pl-0{padding-left:0}.md\:pl-1{padding-left:.25rem}.md\:pl-2{padding-left:.5rem}.md\:pl-3{padding-left:.75rem}.md\:pl-4{padding-left:1rem}.md\:pl-5{padding-left:1.25rem}.md\:pl-6{padding-left:1.5rem}.md\:pl-7{padding-left:1.75rem}.md\:pl-8{padding-left:2rem}.md\:pl-9{padding-left:2.25rem}.md\:pl-10{padding-left:2.5rem}.md\:pl-11{padding-left:2.75rem}.md\:pl-12{padding-left:3rem}.md\:pl-14{padding-left:3.5rem}.md\:pl-16{padding-left:4rem}.md\:pl-20{padding-left:5rem}.md\:pl-24{padding-left:6rem}.md\:pl-28{padding-left:7rem}.md\:pl-32{padding-left:8rem}.md\:pl-36{padding-left:9rem}.md\:pl-40{padding-left:10rem}.md\:pl-44{padding-left:11rem}.md\:pl-48{padding-left:12rem}.md\:pl-52{padding-left:13rem}.md\:pl-56{padding-left:14rem}.md\:pl-60{padding-left:15rem}.md\:pl-64{padding-left:16rem}.md\:pl-72{padding-left:18rem}.md\:pl-80{padding-left:20rem}.md\:pl-96{padding-left:24rem}.md\:pl-px{padding-left:1px}.md\:pl-0\.5{padding-left:.125rem}.md\:pl-1\.5{padding-left:.375rem}.md\:pl-2\.5{padding-left:.625rem}.md\:pl-3\.5{padding-left:.875rem}.md\:text-left{text-align:left}.md\:text-center{text-align:center}.md\:text-right{text-align:right}.md\:text-justify{text-align:justify}.md\:align-baseline{vertical-align:initial}.md\:align-top{vertical-align:top}.md\:align-middle{vertical-align:middle}.md\:align-bottom{vertical-align:bottom}.md\:align-text-top{vertical-align:text-top}.md\:align-text-bottom{vertical-align:text-bottom}.md\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.md\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.md\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.md\:text-xs{font-size:.75rem;line-height:1rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-6xl{font-size:3.75rem;line-height:1}.md\:text-7xl{font-size:4.5rem;line-height:1}.md\:text-8xl{font-size:6rem;line-height:1}.md\:text-9xl{font-size:8rem;line-height:1}.md\:font-thin{font-weight:100}.md\:font-extralight{font-weight:200}.md\:font-light{font-weight:300}.md\:font-normal{font-weight:400}.md\:font-medium{font-weight:500}.md\:font-semibold{font-weight:600}.md\:font-bold{font-weight:700}.md\:font-extrabold{font-weight:800}.md\:font-black{font-weight:900}.md\:uppercase{text-transform:uppercase}.md\:lowercase{text-transform:lowercase}.md\:capitalize{text-transform:capitalize}.md\:normal-case{text-transform:none}.md\:italic{font-style:italic}.md\:not-italic{font-style:normal}.md\:diagonal-fractions,.md\:lining-nums,.md\:oldstyle-nums,.md\:ordinal,.md\:proportional-nums,.md\:slashed-zero,.md\:stacked-fractions,.md\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.md\:normal-nums{font-variant-numeric:normal}.md\:ordinal{--tw-ordinal:ordinal}.md\:slashed-zero{--tw-slashed-zero:slashed-zero}.md\:lining-nums{--tw-numeric-figure:lining-nums}.md\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.md\:proportional-nums{--tw-numeric-spacing:proportional-nums}.md\:tabular-nums{--tw-numeric-spacing:tabular-nums}.md\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.md\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.md\:leading-3{line-height:.75rem}.md\:leading-4{line-height:1rem}.md\:leading-5{line-height:1.25rem}.md\:leading-6{line-height:1.5rem}.md\:leading-7{line-height:1.75rem}.md\:leading-8{line-height:2rem}.md\:leading-9{line-height:2.25rem}.md\:leading-10{line-height:2.5rem}.md\:leading-none{line-height:1}.md\:leading-tight{line-height:1.25}.md\:leading-snug{line-height:1.375}.md\:leading-normal{line-height:1.5}.md\:leading-relaxed{line-height:1.625}.md\:leading-loose{line-height:2}.md\:tracking-tighter{letter-spacing:-.05em}.md\:tracking-tight{letter-spacing:-.025em}.md\:tracking-normal{letter-spacing:0}.md\:tracking-wide{letter-spacing:.025em}.md\:tracking-wider{letter-spacing:.05em}.md\:tracking-widest{letter-spacing:.1em}.md\:text-transparent{color:transparent}.md\:text-current{color:currentColor}.md\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-transparent{color:transparent}.group:hover .md\:group-hover\:text-current{color:currentColor}.group:hover .md\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:focus-within\:text-transparent:focus-within{color:transparent}.md\:focus-within\:text-current:focus-within{color:currentColor}.md\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:hover\:text-transparent:hover{color:transparent}.md\:hover\:text-current:hover{color:currentColor}.md\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:focus\:text-transparent:focus{color:transparent}.md\:focus\:text-current:focus{color:currentColor}.md\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:text-opacity-0{--tw-text-opacity:0}.md\:text-opacity-5{--tw-text-opacity:0.05}.md\:text-opacity-10{--tw-text-opacity:0.1}.md\:text-opacity-20{--tw-text-opacity:0.2}.md\:text-opacity-25{--tw-text-opacity:0.25}.md\:text-opacity-30{--tw-text-opacity:0.3}.md\:text-opacity-40{--tw-text-opacity:0.4}.md\:text-opacity-50{--tw-text-opacity:0.5}.md\:text-opacity-60{--tw-text-opacity:0.6}.md\:text-opacity-70{--tw-text-opacity:0.7}.md\:text-opacity-75{--tw-text-opacity:0.75}.md\:text-opacity-80{--tw-text-opacity:0.8}.md\:text-opacity-90{--tw-text-opacity:0.9}.md\:text-opacity-95{--tw-text-opacity:0.95}.md\:text-opacity-100{--tw-text-opacity:1}.group:hover .md\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .md\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .md\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .md\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .md\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .md\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .md\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .md\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .md\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .md\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .md\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .md\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .md\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .md\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .md\:group-hover\:text-opacity-100{--tw-text-opacity:1}.md\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.md\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.md\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.md\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.md\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.md\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.md\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.md\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.md\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.md\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.md\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.md\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.md\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.md\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.md\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.md\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.md\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.md\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.md\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.md\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.md\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.md\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.md\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.md\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.md\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.md\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.md\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.md\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.md\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.md\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.md\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.md\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.md\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.md\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.md\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.md\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.md\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.md\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.md\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.md\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.md\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.md\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.md\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.md\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.md\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.md\:underline{text-decoration:underline}.md\:line-through{text-decoration:line-through}.md\:no-underline{text-decoration:none}.group:hover .md\:group-hover\:underline{text-decoration:underline}.group:hover .md\:group-hover\:line-through{text-decoration:line-through}.group:hover .md\:group-hover\:no-underline{text-decoration:none}.md\:focus-within\:underline:focus-within{text-decoration:underline}.md\:focus-within\:line-through:focus-within{text-decoration:line-through}.md\:focus-within\:no-underline:focus-within{text-decoration:none}.md\:hover\:underline:hover{text-decoration:underline}.md\:hover\:line-through:hover{text-decoration:line-through}.md\:hover\:no-underline:hover{text-decoration:none}.md\:focus\:underline:focus{text-decoration:underline}.md\:focus\:line-through:focus{text-decoration:line-through}.md\:focus\:no-underline:focus{text-decoration:none}.md\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.md\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.md\:placeholder-transparent::-moz-placeholder{color:transparent}.md\:placeholder-transparent:-ms-input-placeholder{color:transparent}.md\:placeholder-transparent::placeholder{color:transparent}.md\:placeholder-current::-moz-placeholder{color:currentColor}.md\:placeholder-current:-ms-input-placeholder{color:currentColor}.md\:placeholder-current::placeholder{color:currentColor}.md\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.md\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus::placeholder{color:currentColor}.md\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.md\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.md\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.md\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.md\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.md\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.md\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.md\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.md\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.md\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.md\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.md\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.md\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.md\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.md\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.md\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.md\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.md\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.md\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.md\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.md\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.md\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.md\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.md\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.md\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.md\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.md\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.md\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.md\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.md\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.md\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.md\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.md\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.md\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.md\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.md\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.md\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.md\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.md\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.md\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.md\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.md\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.md\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.md\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.md\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.md\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.md\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.md\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.md\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.md\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.md\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.md\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.md\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.md\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.md\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.md\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.md\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.md\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.md\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.md\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.md\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.md\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.md\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.md\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.md\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.md\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.md\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.md\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.md\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.md\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.md\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.md\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.md\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.md\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.md\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.md\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.md\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.md\:opacity-0{opacity:0}.md\:opacity-5{opacity:.05}.md\:opacity-10{opacity:.1}.md\:opacity-20{opacity:.2}.md\:opacity-25{opacity:.25}.md\:opacity-30{opacity:.3}.md\:opacity-40{opacity:.4}.md\:opacity-50{opacity:.5}.md\:opacity-60{opacity:.6}.md\:opacity-70{opacity:.7}.md\:opacity-75{opacity:.75}.md\:opacity-80{opacity:.8}.md\:opacity-90{opacity:.9}.md\:opacity-95{opacity:.95}.md\:opacity-100{opacity:1}.group:hover .md\:group-hover\:opacity-0{opacity:0}.group:hover .md\:group-hover\:opacity-5{opacity:.05}.group:hover .md\:group-hover\:opacity-10{opacity:.1}.group:hover .md\:group-hover\:opacity-20{opacity:.2}.group:hover .md\:group-hover\:opacity-25{opacity:.25}.group:hover .md\:group-hover\:opacity-30{opacity:.3}.group:hover .md\:group-hover\:opacity-40{opacity:.4}.group:hover .md\:group-hover\:opacity-50{opacity:.5}.group:hover .md\:group-hover\:opacity-60{opacity:.6}.group:hover .md\:group-hover\:opacity-70{opacity:.7}.group:hover .md\:group-hover\:opacity-75{opacity:.75}.group:hover .md\:group-hover\:opacity-80{opacity:.8}.group:hover .md\:group-hover\:opacity-90{opacity:.9}.group:hover .md\:group-hover\:opacity-95{opacity:.95}.group:hover .md\:group-hover\:opacity-100{opacity:1}.md\:focus-within\:opacity-0:focus-within{opacity:0}.md\:focus-within\:opacity-5:focus-within{opacity:.05}.md\:focus-within\:opacity-10:focus-within{opacity:.1}.md\:focus-within\:opacity-20:focus-within{opacity:.2}.md\:focus-within\:opacity-25:focus-within{opacity:.25}.md\:focus-within\:opacity-30:focus-within{opacity:.3}.md\:focus-within\:opacity-40:focus-within{opacity:.4}.md\:focus-within\:opacity-50:focus-within{opacity:.5}.md\:focus-within\:opacity-60:focus-within{opacity:.6}.md\:focus-within\:opacity-70:focus-within{opacity:.7}.md\:focus-within\:opacity-75:focus-within{opacity:.75}.md\:focus-within\:opacity-80:focus-within{opacity:.8}.md\:focus-within\:opacity-90:focus-within{opacity:.9}.md\:focus-within\:opacity-95:focus-within{opacity:.95}.md\:focus-within\:opacity-100:focus-within{opacity:1}.md\:hover\:opacity-0:hover{opacity:0}.md\:hover\:opacity-5:hover{opacity:.05}.md\:hover\:opacity-10:hover{opacity:.1}.md\:hover\:opacity-20:hover{opacity:.2}.md\:hover\:opacity-25:hover{opacity:.25}.md\:hover\:opacity-30:hover{opacity:.3}.md\:hover\:opacity-40:hover{opacity:.4}.md\:hover\:opacity-50:hover{opacity:.5}.md\:hover\:opacity-60:hover{opacity:.6}.md\:hover\:opacity-70:hover{opacity:.7}.md\:hover\:opacity-75:hover{opacity:.75}.md\:hover\:opacity-80:hover{opacity:.8}.md\:hover\:opacity-90:hover{opacity:.9}.md\:hover\:opacity-95:hover{opacity:.95}.md\:hover\:opacity-100:hover{opacity:1}.md\:focus\:opacity-0:focus{opacity:0}.md\:focus\:opacity-5:focus{opacity:.05}.md\:focus\:opacity-10:focus{opacity:.1}.md\:focus\:opacity-20:focus{opacity:.2}.md\:focus\:opacity-25:focus{opacity:.25}.md\:focus\:opacity-30:focus{opacity:.3}.md\:focus\:opacity-40:focus{opacity:.4}.md\:focus\:opacity-50:focus{opacity:.5}.md\:focus\:opacity-60:focus{opacity:.6}.md\:focus\:opacity-70:focus{opacity:.7}.md\:focus\:opacity-75:focus{opacity:.75}.md\:focus\:opacity-80:focus{opacity:.8}.md\:focus\:opacity-90:focus{opacity:.9}.md\:focus\:opacity-95:focus{opacity:.95}.md\:focus\:opacity-100:focus{opacity:1}.md\:bg-blend-normal{background-blend-mode:normal}.md\:bg-blend-multiply{background-blend-mode:multiply}.md\:bg-blend-screen{background-blend-mode:screen}.md\:bg-blend-overlay{background-blend-mode:overlay}.md\:bg-blend-darken{background-blend-mode:darken}.md\:bg-blend-lighten{background-blend-mode:lighten}.md\:bg-blend-color-dodge{background-blend-mode:color-dodge}.md\:bg-blend-color-burn{background-blend-mode:color-burn}.md\:bg-blend-hard-light{background-blend-mode:hard-light}.md\:bg-blend-soft-light{background-blend-mode:soft-light}.md\:bg-blend-difference{background-blend-mode:difference}.md\:bg-blend-exclusion{background-blend-mode:exclusion}.md\:bg-blend-hue{background-blend-mode:hue}.md\:bg-blend-saturation{background-blend-mode:saturation}.md\:bg-blend-color{background-blend-mode:color}.md\:bg-blend-luminosity{background-blend-mode:luminosity}.md\:mix-blend-normal{mix-blend-mode:normal}.md\:mix-blend-multiply{mix-blend-mode:multiply}.md\:mix-blend-screen{mix-blend-mode:screen}.md\:mix-blend-overlay{mix-blend-mode:overlay}.md\:mix-blend-darken{mix-blend-mode:darken}.md\:mix-blend-lighten{mix-blend-mode:lighten}.md\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.md\:mix-blend-color-burn{mix-blend-mode:color-burn}.md\:mix-blend-hard-light{mix-blend-mode:hard-light}.md\:mix-blend-soft-light{mix-blend-mode:soft-light}.md\:mix-blend-difference{mix-blend-mode:difference}.md\:mix-blend-exclusion{mix-blend-mode:exclusion}.md\:mix-blend-hue{mix-blend-mode:hue}.md\:mix-blend-saturation{mix-blend-mode:saturation}.md\:mix-blend-color{mix-blend-mode:color}.md\:mix-blend-luminosity{mix-blend-mode:luminosity}.md\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.md\:shadow,.md\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.md\:shadow-lg,.md\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.md\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.md\:shadow-2xl,.md\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.md\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.md\:shadow-inner,.md\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .md\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .md\:group-hover\:shadow,.group:hover .md\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .md\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .md\:group-hover\:shadow-lg,.group:hover .md\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .md\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .md\:group-hover\:shadow-2xl,.group:hover .md\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .md\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .md\:group-hover\:shadow-inner,.group:hover .md\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.md\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.md\:hover\:shadow-sm:hover,.md\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.md\:hover\:shadow-lg:hover,.md\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.md\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.md\:hover\:shadow-2xl:hover,.md\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.md\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.md\:hover\:shadow-inner:hover,.md\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.md\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.md\:focus\:shadow-sm:focus,.md\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.md\:focus\:shadow-lg:focus,.md\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.md\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.md\:focus\:shadow-2xl:focus,.md\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.md\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.md\:focus\:shadow-inner:focus,.md\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.md\:outline-none{outline:2px solid transparent;outline-offset:2px}.md\:outline-white{outline:2px dotted #fff;outline-offset:2px}.md\:outline-black{outline:2px dotted #000;outline-offset:2px}.md\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.md\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.md\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.md\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.md\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.md\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.md\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-0,.md\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-2,.md\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring,.md\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-0:focus,.md\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-2:focus,.md\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-8:focus,.md\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-inset{--tw-ring-inset:inset}.md\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.md\:focus\:ring-inset:focus{--tw-ring-inset:inset}.md\:ring-transparent{--tw-ring-color:transparent}.md\:ring-current{--tw-ring-color:currentColor}.md\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.md\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.md\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.md\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.md\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.md\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.md\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.md\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.md\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.md\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.md\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.md\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.md\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.md\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.md\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.md\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.md\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.md\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.md\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.md\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.md\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.md\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.md\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.md\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.md\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.md\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.md\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.md\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.md\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.md\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.md\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.md\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.md\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.md\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.md\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.md\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.md\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.md\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.md\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.md\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.md\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.md\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.md\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.md\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.md\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.md\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.md\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.md\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.md\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.md\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.md\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.md\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.md\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.md\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.md\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.md\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.md\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.md\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.md\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.md\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.md\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.md\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.md\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.md\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.md\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.md\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.md\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.md\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.md\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.md\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.md\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.md\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.md\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.md\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.md\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.md\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.md\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.md\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.md\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.md\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.md\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.md\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.md\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.md\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.md\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.md\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.md\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.md\:focus\:ring-current:focus{--tw-ring-color:currentColor}.md\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.md\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.md\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.md\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.md\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.md\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.md\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.md\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.md\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.md\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.md\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.md\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.md\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.md\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.md\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.md\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.md\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.md\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.md\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.md\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.md\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.md\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.md\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.md\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.md\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.md\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.md\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.md\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.md\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.md\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.md\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.md\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.md\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.md\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.md\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.md\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.md\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.md\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.md\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.md\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.md\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.md\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.md\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.md\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.md\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.md\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.md\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.md\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.md\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.md\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.md\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.md\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.md\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.md\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.md\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.md\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.md\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.md\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.md\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.md\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.md\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.md\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.md\:ring-opacity-0{--tw-ring-opacity:0}.md\:ring-opacity-5{--tw-ring-opacity:0.05}.md\:ring-opacity-10{--tw-ring-opacity:0.1}.md\:ring-opacity-20{--tw-ring-opacity:0.2}.md\:ring-opacity-25{--tw-ring-opacity:0.25}.md\:ring-opacity-30{--tw-ring-opacity:0.3}.md\:ring-opacity-40{--tw-ring-opacity:0.4}.md\:ring-opacity-50{--tw-ring-opacity:0.5}.md\:ring-opacity-60{--tw-ring-opacity:0.6}.md\:ring-opacity-70{--tw-ring-opacity:0.7}.md\:ring-opacity-75{--tw-ring-opacity:0.75}.md\:ring-opacity-80{--tw-ring-opacity:0.8}.md\:ring-opacity-90{--tw-ring-opacity:0.9}.md\:ring-opacity-95{--tw-ring-opacity:0.95}.md\:ring-opacity-100{--tw-ring-opacity:1}.md\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.md\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.md\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.md\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.md\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.md\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.md\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.md\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.md\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.md\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.md\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.md\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.md\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.md\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.md\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.md\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.md\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.md\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.md\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.md\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.md\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.md\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.md\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.md\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.md\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.md\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.md\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.md\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.md\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.md\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.md\:ring-offset-0{--tw-ring-offset-width:0px}.md\:ring-offset-1{--tw-ring-offset-width:1px}.md\:ring-offset-2{--tw-ring-offset-width:2px}.md\:ring-offset-4{--tw-ring-offset-width:4px}.md\:ring-offset-8{--tw-ring-offset-width:8px}.md\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.md\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.md\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.md\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.md\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.md\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.md\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.md\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.md\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.md\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.md\:ring-offset-transparent{--tw-ring-offset-color:transparent}.md\:ring-offset-current{--tw-ring-offset-color:currentColor}.md\:ring-offset-black{--tw-ring-offset-color:#000}.md\:ring-offset-white{--tw-ring-offset-color:#fff}.md\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.md\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.md\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.md\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.md\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.md\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.md\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.md\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.md\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.md\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.md\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.md\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.md\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.md\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.md\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.md\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.md\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.md\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.md\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.md\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.md\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.md\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.md\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.md\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.md\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.md\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.md\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.md\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.md\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.md\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.md\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.md\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.md\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.md\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.md\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.md\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.md\:ring-offset-green-600{--tw-ring-offset-color:#059669}.md\:ring-offset-green-700{--tw-ring-offset-color:#047857}.md\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.md\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.md\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.md\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.md\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.md\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.md\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.md\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.md\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.md\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.md\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.md\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.md\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.md\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.md\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.md\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.md\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.md\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.md\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.md\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.md\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.md\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.md\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.md\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.md\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.md\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.md\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.md\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.md\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.md\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.md\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.md\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.md\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.md\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.md\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.md\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.md\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.md\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.md\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.md\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.md\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.md\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.md\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.md\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.md\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.md\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.md\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.md\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.md\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.md\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.md\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.md\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.md\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.md\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.md\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.md\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.md\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.md\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.md\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.md\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.md\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.md\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.md\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.md\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.md\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.md\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.md\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.md\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.md\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.md\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.md\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.md\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.md\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.md\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.md\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.md\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.md\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.md\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.md\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.md\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.md\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.md\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.md\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.md\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.md\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.md\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.md\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.md\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.md\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.md\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.md\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.md\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.md\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.md\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.md\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.md\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.md\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.md\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.md\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.md\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.md\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.md\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.md\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.md\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.md\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.md\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.md\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.md\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.md\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.md\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.md\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.md\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.md\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.md\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.md\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.md\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.md\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.md\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.md\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.md\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.md\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.md\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.md\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.md\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.md\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.md\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.md\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.md\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.md\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.md\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.md\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.md\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.md\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.md\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.md\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.md\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.md\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.md\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.md\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.md\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.md\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.md\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.md\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.md\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.md\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.md\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.md\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.md\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.md\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.md\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.md\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.md\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.md\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.md\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.md\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.md\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.md\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.md\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.md\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.md\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.md\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.md\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.md\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.md\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.md\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.md\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.md\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.md\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.md\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.md\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.md\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.md\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.md\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.md\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.md\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.md\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.md\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.md\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.md\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.md\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.md\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.md\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.md\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.md\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.md\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.md\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.md\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.md\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.md\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.md\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.md\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.md\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.md\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.md\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.md\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.md\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.md\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.md\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.md\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.md\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.md\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.md\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.md\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.md\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.md\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.md\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.md\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.md\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.md\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.md\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.md\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.md\:filter-none{filter:none}.md\:blur-0,.md\:blur-none{--tw-blur:blur(0)}.md\:blur-sm{--tw-blur:blur(4px)}.md\:blur{--tw-blur:blur(8px)}.md\:blur-md{--tw-blur:blur(12px)}.md\:blur-lg{--tw-blur:blur(16px)}.md\:blur-xl{--tw-blur:blur(24px)}.md\:blur-2xl{--tw-blur:blur(40px)}.md\:blur-3xl{--tw-blur:blur(64px)}.md\:brightness-0{--tw-brightness:brightness(0)}.md\:brightness-50{--tw-brightness:brightness(.5)}.md\:brightness-75{--tw-brightness:brightness(.75)}.md\:brightness-90{--tw-brightness:brightness(.9)}.md\:brightness-95{--tw-brightness:brightness(.95)}.md\:brightness-100{--tw-brightness:brightness(1)}.md\:brightness-105{--tw-brightness:brightness(1.05)}.md\:brightness-110{--tw-brightness:brightness(1.1)}.md\:brightness-125{--tw-brightness:brightness(1.25)}.md\:brightness-150{--tw-brightness:brightness(1.5)}.md\:brightness-200{--tw-brightness:brightness(2)}.md\:contrast-0{--tw-contrast:contrast(0)}.md\:contrast-50{--tw-contrast:contrast(.5)}.md\:contrast-75{--tw-contrast:contrast(.75)}.md\:contrast-100{--tw-contrast:contrast(1)}.md\:contrast-125{--tw-contrast:contrast(1.25)}.md\:contrast-150{--tw-contrast:contrast(1.5)}.md\:contrast-200{--tw-contrast:contrast(2)}.md\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.md\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.md\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.md\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.md\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.md\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.md\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.md\:grayscale-0{--tw-grayscale:grayscale(0)}.md\:grayscale{--tw-grayscale:grayscale(100%)}.md\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.md\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.md\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.md\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.md\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.md\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.md\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.md\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.md\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.md\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.md\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.md\:invert-0{--tw-invert:invert(0)}.md\:invert{--tw-invert:invert(100%)}.md\:saturate-0{--tw-saturate:saturate(0)}.md\:saturate-50{--tw-saturate:saturate(.5)}.md\:saturate-100{--tw-saturate:saturate(1)}.md\:saturate-150{--tw-saturate:saturate(1.5)}.md\:saturate-200{--tw-saturate:saturate(2)}.md\:sepia-0{--tw-sepia:sepia(0)}.md\:sepia{--tw-sepia:sepia(100%)}.md\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.md\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.md\:backdrop-blur-0,.md\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.md\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.md\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.md\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.md\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.md\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.md\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.md\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.md\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.md\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.md\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.md\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.md\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.md\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.md\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.md\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.md\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.md\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.md\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.md\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.md\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.md\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.md\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.md\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.md\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.md\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.md\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.md\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.md\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.md\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.md\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.md\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.md\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.md\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.md\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.md\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.md\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.md\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.md\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.md\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.md\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.md\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.md\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.md\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.md\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.md\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.md\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.md\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.md\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.md\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.md\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.md\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.md\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.md\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.md\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.md\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.md\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.md\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.md\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.md\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.md\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.md\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.md\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.md\:transition-none{transition-property:none}.md\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:delay-75{transition-delay:75ms}.md\:delay-100{transition-delay:.1s}.md\:delay-150{transition-delay:.15s}.md\:delay-200{transition-delay:.2s}.md\:delay-300{transition-delay:.3s}.md\:delay-500{transition-delay:.5s}.md\:delay-700{transition-delay:.7s}.md\:delay-1000{transition-delay:1s}.md\:duration-75{transition-duration:75ms}.md\:duration-100{transition-duration:.1s}.md\:duration-150{transition-duration:.15s}.md\:duration-200{transition-duration:.2s}.md\:duration-300{transition-duration:.3s}.md\:duration-500{transition-duration:.5s}.md\:duration-700{transition-duration:.7s}.md\:duration-1000{transition-duration:1s}.md\:ease-linear{transition-timing-function:linear}.md\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.md\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.md\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}@media (min-width:1536px){.lg\:container{max-width:1536px}}.lg\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:pointer-events-none{pointer-events:none}.lg\:pointer-events-auto{pointer-events:auto}.lg\:visible{visibility:visible}.lg\:invisible{visibility:hidden}.lg\:static{position:static}.lg\:fixed{position:fixed}.lg\:absolute{position:absolute}.lg\:relative{position:relative}.lg\:sticky{position:-webkit-sticky;position:sticky}.lg\:inset-0{top:0;right:0;bottom:0;left:0}.lg\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.lg\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.lg\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.lg\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.lg\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.lg\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.lg\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.lg\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.lg\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.lg\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.lg\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.lg\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.lg\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.lg\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.lg\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.lg\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.lg\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.lg\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.lg\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.lg\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.lg\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.lg\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.lg\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.lg\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.lg\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.lg\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.lg\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.lg\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.lg\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.lg\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.lg\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.lg\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.lg\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.lg\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.lg\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.lg\:-inset-0{top:0;right:0;bottom:0;left:0}.lg\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.lg\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.lg\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.lg\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.lg\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.lg\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.lg\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.lg\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.lg\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.lg\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.lg\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.lg\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.lg\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.lg\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.lg\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.lg\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.lg\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.lg\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.lg\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.lg\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.lg\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.lg\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.lg\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.lg\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.lg\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.lg\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.lg\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.lg\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.lg\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.lg\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.lg\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.lg\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.lg\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.lg\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.lg\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.lg\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.lg\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.lg\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.lg\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.lg\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.lg\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.lg\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.lg\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.lg\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.lg\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.lg\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.lg\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.lg\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.lg\:inset-x-0{left:0;right:0}.lg\:inset-x-1{left:.25rem;right:.25rem}.lg\:inset-x-2{left:.5rem;right:.5rem}.lg\:inset-x-3{left:.75rem;right:.75rem}.lg\:inset-x-4{left:1rem;right:1rem}.lg\:inset-x-5{left:1.25rem;right:1.25rem}.lg\:inset-x-6{left:1.5rem;right:1.5rem}.lg\:inset-x-7{left:1.75rem;right:1.75rem}.lg\:inset-x-8{left:2rem;right:2rem}.lg\:inset-x-9{left:2.25rem;right:2.25rem}.lg\:inset-x-10{left:2.5rem;right:2.5rem}.lg\:inset-x-11{left:2.75rem;right:2.75rem}.lg\:inset-x-12{left:3rem;right:3rem}.lg\:inset-x-14{left:3.5rem;right:3.5rem}.lg\:inset-x-16{left:4rem;right:4rem}.lg\:inset-x-20{left:5rem;right:5rem}.lg\:inset-x-24{left:6rem;right:6rem}.lg\:inset-x-28{left:7rem;right:7rem}.lg\:inset-x-32{left:8rem;right:8rem}.lg\:inset-x-36{left:9rem;right:9rem}.lg\:inset-x-40{left:10rem;right:10rem}.lg\:inset-x-44{left:11rem;right:11rem}.lg\:inset-x-48{left:12rem;right:12rem}.lg\:inset-x-52{left:13rem;right:13rem}.lg\:inset-x-56{left:14rem;right:14rem}.lg\:inset-x-60{left:15rem;right:15rem}.lg\:inset-x-64{left:16rem;right:16rem}.lg\:inset-x-72{left:18rem;right:18rem}.lg\:inset-x-80{left:20rem;right:20rem}.lg\:inset-x-96{left:24rem;right:24rem}.lg\:inset-x-auto{left:auto;right:auto}.lg\:inset-x-px{left:1px;right:1px}.lg\:inset-x-0\.5{left:.125rem;right:.125rem}.lg\:inset-x-1\.5{left:.375rem;right:.375rem}.lg\:inset-x-2\.5{left:.625rem;right:.625rem}.lg\:inset-x-3\.5{left:.875rem;right:.875rem}.lg\:-inset-x-0{left:0;right:0}.lg\:-inset-x-1{left:-.25rem;right:-.25rem}.lg\:-inset-x-2{left:-.5rem;right:-.5rem}.lg\:-inset-x-3{left:-.75rem;right:-.75rem}.lg\:-inset-x-4{left:-1rem;right:-1rem}.lg\:-inset-x-5{left:-1.25rem;right:-1.25rem}.lg\:-inset-x-6{left:-1.5rem;right:-1.5rem}.lg\:-inset-x-7{left:-1.75rem;right:-1.75rem}.lg\:-inset-x-8{left:-2rem;right:-2rem}.lg\:-inset-x-9{left:-2.25rem;right:-2.25rem}.lg\:-inset-x-10{left:-2.5rem;right:-2.5rem}.lg\:-inset-x-11{left:-2.75rem;right:-2.75rem}.lg\:-inset-x-12{left:-3rem;right:-3rem}.lg\:-inset-x-14{left:-3.5rem;right:-3.5rem}.lg\:-inset-x-16{left:-4rem;right:-4rem}.lg\:-inset-x-20{left:-5rem;right:-5rem}.lg\:-inset-x-24{left:-6rem;right:-6rem}.lg\:-inset-x-28{left:-7rem;right:-7rem}.lg\:-inset-x-32{left:-8rem;right:-8rem}.lg\:-inset-x-36{left:-9rem;right:-9rem}.lg\:-inset-x-40{left:-10rem;right:-10rem}.lg\:-inset-x-44{left:-11rem;right:-11rem}.lg\:-inset-x-48{left:-12rem;right:-12rem}.lg\:-inset-x-52{left:-13rem;right:-13rem}.lg\:-inset-x-56{left:-14rem;right:-14rem}.lg\:-inset-x-60{left:-15rem;right:-15rem}.lg\:-inset-x-64{left:-16rem;right:-16rem}.lg\:-inset-x-72{left:-18rem;right:-18rem}.lg\:-inset-x-80{left:-20rem;right:-20rem}.lg\:-inset-x-96{left:-24rem;right:-24rem}.lg\:-inset-x-px{left:-1px;right:-1px}.lg\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.lg\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.lg\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.lg\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.lg\:inset-x-1\/2{left:50%;right:50%}.lg\:inset-x-1\/3{left:33.333333%;right:33.333333%}.lg\:inset-x-2\/3{left:66.666667%;right:66.666667%}.lg\:inset-x-1\/4{left:25%;right:25%}.lg\:inset-x-2\/4{left:50%;right:50%}.lg\:inset-x-3\/4{left:75%;right:75%}.lg\:inset-x-full{left:100%;right:100%}.lg\:-inset-x-1\/2{left:-50%;right:-50%}.lg\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.lg\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.lg\:-inset-x-1\/4{left:-25%;right:-25%}.lg\:-inset-x-2\/4{left:-50%;right:-50%}.lg\:-inset-x-3\/4{left:-75%;right:-75%}.lg\:-inset-x-full{left:-100%;right:-100%}.lg\:inset-y-0{top:0;bottom:0}.lg\:inset-y-1{top:.25rem;bottom:.25rem}.lg\:inset-y-2{top:.5rem;bottom:.5rem}.lg\:inset-y-3{top:.75rem;bottom:.75rem}.lg\:inset-y-4{top:1rem;bottom:1rem}.lg\:inset-y-5{top:1.25rem;bottom:1.25rem}.lg\:inset-y-6{top:1.5rem;bottom:1.5rem}.lg\:inset-y-7{top:1.75rem;bottom:1.75rem}.lg\:inset-y-8{top:2rem;bottom:2rem}.lg\:inset-y-9{top:2.25rem;bottom:2.25rem}.lg\:inset-y-10{top:2.5rem;bottom:2.5rem}.lg\:inset-y-11{top:2.75rem;bottom:2.75rem}.lg\:inset-y-12{top:3rem;bottom:3rem}.lg\:inset-y-14{top:3.5rem;bottom:3.5rem}.lg\:inset-y-16{top:4rem;bottom:4rem}.lg\:inset-y-20{top:5rem;bottom:5rem}.lg\:inset-y-24{top:6rem;bottom:6rem}.lg\:inset-y-28{top:7rem;bottom:7rem}.lg\:inset-y-32{top:8rem;bottom:8rem}.lg\:inset-y-36{top:9rem;bottom:9rem}.lg\:inset-y-40{top:10rem;bottom:10rem}.lg\:inset-y-44{top:11rem;bottom:11rem}.lg\:inset-y-48{top:12rem;bottom:12rem}.lg\:inset-y-52{top:13rem;bottom:13rem}.lg\:inset-y-56{top:14rem;bottom:14rem}.lg\:inset-y-60{top:15rem;bottom:15rem}.lg\:inset-y-64{top:16rem;bottom:16rem}.lg\:inset-y-72{top:18rem;bottom:18rem}.lg\:inset-y-80{top:20rem;bottom:20rem}.lg\:inset-y-96{top:24rem;bottom:24rem}.lg\:inset-y-auto{top:auto;bottom:auto}.lg\:inset-y-px{top:1px;bottom:1px}.lg\:inset-y-0\.5{top:.125rem;bottom:.125rem}.lg\:inset-y-1\.5{top:.375rem;bottom:.375rem}.lg\:inset-y-2\.5{top:.625rem;bottom:.625rem}.lg\:inset-y-3\.5{top:.875rem;bottom:.875rem}.lg\:-inset-y-0{top:0;bottom:0}.lg\:-inset-y-1{top:-.25rem;bottom:-.25rem}.lg\:-inset-y-2{top:-.5rem;bottom:-.5rem}.lg\:-inset-y-3{top:-.75rem;bottom:-.75rem}.lg\:-inset-y-4{top:-1rem;bottom:-1rem}.lg\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.lg\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.lg\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.lg\:-inset-y-8{top:-2rem;bottom:-2rem}.lg\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.lg\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.lg\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.lg\:-inset-y-12{top:-3rem;bottom:-3rem}.lg\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.lg\:-inset-y-16{top:-4rem;bottom:-4rem}.lg\:-inset-y-20{top:-5rem;bottom:-5rem}.lg\:-inset-y-24{top:-6rem;bottom:-6rem}.lg\:-inset-y-28{top:-7rem;bottom:-7rem}.lg\:-inset-y-32{top:-8rem;bottom:-8rem}.lg\:-inset-y-36{top:-9rem;bottom:-9rem}.lg\:-inset-y-40{top:-10rem;bottom:-10rem}.lg\:-inset-y-44{top:-11rem;bottom:-11rem}.lg\:-inset-y-48{top:-12rem;bottom:-12rem}.lg\:-inset-y-52{top:-13rem;bottom:-13rem}.lg\:-inset-y-56{top:-14rem;bottom:-14rem}.lg\:-inset-y-60{top:-15rem;bottom:-15rem}.lg\:-inset-y-64{top:-16rem;bottom:-16rem}.lg\:-inset-y-72{top:-18rem;bottom:-18rem}.lg\:-inset-y-80{top:-20rem;bottom:-20rem}.lg\:-inset-y-96{top:-24rem;bottom:-24rem}.lg\:-inset-y-px{top:-1px;bottom:-1px}.lg\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.lg\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.lg\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.lg\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.lg\:inset-y-1\/2{top:50%;bottom:50%}.lg\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.lg\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.lg\:inset-y-1\/4{top:25%;bottom:25%}.lg\:inset-y-2\/4{top:50%;bottom:50%}.lg\:inset-y-3\/4{top:75%;bottom:75%}.lg\:inset-y-full{top:100%;bottom:100%}.lg\:-inset-y-1\/2{top:-50%;bottom:-50%}.lg\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.lg\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.lg\:-inset-y-1\/4{top:-25%;bottom:-25%}.lg\:-inset-y-2\/4{top:-50%;bottom:-50%}.lg\:-inset-y-3\/4{top:-75%;bottom:-75%}.lg\:-inset-y-full{top:-100%;bottom:-100%}.lg\:top-0{top:0}.lg\:top-1{top:.25rem}.lg\:top-2{top:.5rem}.lg\:top-3{top:.75rem}.lg\:top-4{top:1rem}.lg\:top-5{top:1.25rem}.lg\:top-6{top:1.5rem}.lg\:top-7{top:1.75rem}.lg\:top-8{top:2rem}.lg\:top-9{top:2.25rem}.lg\:top-10{top:2.5rem}.lg\:top-11{top:2.75rem}.lg\:top-12{top:3rem}.lg\:top-14{top:3.5rem}.lg\:top-16{top:4rem}.lg\:top-20{top:5rem}.lg\:top-24{top:6rem}.lg\:top-28{top:7rem}.lg\:top-32{top:8rem}.lg\:top-36{top:9rem}.lg\:top-40{top:10rem}.lg\:top-44{top:11rem}.lg\:top-48{top:12rem}.lg\:top-52{top:13rem}.lg\:top-56{top:14rem}.lg\:top-60{top:15rem}.lg\:top-64{top:16rem}.lg\:top-72{top:18rem}.lg\:top-80{top:20rem}.lg\:top-96{top:24rem}.lg\:top-auto{top:auto}.lg\:top-px{top:1px}.lg\:top-0\.5{top:.125rem}.lg\:top-1\.5{top:.375rem}.lg\:top-2\.5{top:.625rem}.lg\:top-3\.5{top:.875rem}.lg\:-top-0{top:0}.lg\:-top-1{top:-.25rem}.lg\:-top-2{top:-.5rem}.lg\:-top-3{top:-.75rem}.lg\:-top-4{top:-1rem}.lg\:-top-5{top:-1.25rem}.lg\:-top-6{top:-1.5rem}.lg\:-top-7{top:-1.75rem}.lg\:-top-8{top:-2rem}.lg\:-top-9{top:-2.25rem}.lg\:-top-10{top:-2.5rem}.lg\:-top-11{top:-2.75rem}.lg\:-top-12{top:-3rem}.lg\:-top-14{top:-3.5rem}.lg\:-top-16{top:-4rem}.lg\:-top-20{top:-5rem}.lg\:-top-24{top:-6rem}.lg\:-top-28{top:-7rem}.lg\:-top-32{top:-8rem}.lg\:-top-36{top:-9rem}.lg\:-top-40{top:-10rem}.lg\:-top-44{top:-11rem}.lg\:-top-48{top:-12rem}.lg\:-top-52{top:-13rem}.lg\:-top-56{top:-14rem}.lg\:-top-60{top:-15rem}.lg\:-top-64{top:-16rem}.lg\:-top-72{top:-18rem}.lg\:-top-80{top:-20rem}.lg\:-top-96{top:-24rem}.lg\:-top-px{top:-1px}.lg\:-top-0\.5{top:-.125rem}.lg\:-top-1\.5{top:-.375rem}.lg\:-top-2\.5{top:-.625rem}.lg\:-top-3\.5{top:-.875rem}.lg\:top-1\/2{top:50%}.lg\:top-1\/3{top:33.333333%}.lg\:top-2\/3{top:66.666667%}.lg\:top-1\/4{top:25%}.lg\:top-2\/4{top:50%}.lg\:top-3\/4{top:75%}.lg\:top-full{top:100%}.lg\:-top-1\/2{top:-50%}.lg\:-top-1\/3{top:-33.333333%}.lg\:-top-2\/3{top:-66.666667%}.lg\:-top-1\/4{top:-25%}.lg\:-top-2\/4{top:-50%}.lg\:-top-3\/4{top:-75%}.lg\:-top-full{top:-100%}.lg\:right-0{right:0}.lg\:right-1{right:.25rem}.lg\:right-2{right:.5rem}.lg\:right-3{right:.75rem}.lg\:right-4{right:1rem}.lg\:right-5{right:1.25rem}.lg\:right-6{right:1.5rem}.lg\:right-7{right:1.75rem}.lg\:right-8{right:2rem}.lg\:right-9{right:2.25rem}.lg\:right-10{right:2.5rem}.lg\:right-11{right:2.75rem}.lg\:right-12{right:3rem}.lg\:right-14{right:3.5rem}.lg\:right-16{right:4rem}.lg\:right-20{right:5rem}.lg\:right-24{right:6rem}.lg\:right-28{right:7rem}.lg\:right-32{right:8rem}.lg\:right-36{right:9rem}.lg\:right-40{right:10rem}.lg\:right-44{right:11rem}.lg\:right-48{right:12rem}.lg\:right-52{right:13rem}.lg\:right-56{right:14rem}.lg\:right-60{right:15rem}.lg\:right-64{right:16rem}.lg\:right-72{right:18rem}.lg\:right-80{right:20rem}.lg\:right-96{right:24rem}.lg\:right-auto{right:auto}.lg\:right-px{right:1px}.lg\:right-0\.5{right:.125rem}.lg\:right-1\.5{right:.375rem}.lg\:right-2\.5{right:.625rem}.lg\:right-3\.5{right:.875rem}.lg\:-right-0{right:0}.lg\:-right-1{right:-.25rem}.lg\:-right-2{right:-.5rem}.lg\:-right-3{right:-.75rem}.lg\:-right-4{right:-1rem}.lg\:-right-5{right:-1.25rem}.lg\:-right-6{right:-1.5rem}.lg\:-right-7{right:-1.75rem}.lg\:-right-8{right:-2rem}.lg\:-right-9{right:-2.25rem}.lg\:-right-10{right:-2.5rem}.lg\:-right-11{right:-2.75rem}.lg\:-right-12{right:-3rem}.lg\:-right-14{right:-3.5rem}.lg\:-right-16{right:-4rem}.lg\:-right-20{right:-5rem}.lg\:-right-24{right:-6rem}.lg\:-right-28{right:-7rem}.lg\:-right-32{right:-8rem}.lg\:-right-36{right:-9rem}.lg\:-right-40{right:-10rem}.lg\:-right-44{right:-11rem}.lg\:-right-48{right:-12rem}.lg\:-right-52{right:-13rem}.lg\:-right-56{right:-14rem}.lg\:-right-60{right:-15rem}.lg\:-right-64{right:-16rem}.lg\:-right-72{right:-18rem}.lg\:-right-80{right:-20rem}.lg\:-right-96{right:-24rem}.lg\:-right-px{right:-1px}.lg\:-right-0\.5{right:-.125rem}.lg\:-right-1\.5{right:-.375rem}.lg\:-right-2\.5{right:-.625rem}.lg\:-right-3\.5{right:-.875rem}.lg\:right-1\/2{right:50%}.lg\:right-1\/3{right:33.333333%}.lg\:right-2\/3{right:66.666667%}.lg\:right-1\/4{right:25%}.lg\:right-2\/4{right:50%}.lg\:right-3\/4{right:75%}.lg\:right-full{right:100%}.lg\:-right-1\/2{right:-50%}.lg\:-right-1\/3{right:-33.333333%}.lg\:-right-2\/3{right:-66.666667%}.lg\:-right-1\/4{right:-25%}.lg\:-right-2\/4{right:-50%}.lg\:-right-3\/4{right:-75%}.lg\:-right-full{right:-100%}.lg\:bottom-0{bottom:0}.lg\:bottom-1{bottom:.25rem}.lg\:bottom-2{bottom:.5rem}.lg\:bottom-3{bottom:.75rem}.lg\:bottom-4{bottom:1rem}.lg\:bottom-5{bottom:1.25rem}.lg\:bottom-6{bottom:1.5rem}.lg\:bottom-7{bottom:1.75rem}.lg\:bottom-8{bottom:2rem}.lg\:bottom-9{bottom:2.25rem}.lg\:bottom-10{bottom:2.5rem}.lg\:bottom-11{bottom:2.75rem}.lg\:bottom-12{bottom:3rem}.lg\:bottom-14{bottom:3.5rem}.lg\:bottom-16{bottom:4rem}.lg\:bottom-20{bottom:5rem}.lg\:bottom-24{bottom:6rem}.lg\:bottom-28{bottom:7rem}.lg\:bottom-32{bottom:8rem}.lg\:bottom-36{bottom:9rem}.lg\:bottom-40{bottom:10rem}.lg\:bottom-44{bottom:11rem}.lg\:bottom-48{bottom:12rem}.lg\:bottom-52{bottom:13rem}.lg\:bottom-56{bottom:14rem}.lg\:bottom-60{bottom:15rem}.lg\:bottom-64{bottom:16rem}.lg\:bottom-72{bottom:18rem}.lg\:bottom-80{bottom:20rem}.lg\:bottom-96{bottom:24rem}.lg\:bottom-auto{bottom:auto}.lg\:bottom-px{bottom:1px}.lg\:bottom-0\.5{bottom:.125rem}.lg\:bottom-1\.5{bottom:.375rem}.lg\:bottom-2\.5{bottom:.625rem}.lg\:bottom-3\.5{bottom:.875rem}.lg\:-bottom-0{bottom:0}.lg\:-bottom-1{bottom:-.25rem}.lg\:-bottom-2{bottom:-.5rem}.lg\:-bottom-3{bottom:-.75rem}.lg\:-bottom-4{bottom:-1rem}.lg\:-bottom-5{bottom:-1.25rem}.lg\:-bottom-6{bottom:-1.5rem}.lg\:-bottom-7{bottom:-1.75rem}.lg\:-bottom-8{bottom:-2rem}.lg\:-bottom-9{bottom:-2.25rem}.lg\:-bottom-10{bottom:-2.5rem}.lg\:-bottom-11{bottom:-2.75rem}.lg\:-bottom-12{bottom:-3rem}.lg\:-bottom-14{bottom:-3.5rem}.lg\:-bottom-16{bottom:-4rem}.lg\:-bottom-20{bottom:-5rem}.lg\:-bottom-24{bottom:-6rem}.lg\:-bottom-28{bottom:-7rem}.lg\:-bottom-32{bottom:-8rem}.lg\:-bottom-36{bottom:-9rem}.lg\:-bottom-40{bottom:-10rem}.lg\:-bottom-44{bottom:-11rem}.lg\:-bottom-48{bottom:-12rem}.lg\:-bottom-52{bottom:-13rem}.lg\:-bottom-56{bottom:-14rem}.lg\:-bottom-60{bottom:-15rem}.lg\:-bottom-64{bottom:-16rem}.lg\:-bottom-72{bottom:-18rem}.lg\:-bottom-80{bottom:-20rem}.lg\:-bottom-96{bottom:-24rem}.lg\:-bottom-px{bottom:-1px}.lg\:-bottom-0\.5{bottom:-.125rem}.lg\:-bottom-1\.5{bottom:-.375rem}.lg\:-bottom-2\.5{bottom:-.625rem}.lg\:-bottom-3\.5{bottom:-.875rem}.lg\:bottom-1\/2{bottom:50%}.lg\:bottom-1\/3{bottom:33.333333%}.lg\:bottom-2\/3{bottom:66.666667%}.lg\:bottom-1\/4{bottom:25%}.lg\:bottom-2\/4{bottom:50%}.lg\:bottom-3\/4{bottom:75%}.lg\:bottom-full{bottom:100%}.lg\:-bottom-1\/2{bottom:-50%}.lg\:-bottom-1\/3{bottom:-33.333333%}.lg\:-bottom-2\/3{bottom:-66.666667%}.lg\:-bottom-1\/4{bottom:-25%}.lg\:-bottom-2\/4{bottom:-50%}.lg\:-bottom-3\/4{bottom:-75%}.lg\:-bottom-full{bottom:-100%}.lg\:left-0{left:0}.lg\:left-1{left:.25rem}.lg\:left-2{left:.5rem}.lg\:left-3{left:.75rem}.lg\:left-4{left:1rem}.lg\:left-5{left:1.25rem}.lg\:left-6{left:1.5rem}.lg\:left-7{left:1.75rem}.lg\:left-8{left:2rem}.lg\:left-9{left:2.25rem}.lg\:left-10{left:2.5rem}.lg\:left-11{left:2.75rem}.lg\:left-12{left:3rem}.lg\:left-14{left:3.5rem}.lg\:left-16{left:4rem}.lg\:left-20{left:5rem}.lg\:left-24{left:6rem}.lg\:left-28{left:7rem}.lg\:left-32{left:8rem}.lg\:left-36{left:9rem}.lg\:left-40{left:10rem}.lg\:left-44{left:11rem}.lg\:left-48{left:12rem}.lg\:left-52{left:13rem}.lg\:left-56{left:14rem}.lg\:left-60{left:15rem}.lg\:left-64{left:16rem}.lg\:left-72{left:18rem}.lg\:left-80{left:20rem}.lg\:left-96{left:24rem}.lg\:left-auto{left:auto}.lg\:left-px{left:1px}.lg\:left-0\.5{left:.125rem}.lg\:left-1\.5{left:.375rem}.lg\:left-2\.5{left:.625rem}.lg\:left-3\.5{left:.875rem}.lg\:-left-0{left:0}.lg\:-left-1{left:-.25rem}.lg\:-left-2{left:-.5rem}.lg\:-left-3{left:-.75rem}.lg\:-left-4{left:-1rem}.lg\:-left-5{left:-1.25rem}.lg\:-left-6{left:-1.5rem}.lg\:-left-7{left:-1.75rem}.lg\:-left-8{left:-2rem}.lg\:-left-9{left:-2.25rem}.lg\:-left-10{left:-2.5rem}.lg\:-left-11{left:-2.75rem}.lg\:-left-12{left:-3rem}.lg\:-left-14{left:-3.5rem}.lg\:-left-16{left:-4rem}.lg\:-left-20{left:-5rem}.lg\:-left-24{left:-6rem}.lg\:-left-28{left:-7rem}.lg\:-left-32{left:-8rem}.lg\:-left-36{left:-9rem}.lg\:-left-40{left:-10rem}.lg\:-left-44{left:-11rem}.lg\:-left-48{left:-12rem}.lg\:-left-52{left:-13rem}.lg\:-left-56{left:-14rem}.lg\:-left-60{left:-15rem}.lg\:-left-64{left:-16rem}.lg\:-left-72{left:-18rem}.lg\:-left-80{left:-20rem}.lg\:-left-96{left:-24rem}.lg\:-left-px{left:-1px}.lg\:-left-0\.5{left:-.125rem}.lg\:-left-1\.5{left:-.375rem}.lg\:-left-2\.5{left:-.625rem}.lg\:-left-3\.5{left:-.875rem}.lg\:left-1\/2{left:50%}.lg\:left-1\/3{left:33.333333%}.lg\:left-2\/3{left:66.666667%}.lg\:left-1\/4{left:25%}.lg\:left-2\/4{left:50%}.lg\:left-3\/4{left:75%}.lg\:left-full{left:100%}.lg\:-left-1\/2{left:-50%}.lg\:-left-1\/3{left:-33.333333%}.lg\:-left-2\/3{left:-66.666667%}.lg\:-left-1\/4{left:-25%}.lg\:-left-2\/4{left:-50%}.lg\:-left-3\/4{left:-75%}.lg\:-left-full{left:-100%}.lg\:isolate{isolation:isolate}.lg\:isolation-auto{isolation:auto}.lg\:z-0{z-index:0}.lg\:z-10{z-index:10}.lg\:z-20{z-index:20}.lg\:z-30{z-index:30}.lg\:z-40{z-index:40}.lg\:z-50{z-index:50}.lg\:z-auto{z-index:auto}.lg\:focus-within\:z-0:focus-within{z-index:0}.lg\:focus-within\:z-10:focus-within{z-index:10}.lg\:focus-within\:z-20:focus-within{z-index:20}.lg\:focus-within\:z-30:focus-within{z-index:30}.lg\:focus-within\:z-40:focus-within{z-index:40}.lg\:focus-within\:z-50:focus-within{z-index:50}.lg\:focus-within\:z-auto:focus-within{z-index:auto}.lg\:focus\:z-0:focus{z-index:0}.lg\:focus\:z-10:focus{z-index:10}.lg\:focus\:z-20:focus{z-index:20}.lg\:focus\:z-30:focus{z-index:30}.lg\:focus\:z-40:focus{z-index:40}.lg\:focus\:z-50:focus{z-index:50}.lg\:focus\:z-auto:focus{z-index:auto}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-4{order:4}.lg\:order-5{order:5}.lg\:order-6{order:6}.lg\:order-7{order:7}.lg\:order-8{order:8}.lg\:order-9{order:9}.lg\:order-10{order:10}.lg\:order-11{order:11}.lg\:order-12{order:12}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:order-none{order:0}.lg\:col-auto{grid-column:auto}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-4{grid-column-start:4}.lg\:col-start-5{grid-column-start:5}.lg\:col-start-6{grid-column-start:6}.lg\:col-start-7{grid-column-start:7}.lg\:col-start-8{grid-column-start:8}.lg\:col-start-9{grid-column-start:9}.lg\:col-start-10{grid-column-start:10}.lg\:col-start-11{grid-column-start:11}.lg\:col-start-12{grid-column-start:12}.lg\:col-start-13{grid-column-start:13}.lg\:col-start-auto{grid-column-start:auto}.lg\:col-end-1{grid-column-end:1}.lg\:col-end-2{grid-column-end:2}.lg\:col-end-3{grid-column-end:3}.lg\:col-end-4{grid-column-end:4}.lg\:col-end-5{grid-column-end:5}.lg\:col-end-6{grid-column-end:6}.lg\:col-end-7{grid-column-end:7}.lg\:col-end-8{grid-column-end:8}.lg\:col-end-9{grid-column-end:9}.lg\:col-end-10{grid-column-end:10}.lg\:col-end-11{grid-column-end:11}.lg\:col-end-12{grid-column-end:12}.lg\:col-end-13{grid-column-end:13}.lg\:col-end-auto{grid-column-end:auto}.lg\:row-auto{grid-row:auto}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-span-3{grid-row:span 3/span 3}.lg\:row-span-4{grid-row:span 4/span 4}.lg\:row-span-5{grid-row:span 5/span 5}.lg\:row-span-6{grid-row:span 6/span 6}.lg\:row-span-full{grid-row:1/-1}.lg\:row-start-1{grid-row-start:1}.lg\:row-start-2{grid-row-start:2}.lg\:row-start-3{grid-row-start:3}.lg\:row-start-4{grid-row-start:4}.lg\:row-start-5{grid-row-start:5}.lg\:row-start-6{grid-row-start:6}.lg\:row-start-7{grid-row-start:7}.lg\:row-start-auto{grid-row-start:auto}.lg\:row-end-1{grid-row-end:1}.lg\:row-end-2{grid-row-end:2}.lg\:row-end-3{grid-row-end:3}.lg\:row-end-4{grid-row-end:4}.lg\:row-end-5{grid-row-end:5}.lg\:row-end-6{grid-row-end:6}.lg\:row-end-7{grid-row-end:7}.lg\:row-end-auto{grid-row-end:auto}.lg\:float-right{float:right}.lg\:float-left{float:left}.lg\:float-none{float:none}.lg\:clear-left{clear:left}.lg\:clear-right{clear:right}.lg\:clear-both{clear:both}.lg\:clear-none{clear:none}.lg\:m-0{margin:0}.lg\:m-1{margin:.25rem}.lg\:m-2{margin:.5rem}.lg\:m-3{margin:.75rem}.lg\:m-4{margin:1rem}.lg\:m-5{margin:1.25rem}.lg\:m-6{margin:1.5rem}.lg\:m-7{margin:1.75rem}.lg\:m-8{margin:2rem}.lg\:m-9{margin:2.25rem}.lg\:m-10{margin:2.5rem}.lg\:m-11{margin:2.75rem}.lg\:m-12{margin:3rem}.lg\:m-14{margin:3.5rem}.lg\:m-16{margin:4rem}.lg\:m-20{margin:5rem}.lg\:m-24{margin:6rem}.lg\:m-28{margin:7rem}.lg\:m-32{margin:8rem}.lg\:m-36{margin:9rem}.lg\:m-40{margin:10rem}.lg\:m-44{margin:11rem}.lg\:m-48{margin:12rem}.lg\:m-52{margin:13rem}.lg\:m-56{margin:14rem}.lg\:m-60{margin:15rem}.lg\:m-64{margin:16rem}.lg\:m-72{margin:18rem}.lg\:m-80{margin:20rem}.lg\:m-96{margin:24rem}.lg\:m-auto{margin:auto}.lg\:m-px{margin:1px}.lg\:m-0\.5{margin:.125rem}.lg\:m-1\.5{margin:.375rem}.lg\:m-2\.5{margin:.625rem}.lg\:m-3\.5{margin:.875rem}.lg\:-m-0{margin:0}.lg\:-m-1{margin:-.25rem}.lg\:-m-2{margin:-.5rem}.lg\:-m-3{margin:-.75rem}.lg\:-m-4{margin:-1rem}.lg\:-m-5{margin:-1.25rem}.lg\:-m-6{margin:-1.5rem}.lg\:-m-7{margin:-1.75rem}.lg\:-m-8{margin:-2rem}.lg\:-m-9{margin:-2.25rem}.lg\:-m-10{margin:-2.5rem}.lg\:-m-11{margin:-2.75rem}.lg\:-m-12{margin:-3rem}.lg\:-m-14{margin:-3.5rem}.lg\:-m-16{margin:-4rem}.lg\:-m-20{margin:-5rem}.lg\:-m-24{margin:-6rem}.lg\:-m-28{margin:-7rem}.lg\:-m-32{margin:-8rem}.lg\:-m-36{margin:-9rem}.lg\:-m-40{margin:-10rem}.lg\:-m-44{margin:-11rem}.lg\:-m-48{margin:-12rem}.lg\:-m-52{margin:-13rem}.lg\:-m-56{margin:-14rem}.lg\:-m-60{margin:-15rem}.lg\:-m-64{margin:-16rem}.lg\:-m-72{margin:-18rem}.lg\:-m-80{margin:-20rem}.lg\:-m-96{margin:-24rem}.lg\:-m-px{margin:-1px}.lg\:-m-0\.5{margin:-.125rem}.lg\:-m-1\.5{margin:-.375rem}.lg\:-m-2\.5{margin:-.625rem}.lg\:-m-3\.5{margin:-.875rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:mx-1{margin-left:.25rem;margin-right:.25rem}.lg\:mx-2{margin-left:.5rem;margin-right:.5rem}.lg\:mx-3{margin-left:.75rem;margin-right:.75rem}.lg\:mx-4{margin-left:1rem;margin-right:1rem}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.lg\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.lg\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.lg\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.lg\:mx-12{margin-left:3rem;margin-right:3rem}.lg\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.lg\:mx-16{margin-left:4rem;margin-right:4rem}.lg\:mx-20{margin-left:5rem;margin-right:5rem}.lg\:mx-24{margin-left:6rem;margin-right:6rem}.lg\:mx-28{margin-left:7rem;margin-right:7rem}.lg\:mx-32{margin-left:8rem;margin-right:8rem}.lg\:mx-36{margin-left:9rem;margin-right:9rem}.lg\:mx-40{margin-left:10rem;margin-right:10rem}.lg\:mx-44{margin-left:11rem;margin-right:11rem}.lg\:mx-48{margin-left:12rem;margin-right:12rem}.lg\:mx-52{margin-left:13rem;margin-right:13rem}.lg\:mx-56{margin-left:14rem;margin-right:14rem}.lg\:mx-60{margin-left:15rem;margin-right:15rem}.lg\:mx-64{margin-left:16rem;margin-right:16rem}.lg\:mx-72{margin-left:18rem;margin-right:18rem}.lg\:mx-80{margin-left:20rem;margin-right:20rem}.lg\:mx-96{margin-left:24rem;margin-right:24rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:mx-px{margin-left:1px;margin-right:1px}.lg\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.lg\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.lg\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.lg\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.lg\:-mx-0{margin-left:0;margin-right:0}.lg\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.lg\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.lg\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.lg\:-mx-4{margin-left:-1rem;margin-right:-1rem}.lg\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lg\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.lg\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.lg\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.lg\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.lg\:-mx-12{margin-left:-3rem;margin-right:-3rem}.lg\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.lg\:-mx-16{margin-left:-4rem;margin-right:-4rem}.lg\:-mx-20{margin-left:-5rem;margin-right:-5rem}.lg\:-mx-24{margin-left:-6rem;margin-right:-6rem}.lg\:-mx-28{margin-left:-7rem;margin-right:-7rem}.lg\:-mx-32{margin-left:-8rem;margin-right:-8rem}.lg\:-mx-36{margin-left:-9rem;margin-right:-9rem}.lg\:-mx-40{margin-left:-10rem;margin-right:-10rem}.lg\:-mx-44{margin-left:-11rem;margin-right:-11rem}.lg\:-mx-48{margin-left:-12rem;margin-right:-12rem}.lg\:-mx-52{margin-left:-13rem;margin-right:-13rem}.lg\:-mx-56{margin-left:-14rem;margin-right:-14rem}.lg\:-mx-60{margin-left:-15rem;margin-right:-15rem}.lg\:-mx-64{margin-left:-16rem;margin-right:-16rem}.lg\:-mx-72{margin-left:-18rem;margin-right:-18rem}.lg\:-mx-80{margin-left:-20rem;margin-right:-20rem}.lg\:-mx-96{margin-left:-24rem;margin-right:-24rem}.lg\:-mx-px{margin-left:-1px;margin-right:-1px}.lg\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.lg\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.lg\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.lg\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:my-1{margin-top:.25rem;margin-bottom:.25rem}.lg\:my-2{margin-top:.5rem;margin-bottom:.5rem}.lg\:my-3{margin-top:.75rem;margin-bottom:.75rem}.lg\:my-4{margin-top:1rem;margin-bottom:1rem}.lg\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.lg\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lg\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.lg\:my-8{margin-top:2rem;margin-bottom:2rem}.lg\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.lg\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.lg\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.lg\:my-12{margin-top:3rem;margin-bottom:3rem}.lg\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.lg\:my-16{margin-top:4rem;margin-bottom:4rem}.lg\:my-20{margin-top:5rem;margin-bottom:5rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:my-28{margin-top:7rem;margin-bottom:7rem}.lg\:my-32{margin-top:8rem;margin-bottom:8rem}.lg\:my-36{margin-top:9rem;margin-bottom:9rem}.lg\:my-40{margin-top:10rem;margin-bottom:10rem}.lg\:my-44{margin-top:11rem;margin-bottom:11rem}.lg\:my-48{margin-top:12rem;margin-bottom:12rem}.lg\:my-52{margin-top:13rem;margin-bottom:13rem}.lg\:my-56{margin-top:14rem;margin-bottom:14rem}.lg\:my-60{margin-top:15rem;margin-bottom:15rem}.lg\:my-64{margin-top:16rem;margin-bottom:16rem}.lg\:my-72{margin-top:18rem;margin-bottom:18rem}.lg\:my-80{margin-top:20rem;margin-bottom:20rem}.lg\:my-96{margin-top:24rem;margin-bottom:24rem}.lg\:my-auto{margin-top:auto;margin-bottom:auto}.lg\:my-px{margin-top:1px;margin-bottom:1px}.lg\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.lg\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.lg\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.lg\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.lg\:-my-0{margin-top:0;margin-bottom:0}.lg\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.lg\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.lg\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.lg\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.lg\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.lg\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.lg\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.lg\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.lg\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.lg\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.lg\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.lg\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.lg\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.lg\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.lg\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.lg\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.lg\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.lg\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.lg\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.lg\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.lg\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.lg\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.lg\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.lg\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.lg\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.lg\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.lg\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.lg\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.lg\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.lg\:-my-px{margin-top:-1px;margin-bottom:-1px}.lg\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.lg\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.lg\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.lg\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.lg\:mt-0{margin-top:0}.lg\:mt-1{margin-top:.25rem}.lg\:mt-2{margin-top:.5rem}.lg\:mt-3{margin-top:.75rem}.lg\:mt-4{margin-top:1rem}.lg\:mt-5{margin-top:1.25rem}.lg\:mt-6{margin-top:1.5rem}.lg\:mt-7{margin-top:1.75rem}.lg\:mt-8{margin-top:2rem}.lg\:mt-9{margin-top:2.25rem}.lg\:mt-10{margin-top:2.5rem}.lg\:mt-11{margin-top:2.75rem}.lg\:mt-12{margin-top:3rem}.lg\:mt-14{margin-top:3.5rem}.lg\:mt-16{margin-top:4rem}.lg\:mt-20{margin-top:5rem}.lg\:mt-24{margin-top:6rem}.lg\:mt-28{margin-top:7rem}.lg\:mt-32{margin-top:8rem}.lg\:mt-36{margin-top:9rem}.lg\:mt-40{margin-top:10rem}.lg\:mt-44{margin-top:11rem}.lg\:mt-48{margin-top:12rem}.lg\:mt-52{margin-top:13rem}.lg\:mt-56{margin-top:14rem}.lg\:mt-60{margin-top:15rem}.lg\:mt-64{margin-top:16rem}.lg\:mt-72{margin-top:18rem}.lg\:mt-80{margin-top:20rem}.lg\:mt-96{margin-top:24rem}.lg\:mt-auto{margin-top:auto}.lg\:mt-px{margin-top:1px}.lg\:mt-0\.5{margin-top:.125rem}.lg\:mt-1\.5{margin-top:.375rem}.lg\:mt-2\.5{margin-top:.625rem}.lg\:mt-3\.5{margin-top:.875rem}.lg\:-mt-0{margin-top:0}.lg\:-mt-1{margin-top:-.25rem}.lg\:-mt-2{margin-top:-.5rem}.lg\:-mt-3{margin-top:-.75rem}.lg\:-mt-4{margin-top:-1rem}.lg\:-mt-5{margin-top:-1.25rem}.lg\:-mt-6{margin-top:-1.5rem}.lg\:-mt-7{margin-top:-1.75rem}.lg\:-mt-8{margin-top:-2rem}.lg\:-mt-9{margin-top:-2.25rem}.lg\:-mt-10{margin-top:-2.5rem}.lg\:-mt-11{margin-top:-2.75rem}.lg\:-mt-12{margin-top:-3rem}.lg\:-mt-14{margin-top:-3.5rem}.lg\:-mt-16{margin-top:-4rem}.lg\:-mt-20{margin-top:-5rem}.lg\:-mt-24{margin-top:-6rem}.lg\:-mt-28{margin-top:-7rem}.lg\:-mt-32{margin-top:-8rem}.lg\:-mt-36{margin-top:-9rem}.lg\:-mt-40{margin-top:-10rem}.lg\:-mt-44{margin-top:-11rem}.lg\:-mt-48{margin-top:-12rem}.lg\:-mt-52{margin-top:-13rem}.lg\:-mt-56{margin-top:-14rem}.lg\:-mt-60{margin-top:-15rem}.lg\:-mt-64{margin-top:-16rem}.lg\:-mt-72{margin-top:-18rem}.lg\:-mt-80{margin-top:-20rem}.lg\:-mt-96{margin-top:-24rem}.lg\:-mt-px{margin-top:-1px}.lg\:-mt-0\.5{margin-top:-.125rem}.lg\:-mt-1\.5{margin-top:-.375rem}.lg\:-mt-2\.5{margin-top:-.625rem}.lg\:-mt-3\.5{margin-top:-.875rem}.lg\:mr-0{margin-right:0}.lg\:mr-1{margin-right:.25rem}.lg\:mr-2{margin-right:.5rem}.lg\:mr-3{margin-right:.75rem}.lg\:mr-4{margin-right:1rem}.lg\:mr-5{margin-right:1.25rem}.lg\:mr-6{margin-right:1.5rem}.lg\:mr-7{margin-right:1.75rem}.lg\:mr-8{margin-right:2rem}.lg\:mr-9{margin-right:2.25rem}.lg\:mr-10{margin-right:2.5rem}.lg\:mr-11{margin-right:2.75rem}.lg\:mr-12{margin-right:3rem}.lg\:mr-14{margin-right:3.5rem}.lg\:mr-16{margin-right:4rem}.lg\:mr-20{margin-right:5rem}.lg\:mr-24{margin-right:6rem}.lg\:mr-28{margin-right:7rem}.lg\:mr-32{margin-right:8rem}.lg\:mr-36{margin-right:9rem}.lg\:mr-40{margin-right:10rem}.lg\:mr-44{margin-right:11rem}.lg\:mr-48{margin-right:12rem}.lg\:mr-52{margin-right:13rem}.lg\:mr-56{margin-right:14rem}.lg\:mr-60{margin-right:15rem}.lg\:mr-64{margin-right:16rem}.lg\:mr-72{margin-right:18rem}.lg\:mr-80{margin-right:20rem}.lg\:mr-96{margin-right:24rem}.lg\:mr-auto{margin-right:auto}.lg\:mr-px{margin-right:1px}.lg\:mr-0\.5{margin-right:.125rem}.lg\:mr-1\.5{margin-right:.375rem}.lg\:mr-2\.5{margin-right:.625rem}.lg\:mr-3\.5{margin-right:.875rem}.lg\:-mr-0{margin-right:0}.lg\:-mr-1{margin-right:-.25rem}.lg\:-mr-2{margin-right:-.5rem}.lg\:-mr-3{margin-right:-.75rem}.lg\:-mr-4{margin-right:-1rem}.lg\:-mr-5{margin-right:-1.25rem}.lg\:-mr-6{margin-right:-1.5rem}.lg\:-mr-7{margin-right:-1.75rem}.lg\:-mr-8{margin-right:-2rem}.lg\:-mr-9{margin-right:-2.25rem}.lg\:-mr-10{margin-right:-2.5rem}.lg\:-mr-11{margin-right:-2.75rem}.lg\:-mr-12{margin-right:-3rem}.lg\:-mr-14{margin-right:-3.5rem}.lg\:-mr-16{margin-right:-4rem}.lg\:-mr-20{margin-right:-5rem}.lg\:-mr-24{margin-right:-6rem}.lg\:-mr-28{margin-right:-7rem}.lg\:-mr-32{margin-right:-8rem}.lg\:-mr-36{margin-right:-9rem}.lg\:-mr-40{margin-right:-10rem}.lg\:-mr-44{margin-right:-11rem}.lg\:-mr-48{margin-right:-12rem}.lg\:-mr-52{margin-right:-13rem}.lg\:-mr-56{margin-right:-14rem}.lg\:-mr-60{margin-right:-15rem}.lg\:-mr-64{margin-right:-16rem}.lg\:-mr-72{margin-right:-18rem}.lg\:-mr-80{margin-right:-20rem}.lg\:-mr-96{margin-right:-24rem}.lg\:-mr-px{margin-right:-1px}.lg\:-mr-0\.5{margin-right:-.125rem}.lg\:-mr-1\.5{margin-right:-.375rem}.lg\:-mr-2\.5{margin-right:-.625rem}.lg\:-mr-3\.5{margin-right:-.875rem}.lg\:mb-0{margin-bottom:0}.lg\:mb-1{margin-bottom:.25rem}.lg\:mb-2{margin-bottom:.5rem}.lg\:mb-3{margin-bottom:.75rem}.lg\:mb-4{margin-bottom:1rem}.lg\:mb-5{margin-bottom:1.25rem}.lg\:mb-6{margin-bottom:1.5rem}.lg\:mb-7{margin-bottom:1.75rem}.lg\:mb-8{margin-bottom:2rem}.lg\:mb-9{margin-bottom:2.25rem}.lg\:mb-10{margin-bottom:2.5rem}.lg\:mb-11{margin-bottom:2.75rem}.lg\:mb-12{margin-bottom:3rem}.lg\:mb-14{margin-bottom:3.5rem}.lg\:mb-16{margin-bottom:4rem}.lg\:mb-20{margin-bottom:5rem}.lg\:mb-24{margin-bottom:6rem}.lg\:mb-28{margin-bottom:7rem}.lg\:mb-32{margin-bottom:8rem}.lg\:mb-36{margin-bottom:9rem}.lg\:mb-40{margin-bottom:10rem}.lg\:mb-44{margin-bottom:11rem}.lg\:mb-48{margin-bottom:12rem}.lg\:mb-52{margin-bottom:13rem}.lg\:mb-56{margin-bottom:14rem}.lg\:mb-60{margin-bottom:15rem}.lg\:mb-64{margin-bottom:16rem}.lg\:mb-72{margin-bottom:18rem}.lg\:mb-80{margin-bottom:20rem}.lg\:mb-96{margin-bottom:24rem}.lg\:mb-auto{margin-bottom:auto}.lg\:mb-px{margin-bottom:1px}.lg\:mb-0\.5{margin-bottom:.125rem}.lg\:mb-1\.5{margin-bottom:.375rem}.lg\:mb-2\.5{margin-bottom:.625rem}.lg\:mb-3\.5{margin-bottom:.875rem}.lg\:-mb-0{margin-bottom:0}.lg\:-mb-1{margin-bottom:-.25rem}.lg\:-mb-2{margin-bottom:-.5rem}.lg\:-mb-3{margin-bottom:-.75rem}.lg\:-mb-4{margin-bottom:-1rem}.lg\:-mb-5{margin-bottom:-1.25rem}.lg\:-mb-6{margin-bottom:-1.5rem}.lg\:-mb-7{margin-bottom:-1.75rem}.lg\:-mb-8{margin-bottom:-2rem}.lg\:-mb-9{margin-bottom:-2.25rem}.lg\:-mb-10{margin-bottom:-2.5rem}.lg\:-mb-11{margin-bottom:-2.75rem}.lg\:-mb-12{margin-bottom:-3rem}.lg\:-mb-14{margin-bottom:-3.5rem}.lg\:-mb-16{margin-bottom:-4rem}.lg\:-mb-20{margin-bottom:-5rem}.lg\:-mb-24{margin-bottom:-6rem}.lg\:-mb-28{margin-bottom:-7rem}.lg\:-mb-32{margin-bottom:-8rem}.lg\:-mb-36{margin-bottom:-9rem}.lg\:-mb-40{margin-bottom:-10rem}.lg\:-mb-44{margin-bottom:-11rem}.lg\:-mb-48{margin-bottom:-12rem}.lg\:-mb-52{margin-bottom:-13rem}.lg\:-mb-56{margin-bottom:-14rem}.lg\:-mb-60{margin-bottom:-15rem}.lg\:-mb-64{margin-bottom:-16rem}.lg\:-mb-72{margin-bottom:-18rem}.lg\:-mb-80{margin-bottom:-20rem}.lg\:-mb-96{margin-bottom:-24rem}.lg\:-mb-px{margin-bottom:-1px}.lg\:-mb-0\.5{margin-bottom:-.125rem}.lg\:-mb-1\.5{margin-bottom:-.375rem}.lg\:-mb-2\.5{margin-bottom:-.625rem}.lg\:-mb-3\.5{margin-bottom:-.875rem}.lg\:ml-0{margin-left:0}.lg\:ml-1{margin-left:.25rem}.lg\:ml-2{margin-left:.5rem}.lg\:ml-3{margin-left:.75rem}.lg\:ml-4{margin-left:1rem}.lg\:ml-5{margin-left:1.25rem}.lg\:ml-6{margin-left:1.5rem}.lg\:ml-7{margin-left:1.75rem}.lg\:ml-8{margin-left:2rem}.lg\:ml-9{margin-left:2.25rem}.lg\:ml-10{margin-left:2.5rem}.lg\:ml-11{margin-left:2.75rem}.lg\:ml-12{margin-left:3rem}.lg\:ml-14{margin-left:3.5rem}.lg\:ml-16{margin-left:4rem}.lg\:ml-20{margin-left:5rem}.lg\:ml-24{margin-left:6rem}.lg\:ml-28{margin-left:7rem}.lg\:ml-32{margin-left:8rem}.lg\:ml-36{margin-left:9rem}.lg\:ml-40{margin-left:10rem}.lg\:ml-44{margin-left:11rem}.lg\:ml-48{margin-left:12rem}.lg\:ml-52{margin-left:13rem}.lg\:ml-56{margin-left:14rem}.lg\:ml-60{margin-left:15rem}.lg\:ml-64{margin-left:16rem}.lg\:ml-72{margin-left:18rem}.lg\:ml-80{margin-left:20rem}.lg\:ml-96{margin-left:24rem}.lg\:ml-auto{margin-left:auto}.lg\:ml-px{margin-left:1px}.lg\:ml-0\.5{margin-left:.125rem}.lg\:ml-1\.5{margin-left:.375rem}.lg\:ml-2\.5{margin-left:.625rem}.lg\:ml-3\.5{margin-left:.875rem}.lg\:-ml-0{margin-left:0}.lg\:-ml-1{margin-left:-.25rem}.lg\:-ml-2{margin-left:-.5rem}.lg\:-ml-3{margin-left:-.75rem}.lg\:-ml-4{margin-left:-1rem}.lg\:-ml-5{margin-left:-1.25rem}.lg\:-ml-6{margin-left:-1.5rem}.lg\:-ml-7{margin-left:-1.75rem}.lg\:-ml-8{margin-left:-2rem}.lg\:-ml-9{margin-left:-2.25rem}.lg\:-ml-10{margin-left:-2.5rem}.lg\:-ml-11{margin-left:-2.75rem}.lg\:-ml-12{margin-left:-3rem}.lg\:-ml-14{margin-left:-3.5rem}.lg\:-ml-16{margin-left:-4rem}.lg\:-ml-20{margin-left:-5rem}.lg\:-ml-24{margin-left:-6rem}.lg\:-ml-28{margin-left:-7rem}.lg\:-ml-32{margin-left:-8rem}.lg\:-ml-36{margin-left:-9rem}.lg\:-ml-40{margin-left:-10rem}.lg\:-ml-44{margin-left:-11rem}.lg\:-ml-48{margin-left:-12rem}.lg\:-ml-52{margin-left:-13rem}.lg\:-ml-56{margin-left:-14rem}.lg\:-ml-60{margin-left:-15rem}.lg\:-ml-64{margin-left:-16rem}.lg\:-ml-72{margin-left:-18rem}.lg\:-ml-80{margin-left:-20rem}.lg\:-ml-96{margin-left:-24rem}.lg\:-ml-px{margin-left:-1px}.lg\:-ml-0\.5{margin-left:-.125rem}.lg\:-ml-1\.5{margin-left:-.375rem}.lg\:-ml-2\.5{margin-left:-.625rem}.lg\:-ml-3\.5{margin-left:-.875rem}.lg\:box-border{box-sizing:border-box}.lg\:box-content{box-sizing:initial}.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:table{display:table}.lg\:inline-table{display:inline-table}.lg\:table-caption{display:table-caption}.lg\:table-cell{display:table-cell}.lg\:table-column{display:table-column}.lg\:table-column-group{display:table-column-group}.lg\:table-footer-group{display:table-footer-group}.lg\:table-header-group{display:table-header-group}.lg\:table-row-group{display:table-row-group}.lg\:table-row{display:table-row}.lg\:flow-root{display:flow-root}.lg\:grid{display:grid}.lg\:inline-grid{display:inline-grid}.lg\:contents{display:contents}.lg\:list-item{display:list-item}.lg\:hidden{display:none}.lg\:h-0{height:0}.lg\:h-1{height:.25rem}.lg\:h-2{height:.5rem}.lg\:h-3{height:.75rem}.lg\:h-4{height:1rem}.lg\:h-5{height:1.25rem}.lg\:h-6{height:1.5rem}.lg\:h-7{height:1.75rem}.lg\:h-8{height:2rem}.lg\:h-9{height:2.25rem}.lg\:h-10{height:2.5rem}.lg\:h-11{height:2.75rem}.lg\:h-12{height:3rem}.lg\:h-14{height:3.5rem}.lg\:h-16{height:4rem}.lg\:h-20{height:5rem}.lg\:h-24{height:6rem}.lg\:h-28{height:7rem}.lg\:h-32{height:8rem}.lg\:h-36{height:9rem}.lg\:h-40{height:10rem}.lg\:h-44{height:11rem}.lg\:h-48{height:12rem}.lg\:h-52{height:13rem}.lg\:h-56{height:14rem}.lg\:h-60{height:15rem}.lg\:h-64{height:16rem}.lg\:h-72{height:18rem}.lg\:h-80{height:20rem}.lg\:h-96{height:24rem}.lg\:h-auto{height:auto}.lg\:h-px{height:1px}.lg\:h-0\.5{height:.125rem}.lg\:h-1\.5{height:.375rem}.lg\:h-2\.5{height:.625rem}.lg\:h-3\.5{height:.875rem}.lg\:h-1\/2{height:50%}.lg\:h-1\/3{height:33.333333%}.lg\:h-2\/3{height:66.666667%}.lg\:h-1\/4{height:25%}.lg\:h-2\/4{height:50%}.lg\:h-3\/4{height:75%}.lg\:h-1\/5{height:20%}.lg\:h-2\/5{height:40%}.lg\:h-3\/5{height:60%}.lg\:h-4\/5{height:80%}.lg\:h-1\/6{height:16.666667%}.lg\:h-2\/6{height:33.333333%}.lg\:h-3\/6{height:50%}.lg\:h-4\/6{height:66.666667%}.lg\:h-5\/6{height:83.333333%}.lg\:h-full{height:100%}.lg\:h-screen{height:100vh}.lg\:max-h-0{max-height:0}.lg\:max-h-1{max-height:.25rem}.lg\:max-h-2{max-height:.5rem}.lg\:max-h-3{max-height:.75rem}.lg\:max-h-4{max-height:1rem}.lg\:max-h-5{max-height:1.25rem}.lg\:max-h-6{max-height:1.5rem}.lg\:max-h-7{max-height:1.75rem}.lg\:max-h-8{max-height:2rem}.lg\:max-h-9{max-height:2.25rem}.lg\:max-h-10{max-height:2.5rem}.lg\:max-h-11{max-height:2.75rem}.lg\:max-h-12{max-height:3rem}.lg\:max-h-14{max-height:3.5rem}.lg\:max-h-16{max-height:4rem}.lg\:max-h-20{max-height:5rem}.lg\:max-h-24{max-height:6rem}.lg\:max-h-28{max-height:7rem}.lg\:max-h-32{max-height:8rem}.lg\:max-h-36{max-height:9rem}.lg\:max-h-40{max-height:10rem}.lg\:max-h-44{max-height:11rem}.lg\:max-h-48{max-height:12rem}.lg\:max-h-52{max-height:13rem}.lg\:max-h-56{max-height:14rem}.lg\:max-h-60{max-height:15rem}.lg\:max-h-64{max-height:16rem}.lg\:max-h-72{max-height:18rem}.lg\:max-h-80{max-height:20rem}.lg\:max-h-96{max-height:24rem}.lg\:max-h-px{max-height:1px}.lg\:max-h-0\.5{max-height:.125rem}.lg\:max-h-1\.5{max-height:.375rem}.lg\:max-h-2\.5{max-height:.625rem}.lg\:max-h-3\.5{max-height:.875rem}.lg\:max-h-full{max-height:100%}.lg\:max-h-screen{max-height:100vh}.lg\:min-h-0{min-height:0}.lg\:min-h-full{min-height:100%}.lg\:min-h-screen{min-height:100vh}.lg\:w-0{width:0}.lg\:w-1{width:.25rem}.lg\:w-2{width:.5rem}.lg\:w-3{width:.75rem}.lg\:w-4{width:1rem}.lg\:w-5{width:1.25rem}.lg\:w-6{width:1.5rem}.lg\:w-7{width:1.75rem}.lg\:w-8{width:2rem}.lg\:w-9{width:2.25rem}.lg\:w-10{width:2.5rem}.lg\:w-11{width:2.75rem}.lg\:w-12{width:3rem}.lg\:w-14{width:3.5rem}.lg\:w-16{width:4rem}.lg\:w-20{width:5rem}.lg\:w-24{width:6rem}.lg\:w-28{width:7rem}.lg\:w-32{width:8rem}.lg\:w-36{width:9rem}.lg\:w-40{width:10rem}.lg\:w-44{width:11rem}.lg\:w-48{width:12rem}.lg\:w-52{width:13rem}.lg\:w-56{width:14rem}.lg\:w-60{width:15rem}.lg\:w-64{width:16rem}.lg\:w-72{width:18rem}.lg\:w-80{width:20rem}.lg\:w-96{width:24rem}.lg\:w-auto{width:auto}.lg\:w-px{width:1px}.lg\:w-0\.5{width:.125rem}.lg\:w-1\.5{width:.375rem}.lg\:w-2\.5{width:.625rem}.lg\:w-3\.5{width:.875rem}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.333333%}.lg\:w-2\/3{width:66.666667%}.lg\:w-1\/4{width:25%}.lg\:w-2\/4{width:50%}.lg\:w-3\/4{width:75%}.lg\:w-1\/5{width:20%}.lg\:w-2\/5{width:40%}.lg\:w-3\/5{width:60%}.lg\:w-4\/5{width:80%}.lg\:w-1\/6{width:16.666667%}.lg\:w-2\/6{width:33.333333%}.lg\:w-3\/6{width:50%}.lg\:w-4\/6{width:66.666667%}.lg\:w-5\/6{width:83.333333%}.lg\:w-1\/12{width:8.333333%}.lg\:w-2\/12{width:16.666667%}.lg\:w-3\/12{width:25%}.lg\:w-4\/12{width:33.333333%}.lg\:w-5\/12{width:41.666667%}.lg\:w-6\/12{width:50%}.lg\:w-7\/12{width:58.333333%}.lg\:w-8\/12{width:66.666667%}.lg\:w-9\/12{width:75%}.lg\:w-10\/12{width:83.333333%}.lg\:w-11\/12{width:91.666667%}.lg\:w-full{width:100%}.lg\:w-screen{width:100vw}.lg\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.lg\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.lg\:min-w-0{min-width:0}.lg\:min-w-full{min-width:100%}.lg\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.lg\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.lg\:max-w-0{max-width:0}.lg\:max-w-none{max-width:none}.lg\:max-w-xs{max-width:20rem}.lg\:max-w-sm{max-width:24rem}.lg\:max-w-md{max-width:28rem}.lg\:max-w-lg{max-width:32rem}.lg\:max-w-xl{max-width:36rem}.lg\:max-w-2xl{max-width:42rem}.lg\:max-w-3xl{max-width:48rem}.lg\:max-w-4xl{max-width:56rem}.lg\:max-w-5xl{max-width:64rem}.lg\:max-w-6xl{max-width:72rem}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-full{max-width:100%}.lg\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.lg\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.lg\:max-w-prose{max-width:65ch}.lg\:max-w-screen-sm{max-width:640px}.lg\:max-w-screen-md{max-width:768px}.lg\:max-w-screen-lg{max-width:1024px}.lg\:max-w-screen-xl{max-width:1280px}.lg\:max-w-screen-2xl{max-width:1536px}.lg\:flex-1{flex:1 1 0%}.lg\:flex-auto{flex:1 1 auto}.lg\:flex-initial{flex:0 1 auto}.lg\:flex-none{flex:none}.lg\:flex-shrink-0{flex-shrink:0}.lg\:flex-shrink{flex-shrink:1}.lg\:flex-grow-0{flex-grow:0}.lg\:flex-grow{flex-grow:1}.lg\:table-auto{table-layout:auto}.lg\:table-fixed{table-layout:fixed}.lg\:border-collapse{border-collapse:collapse}.lg\:border-separate{border-collapse:initial}.lg\:origin-center{transform-origin:center}.lg\:origin-top{transform-origin:top}.lg\:origin-top-right{transform-origin:top right}.lg\:origin-right{transform-origin:right}.lg\:origin-bottom-right{transform-origin:bottom right}.lg\:origin-bottom{transform-origin:bottom}.lg\:origin-bottom-left{transform-origin:bottom left}.lg\:origin-left{transform-origin:left}.lg\:origin-top-left{transform-origin:top left}.lg\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:transform,.lg\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.lg\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:transform-none{transform:none}.lg\:translate-x-0{--tw-translate-x:0px}.lg\:translate-x-1{--tw-translate-x:0.25rem}.lg\:translate-x-2{--tw-translate-x:0.5rem}.lg\:translate-x-3{--tw-translate-x:0.75rem}.lg\:translate-x-4{--tw-translate-x:1rem}.lg\:translate-x-5{--tw-translate-x:1.25rem}.lg\:translate-x-6{--tw-translate-x:1.5rem}.lg\:translate-x-7{--tw-translate-x:1.75rem}.lg\:translate-x-8{--tw-translate-x:2rem}.lg\:translate-x-9{--tw-translate-x:2.25rem}.lg\:translate-x-10{--tw-translate-x:2.5rem}.lg\:translate-x-11{--tw-translate-x:2.75rem}.lg\:translate-x-12{--tw-translate-x:3rem}.lg\:translate-x-14{--tw-translate-x:3.5rem}.lg\:translate-x-16{--tw-translate-x:4rem}.lg\:translate-x-20{--tw-translate-x:5rem}.lg\:translate-x-24{--tw-translate-x:6rem}.lg\:translate-x-28{--tw-translate-x:7rem}.lg\:translate-x-32{--tw-translate-x:8rem}.lg\:translate-x-36{--tw-translate-x:9rem}.lg\:translate-x-40{--tw-translate-x:10rem}.lg\:translate-x-44{--tw-translate-x:11rem}.lg\:translate-x-48{--tw-translate-x:12rem}.lg\:translate-x-52{--tw-translate-x:13rem}.lg\:translate-x-56{--tw-translate-x:14rem}.lg\:translate-x-60{--tw-translate-x:15rem}.lg\:translate-x-64{--tw-translate-x:16rem}.lg\:translate-x-72{--tw-translate-x:18rem}.lg\:translate-x-80{--tw-translate-x:20rem}.lg\:translate-x-96{--tw-translate-x:24rem}.lg\:translate-x-px{--tw-translate-x:1px}.lg\:translate-x-0\.5{--tw-translate-x:0.125rem}.lg\:translate-x-1\.5{--tw-translate-x:0.375rem}.lg\:translate-x-2\.5{--tw-translate-x:0.625rem}.lg\:translate-x-3\.5{--tw-translate-x:0.875rem}.lg\:-translate-x-0{--tw-translate-x:0px}.lg\:-translate-x-1{--tw-translate-x:-0.25rem}.lg\:-translate-x-2{--tw-translate-x:-0.5rem}.lg\:-translate-x-3{--tw-translate-x:-0.75rem}.lg\:-translate-x-4{--tw-translate-x:-1rem}.lg\:-translate-x-5{--tw-translate-x:-1.25rem}.lg\:-translate-x-6{--tw-translate-x:-1.5rem}.lg\:-translate-x-7{--tw-translate-x:-1.75rem}.lg\:-translate-x-8{--tw-translate-x:-2rem}.lg\:-translate-x-9{--tw-translate-x:-2.25rem}.lg\:-translate-x-10{--tw-translate-x:-2.5rem}.lg\:-translate-x-11{--tw-translate-x:-2.75rem}.lg\:-translate-x-12{--tw-translate-x:-3rem}.lg\:-translate-x-14{--tw-translate-x:-3.5rem}.lg\:-translate-x-16{--tw-translate-x:-4rem}.lg\:-translate-x-20{--tw-translate-x:-5rem}.lg\:-translate-x-24{--tw-translate-x:-6rem}.lg\:-translate-x-28{--tw-translate-x:-7rem}.lg\:-translate-x-32{--tw-translate-x:-8rem}.lg\:-translate-x-36{--tw-translate-x:-9rem}.lg\:-translate-x-40{--tw-translate-x:-10rem}.lg\:-translate-x-44{--tw-translate-x:-11rem}.lg\:-translate-x-48{--tw-translate-x:-12rem}.lg\:-translate-x-52{--tw-translate-x:-13rem}.lg\:-translate-x-56{--tw-translate-x:-14rem}.lg\:-translate-x-60{--tw-translate-x:-15rem}.lg\:-translate-x-64{--tw-translate-x:-16rem}.lg\:-translate-x-72{--tw-translate-x:-18rem}.lg\:-translate-x-80{--tw-translate-x:-20rem}.lg\:-translate-x-96{--tw-translate-x:-24rem}.lg\:-translate-x-px{--tw-translate-x:-1px}.lg\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.lg\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.lg\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.lg\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.lg\:translate-x-1\/2{--tw-translate-x:50%}.lg\:translate-x-1\/3{--tw-translate-x:33.333333%}.lg\:translate-x-2\/3{--tw-translate-x:66.666667%}.lg\:translate-x-1\/4{--tw-translate-x:25%}.lg\:translate-x-2\/4{--tw-translate-x:50%}.lg\:translate-x-3\/4{--tw-translate-x:75%}.lg\:translate-x-full{--tw-translate-x:100%}.lg\:-translate-x-1\/2{--tw-translate-x:-50%}.lg\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.lg\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.lg\:-translate-x-1\/4{--tw-translate-x:-25%}.lg\:-translate-x-2\/4{--tw-translate-x:-50%}.lg\:-translate-x-3\/4{--tw-translate-x:-75%}.lg\:-translate-x-full{--tw-translate-x:-100%}.lg\:translate-y-0{--tw-translate-y:0px}.lg\:translate-y-1{--tw-translate-y:0.25rem}.lg\:translate-y-2{--tw-translate-y:0.5rem}.lg\:translate-y-3{--tw-translate-y:0.75rem}.lg\:translate-y-4{--tw-translate-y:1rem}.lg\:translate-y-5{--tw-translate-y:1.25rem}.lg\:translate-y-6{--tw-translate-y:1.5rem}.lg\:translate-y-7{--tw-translate-y:1.75rem}.lg\:translate-y-8{--tw-translate-y:2rem}.lg\:translate-y-9{--tw-translate-y:2.25rem}.lg\:translate-y-10{--tw-translate-y:2.5rem}.lg\:translate-y-11{--tw-translate-y:2.75rem}.lg\:translate-y-12{--tw-translate-y:3rem}.lg\:translate-y-14{--tw-translate-y:3.5rem}.lg\:translate-y-16{--tw-translate-y:4rem}.lg\:translate-y-20{--tw-translate-y:5rem}.lg\:translate-y-24{--tw-translate-y:6rem}.lg\:translate-y-28{--tw-translate-y:7rem}.lg\:translate-y-32{--tw-translate-y:8rem}.lg\:translate-y-36{--tw-translate-y:9rem}.lg\:translate-y-40{--tw-translate-y:10rem}.lg\:translate-y-44{--tw-translate-y:11rem}.lg\:translate-y-48{--tw-translate-y:12rem}.lg\:translate-y-52{--tw-translate-y:13rem}.lg\:translate-y-56{--tw-translate-y:14rem}.lg\:translate-y-60{--tw-translate-y:15rem}.lg\:translate-y-64{--tw-translate-y:16rem}.lg\:translate-y-72{--tw-translate-y:18rem}.lg\:translate-y-80{--tw-translate-y:20rem}.lg\:translate-y-96{--tw-translate-y:24rem}.lg\:translate-y-px{--tw-translate-y:1px}.lg\:translate-y-0\.5{--tw-translate-y:0.125rem}.lg\:translate-y-1\.5{--tw-translate-y:0.375rem}.lg\:translate-y-2\.5{--tw-translate-y:0.625rem}.lg\:translate-y-3\.5{--tw-translate-y:0.875rem}.lg\:-translate-y-0{--tw-translate-y:0px}.lg\:-translate-y-1{--tw-translate-y:-0.25rem}.lg\:-translate-y-2{--tw-translate-y:-0.5rem}.lg\:-translate-y-3{--tw-translate-y:-0.75rem}.lg\:-translate-y-4{--tw-translate-y:-1rem}.lg\:-translate-y-5{--tw-translate-y:-1.25rem}.lg\:-translate-y-6{--tw-translate-y:-1.5rem}.lg\:-translate-y-7{--tw-translate-y:-1.75rem}.lg\:-translate-y-8{--tw-translate-y:-2rem}.lg\:-translate-y-9{--tw-translate-y:-2.25rem}.lg\:-translate-y-10{--tw-translate-y:-2.5rem}.lg\:-translate-y-11{--tw-translate-y:-2.75rem}.lg\:-translate-y-12{--tw-translate-y:-3rem}.lg\:-translate-y-14{--tw-translate-y:-3.5rem}.lg\:-translate-y-16{--tw-translate-y:-4rem}.lg\:-translate-y-20{--tw-translate-y:-5rem}.lg\:-translate-y-24{--tw-translate-y:-6rem}.lg\:-translate-y-28{--tw-translate-y:-7rem}.lg\:-translate-y-32{--tw-translate-y:-8rem}.lg\:-translate-y-36{--tw-translate-y:-9rem}.lg\:-translate-y-40{--tw-translate-y:-10rem}.lg\:-translate-y-44{--tw-translate-y:-11rem}.lg\:-translate-y-48{--tw-translate-y:-12rem}.lg\:-translate-y-52{--tw-translate-y:-13rem}.lg\:-translate-y-56{--tw-translate-y:-14rem}.lg\:-translate-y-60{--tw-translate-y:-15rem}.lg\:-translate-y-64{--tw-translate-y:-16rem}.lg\:-translate-y-72{--tw-translate-y:-18rem}.lg\:-translate-y-80{--tw-translate-y:-20rem}.lg\:-translate-y-96{--tw-translate-y:-24rem}.lg\:-translate-y-px{--tw-translate-y:-1px}.lg\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.lg\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.lg\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.lg\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.lg\:translate-y-1\/2{--tw-translate-y:50%}.lg\:translate-y-1\/3{--tw-translate-y:33.333333%}.lg\:translate-y-2\/3{--tw-translate-y:66.666667%}.lg\:translate-y-1\/4{--tw-translate-y:25%}.lg\:translate-y-2\/4{--tw-translate-y:50%}.lg\:translate-y-3\/4{--tw-translate-y:75%}.lg\:translate-y-full{--tw-translate-y:100%}.lg\:-translate-y-1\/2{--tw-translate-y:-50%}.lg\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.lg\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.lg\:-translate-y-1\/4{--tw-translate-y:-25%}.lg\:-translate-y-2\/4{--tw-translate-y:-50%}.lg\:-translate-y-3\/4{--tw-translate-y:-75%}.lg\:-translate-y-full{--tw-translate-y:-100%}.lg\:hover\:translate-x-0:hover{--tw-translate-x:0px}.lg\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.lg\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.lg\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.lg\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.lg\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.lg\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.lg\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.lg\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.lg\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.lg\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.lg\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.lg\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.lg\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.lg\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.lg\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.lg\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.lg\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.lg\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.lg\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.lg\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.lg\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.lg\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.lg\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.lg\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.lg\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.lg\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.lg\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.lg\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.lg\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.lg\:hover\:translate-x-px:hover{--tw-translate-x:1px}.lg\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.lg\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.lg\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.lg\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.lg\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.lg\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.lg\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.lg\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.lg\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.lg\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.lg\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.lg\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.lg\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.lg\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.lg\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.lg\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.lg\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.lg\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.lg\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.lg\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.lg\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.lg\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.lg\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.lg\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.lg\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.lg\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.lg\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.lg\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.lg\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.lg\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.lg\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.lg\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.lg\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.lg\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.lg\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.lg\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.lg\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.lg\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.lg\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.lg\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.lg\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.lg\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.lg\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.lg\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.lg\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.lg\:hover\:translate-x-full:hover{--tw-translate-x:100%}.lg\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.lg\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.lg\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.lg\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.lg\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.lg\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.lg\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.lg\:hover\:translate-y-0:hover{--tw-translate-y:0px}.lg\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.lg\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.lg\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.lg\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.lg\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.lg\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.lg\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.lg\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.lg\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.lg\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.lg\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.lg\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.lg\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.lg\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.lg\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.lg\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.lg\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.lg\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.lg\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.lg\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.lg\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.lg\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.lg\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.lg\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.lg\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.lg\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.lg\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.lg\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.lg\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.lg\:hover\:translate-y-px:hover{--tw-translate-y:1px}.lg\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.lg\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.lg\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.lg\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.lg\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.lg\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.lg\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.lg\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.lg\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.lg\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.lg\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.lg\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.lg\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.lg\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.lg\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.lg\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.lg\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.lg\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.lg\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.lg\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.lg\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.lg\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.lg\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.lg\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.lg\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.lg\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.lg\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.lg\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.lg\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.lg\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.lg\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.lg\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.lg\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.lg\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.lg\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.lg\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.lg\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.lg\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.lg\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.lg\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.lg\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.lg\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.lg\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.lg\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.lg\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.lg\:hover\:translate-y-full:hover{--tw-translate-y:100%}.lg\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.lg\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.lg\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.lg\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.lg\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.lg\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.lg\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.lg\:focus\:translate-x-0:focus{--tw-translate-x:0px}.lg\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.lg\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.lg\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.lg\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.lg\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.lg\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.lg\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.lg\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.lg\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.lg\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.lg\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.lg\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.lg\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.lg\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.lg\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.lg\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.lg\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.lg\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.lg\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.lg\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.lg\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.lg\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.lg\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.lg\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.lg\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.lg\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.lg\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.lg\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.lg\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.lg\:focus\:translate-x-px:focus{--tw-translate-x:1px}.lg\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.lg\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.lg\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.lg\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.lg\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.lg\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.lg\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.lg\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.lg\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.lg\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.lg\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.lg\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.lg\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.lg\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.lg\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.lg\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.lg\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.lg\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.lg\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.lg\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.lg\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.lg\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.lg\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.lg\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.lg\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.lg\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.lg\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.lg\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.lg\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.lg\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.lg\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.lg\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.lg\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.lg\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.lg\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.lg\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.lg\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.lg\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.lg\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.lg\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.lg\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.lg\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.lg\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.lg\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.lg\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.lg\:focus\:translate-x-full:focus{--tw-translate-x:100%}.lg\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.lg\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.lg\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.lg\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.lg\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.lg\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.lg\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.lg\:focus\:translate-y-0:focus{--tw-translate-y:0px}.lg\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.lg\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.lg\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.lg\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.lg\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.lg\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.lg\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.lg\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.lg\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.lg\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.lg\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.lg\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.lg\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.lg\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.lg\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.lg\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.lg\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.lg\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.lg\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.lg\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.lg\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.lg\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.lg\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.lg\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.lg\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.lg\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.lg\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.lg\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.lg\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.lg\:focus\:translate-y-px:focus{--tw-translate-y:1px}.lg\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.lg\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.lg\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.lg\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.lg\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.lg\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.lg\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.lg\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.lg\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.lg\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.lg\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.lg\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.lg\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.lg\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.lg\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.lg\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.lg\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.lg\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.lg\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.lg\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.lg\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.lg\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.lg\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.lg\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.lg\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.lg\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.lg\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.lg\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.lg\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.lg\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.lg\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.lg\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.lg\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.lg\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.lg\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.lg\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.lg\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.lg\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.lg\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.lg\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.lg\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.lg\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.lg\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.lg\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.lg\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.lg\:focus\:translate-y-full:focus{--tw-translate-y:100%}.lg\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.lg\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.lg\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.lg\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.lg\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.lg\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.lg\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.lg\:rotate-0{--tw-rotate:0deg}.lg\:rotate-1{--tw-rotate:1deg}.lg\:rotate-2{--tw-rotate:2deg}.lg\:rotate-3{--tw-rotate:3deg}.lg\:rotate-6{--tw-rotate:6deg}.lg\:rotate-12{--tw-rotate:12deg}.lg\:rotate-45{--tw-rotate:45deg}.lg\:rotate-90{--tw-rotate:90deg}.lg\:rotate-180{--tw-rotate:180deg}.lg\:-rotate-180{--tw-rotate:-180deg}.lg\:-rotate-90{--tw-rotate:-90deg}.lg\:-rotate-45{--tw-rotate:-45deg}.lg\:-rotate-12{--tw-rotate:-12deg}.lg\:-rotate-6{--tw-rotate:-6deg}.lg\:-rotate-3{--tw-rotate:-3deg}.lg\:-rotate-2{--tw-rotate:-2deg}.lg\:-rotate-1{--tw-rotate:-1deg}.lg\:hover\:rotate-0:hover{--tw-rotate:0deg}.lg\:hover\:rotate-1:hover{--tw-rotate:1deg}.lg\:hover\:rotate-2:hover{--tw-rotate:2deg}.lg\:hover\:rotate-3:hover{--tw-rotate:3deg}.lg\:hover\:rotate-6:hover{--tw-rotate:6deg}.lg\:hover\:rotate-12:hover{--tw-rotate:12deg}.lg\:hover\:rotate-45:hover{--tw-rotate:45deg}.lg\:hover\:rotate-90:hover{--tw-rotate:90deg}.lg\:hover\:rotate-180:hover{--tw-rotate:180deg}.lg\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.lg\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.lg\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.lg\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.lg\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.lg\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.lg\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.lg\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.lg\:focus\:rotate-0:focus{--tw-rotate:0deg}.lg\:focus\:rotate-1:focus{--tw-rotate:1deg}.lg\:focus\:rotate-2:focus{--tw-rotate:2deg}.lg\:focus\:rotate-3:focus{--tw-rotate:3deg}.lg\:focus\:rotate-6:focus{--tw-rotate:6deg}.lg\:focus\:rotate-12:focus{--tw-rotate:12deg}.lg\:focus\:rotate-45:focus{--tw-rotate:45deg}.lg\:focus\:rotate-90:focus{--tw-rotate:90deg}.lg\:focus\:rotate-180:focus{--tw-rotate:180deg}.lg\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.lg\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.lg\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.lg\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.lg\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.lg\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.lg\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.lg\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.lg\:skew-x-0{--tw-skew-x:0deg}.lg\:skew-x-1{--tw-skew-x:1deg}.lg\:skew-x-2{--tw-skew-x:2deg}.lg\:skew-x-3{--tw-skew-x:3deg}.lg\:skew-x-6{--tw-skew-x:6deg}.lg\:skew-x-12{--tw-skew-x:12deg}.lg\:-skew-x-12{--tw-skew-x:-12deg}.lg\:-skew-x-6{--tw-skew-x:-6deg}.lg\:-skew-x-3{--tw-skew-x:-3deg}.lg\:-skew-x-2{--tw-skew-x:-2deg}.lg\:-skew-x-1{--tw-skew-x:-1deg}.lg\:skew-y-0{--tw-skew-y:0deg}.lg\:skew-y-1{--tw-skew-y:1deg}.lg\:skew-y-2{--tw-skew-y:2deg}.lg\:skew-y-3{--tw-skew-y:3deg}.lg\:skew-y-6{--tw-skew-y:6deg}.lg\:skew-y-12{--tw-skew-y:12deg}.lg\:-skew-y-12{--tw-skew-y:-12deg}.lg\:-skew-y-6{--tw-skew-y:-6deg}.lg\:-skew-y-3{--tw-skew-y:-3deg}.lg\:-skew-y-2{--tw-skew-y:-2deg}.lg\:-skew-y-1{--tw-skew-y:-1deg}.lg\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.lg\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.lg\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.lg\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.lg\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.lg\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.lg\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.lg\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.lg\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.lg\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.lg\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.lg\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.lg\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.lg\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.lg\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.lg\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.lg\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.lg\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.lg\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.lg\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.lg\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.lg\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.lg\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.lg\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.lg\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.lg\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.lg\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.lg\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.lg\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.lg\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.lg\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.lg\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.lg\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.lg\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.lg\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.lg\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.lg\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.lg\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.lg\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.lg\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.lg\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.lg\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.lg\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.lg\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.lg\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.lg\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.lg\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.lg\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.lg\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.lg\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.lg\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.lg\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.lg\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.lg\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.lg\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.lg\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.lg\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.lg\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.lg\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.lg\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.lg\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.lg\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.lg\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.lg\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.lg\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.lg\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.lg\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.lg\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.lg\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.lg\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.lg\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.lg\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.lg\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.lg\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.lg\:scale-x-0{--tw-scale-x:0}.lg\:scale-x-50{--tw-scale-x:.5}.lg\:scale-x-75{--tw-scale-x:.75}.lg\:scale-x-90{--tw-scale-x:.9}.lg\:scale-x-95{--tw-scale-x:.95}.lg\:scale-x-100{--tw-scale-x:1}.lg\:scale-x-105{--tw-scale-x:1.05}.lg\:scale-x-110{--tw-scale-x:1.1}.lg\:scale-x-125{--tw-scale-x:1.25}.lg\:scale-x-150{--tw-scale-x:1.5}.lg\:scale-y-0{--tw-scale-y:0}.lg\:scale-y-50{--tw-scale-y:.5}.lg\:scale-y-75{--tw-scale-y:.75}.lg\:scale-y-90{--tw-scale-y:.9}.lg\:scale-y-95{--tw-scale-y:.95}.lg\:scale-y-100{--tw-scale-y:1}.lg\:scale-y-105{--tw-scale-y:1.05}.lg\:scale-y-110{--tw-scale-y:1.1}.lg\:scale-y-125{--tw-scale-y:1.25}.lg\:scale-y-150{--tw-scale-y:1.5}.lg\:hover\:scale-x-0:hover{--tw-scale-x:0}.lg\:hover\:scale-x-50:hover{--tw-scale-x:.5}.lg\:hover\:scale-x-75:hover{--tw-scale-x:.75}.lg\:hover\:scale-x-90:hover{--tw-scale-x:.9}.lg\:hover\:scale-x-95:hover{--tw-scale-x:.95}.lg\:hover\:scale-x-100:hover{--tw-scale-x:1}.lg\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.lg\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.lg\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.lg\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.lg\:hover\:scale-y-0:hover{--tw-scale-y:0}.lg\:hover\:scale-y-50:hover{--tw-scale-y:.5}.lg\:hover\:scale-y-75:hover{--tw-scale-y:.75}.lg\:hover\:scale-y-90:hover{--tw-scale-y:.9}.lg\:hover\:scale-y-95:hover{--tw-scale-y:.95}.lg\:hover\:scale-y-100:hover{--tw-scale-y:1}.lg\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.lg\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.lg\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.lg\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.lg\:focus\:scale-x-0:focus{--tw-scale-x:0}.lg\:focus\:scale-x-50:focus{--tw-scale-x:.5}.lg\:focus\:scale-x-75:focus{--tw-scale-x:.75}.lg\:focus\:scale-x-90:focus{--tw-scale-x:.9}.lg\:focus\:scale-x-95:focus{--tw-scale-x:.95}.lg\:focus\:scale-x-100:focus{--tw-scale-x:1}.lg\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.lg\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.lg\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.lg\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.lg\:focus\:scale-y-0:focus{--tw-scale-y:0}.lg\:focus\:scale-y-50:focus{--tw-scale-y:.5}.lg\:focus\:scale-y-75:focus{--tw-scale-y:.75}.lg\:focus\:scale-y-90:focus{--tw-scale-y:.9}.lg\:focus\:scale-y-95:focus{--tw-scale-y:.95}.lg\:focus\:scale-y-100:focus{--tw-scale-y:1}.lg\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.lg\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.lg\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.lg\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.lg\:animate-none{-webkit-animation:none;animation:none}.lg\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.lg\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.lg\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.lg\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.lg\:cursor-auto{cursor:auto}.lg\:cursor-default{cursor:default}.lg\:cursor-pointer{cursor:pointer}.lg\:cursor-wait{cursor:wait}.lg\:cursor-text{cursor:text}.lg\:cursor-move{cursor:move}.lg\:cursor-help{cursor:help}.lg\:cursor-not-allowed{cursor:not-allowed}.lg\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.lg\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.lg\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lg\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.lg\:resize-none{resize:none}.lg\:resize-y{resize:vertical}.lg\:resize-x{resize:horizontal}.lg\:resize{resize:both}.lg\:list-inside{list-style-position:inside}.lg\:list-outside{list-style-position:outside}.lg\:list-none{list-style-type:none}.lg\:list-disc{list-style-type:disc}.lg\:list-decimal{list-style-type:decimal}.lg\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.lg\:auto-cols-auto{grid-auto-columns:auto}.lg\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.lg\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.lg\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.lg\:grid-flow-row{grid-auto-flow:row}.lg\:grid-flow-col{grid-auto-flow:column}.lg\:grid-flow-row-dense{grid-auto-flow:row dense}.lg\:grid-flow-col-dense{grid-auto-flow:column dense}.lg\:auto-rows-auto{grid-auto-rows:auto}.lg\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.lg\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.lg\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.lg\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.lg\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.lg\:grid-rows-none{grid-template-rows:none}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:flex-col{flex-direction:column}.lg\:flex-col-reverse{flex-direction:column-reverse}.lg\:flex-wrap{flex-wrap:wrap}.lg\:flex-wrap-reverse{flex-wrap:wrap-reverse}.lg\:flex-nowrap{flex-wrap:nowrap}.lg\:place-content-center{place-content:center}.lg\:place-content-start{place-content:start}.lg\:place-content-end{place-content:end}.lg\:place-content-between{place-content:space-between}.lg\:place-content-around{place-content:space-around}.lg\:place-content-evenly{place-content:space-evenly}.lg\:place-content-stretch{place-content:stretch}.lg\:place-items-start{place-items:start}.lg\:place-items-end{place-items:end}.lg\:place-items-center{place-items:center}.lg\:place-items-stretch{place-items:stretch}.lg\:content-center{align-content:center}.lg\:content-start{align-content:flex-start}.lg\:content-end{align-content:flex-end}.lg\:content-between{align-content:space-between}.lg\:content-around{align-content:space-around}.lg\:content-evenly{align-content:space-evenly}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:items-baseline{align-items:baseline}.lg\:items-stretch{align-items:stretch}.lg\:justify-start{justify-content:flex-start}.lg\:justify-end{justify-content:flex-end}.lg\:justify-center{justify-content:center}.lg\:justify-between{justify-content:space-between}.lg\:justify-around{justify-content:space-around}.lg\:justify-evenly{justify-content:space-evenly}.lg\:justify-items-start{justify-items:start}.lg\:justify-items-end{justify-items:end}.lg\:justify-items-center{justify-items:center}.lg\:justify-items-stretch{justify-items:stretch}.lg\:gap-0{gap:0}.lg\:gap-1{gap:.25rem}.lg\:gap-2{gap:.5rem}.lg\:gap-3{gap:.75rem}.lg\:gap-4{gap:1rem}.lg\:gap-5{gap:1.25rem}.lg\:gap-6{gap:1.5rem}.lg\:gap-7{gap:1.75rem}.lg\:gap-8{gap:2rem}.lg\:gap-9{gap:2.25rem}.lg\:gap-10{gap:2.5rem}.lg\:gap-11{gap:2.75rem}.lg\:gap-12{gap:3rem}.lg\:gap-14{gap:3.5rem}.lg\:gap-16{gap:4rem}.lg\:gap-20{gap:5rem}.lg\:gap-24{gap:6rem}.lg\:gap-28{gap:7rem}.lg\:gap-32{gap:8rem}.lg\:gap-36{gap:9rem}.lg\:gap-40{gap:10rem}.lg\:gap-44{gap:11rem}.lg\:gap-48{gap:12rem}.lg\:gap-52{gap:13rem}.lg\:gap-56{gap:14rem}.lg\:gap-60{gap:15rem}.lg\:gap-64{gap:16rem}.lg\:gap-72{gap:18rem}.lg\:gap-80{gap:20rem}.lg\:gap-96{gap:24rem}.lg\:gap-px{gap:1px}.lg\:gap-0\.5{gap:.125rem}.lg\:gap-1\.5{gap:.375rem}.lg\:gap-2\.5{gap:.625rem}.lg\:gap-3\.5{gap:.875rem}.lg\:gap-x-0{-moz-column-gap:0;column-gap:0}.lg\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.lg\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.lg\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.lg\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.lg\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.lg\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.lg\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.lg\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.lg\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.lg\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.lg\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.lg\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.lg\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.lg\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.lg\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.lg\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.lg\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.lg\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.lg\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.lg\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.lg\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.lg\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.lg\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.lg\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.lg\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.lg\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.lg\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.lg\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.lg\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.lg\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.lg\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.lg\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.lg\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.lg\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.lg\:gap-y-0{row-gap:0}.lg\:gap-y-1{row-gap:.25rem}.lg\:gap-y-2{row-gap:.5rem}.lg\:gap-y-3{row-gap:.75rem}.lg\:gap-y-4{row-gap:1rem}.lg\:gap-y-5{row-gap:1.25rem}.lg\:gap-y-6{row-gap:1.5rem}.lg\:gap-y-7{row-gap:1.75rem}.lg\:gap-y-8{row-gap:2rem}.lg\:gap-y-9{row-gap:2.25rem}.lg\:gap-y-10{row-gap:2.5rem}.lg\:gap-y-11{row-gap:2.75rem}.lg\:gap-y-12{row-gap:3rem}.lg\:gap-y-14{row-gap:3.5rem}.lg\:gap-y-16{row-gap:4rem}.lg\:gap-y-20{row-gap:5rem}.lg\:gap-y-24{row-gap:6rem}.lg\:gap-y-28{row-gap:7rem}.lg\:gap-y-32{row-gap:8rem}.lg\:gap-y-36{row-gap:9rem}.lg\:gap-y-40{row-gap:10rem}.lg\:gap-y-44{row-gap:11rem}.lg\:gap-y-48{row-gap:12rem}.lg\:gap-y-52{row-gap:13rem}.lg\:gap-y-56{row-gap:14rem}.lg\:gap-y-60{row-gap:15rem}.lg\:gap-y-64{row-gap:16rem}.lg\:gap-y-72{row-gap:18rem}.lg\:gap-y-80{row-gap:20rem}.lg\:gap-y-96{row-gap:24rem}.lg\:gap-y-px{row-gap:1px}.lg\:gap-y-0\.5{row-gap:.125rem}.lg\:gap-y-1\.5{row-gap:.375rem}.lg\:gap-y-2\.5{row-gap:.625rem}.lg\:gap-y-3\.5{row-gap:.875rem}.lg\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lg\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lg\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lg\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lg\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.lg\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lg\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.lg\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.lg\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.lg\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.lg\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.lg\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.lg\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.lg\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.lg\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.lg\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.lg\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.lg\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.lg\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.lg\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.lg\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.lg\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.lg\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.lg\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.lg\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.lg\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.lg\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.lg\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.lg\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.lg\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.lg\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lg\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lg\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.lg\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.lg\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.lg\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.lg\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.lg\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.lg\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.lg\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.lg\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.lg\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.lg\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.lg\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.lg\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.lg\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.lg\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.lg\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.lg\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.lg\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.lg\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.lg\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.lg\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.lg\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.lg\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.lg\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.lg\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.lg\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.lg\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.lg\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.lg\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.lg\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.lg\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.lg\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.lg\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.lg\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.lg\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.lg\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.lg\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.lg\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.lg\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.lg\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.lg\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.lg\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.lg\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.lg\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.lg\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.lg\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.lg\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.lg\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.lg\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.lg\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.lg\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.lg\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.lg\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.lg\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.lg\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.lg\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.lg\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.lg\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.lg\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.lg\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.lg\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.lg\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.lg\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.lg\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.lg\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.lg\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.lg\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.lg\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.lg\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.lg\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.lg\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.lg\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.lg\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.lg\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.lg\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.lg\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.lg\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.lg\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.lg\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.lg\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.lg\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.lg\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.lg\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.lg\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.lg\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.lg\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.lg\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.lg\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.lg\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.lg\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.lg\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.lg\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.lg\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.lg\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.lg\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.lg\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.lg\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.lg\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.lg\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.lg\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.lg\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.lg\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.lg\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.lg\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.lg\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.lg\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.lg\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.lg\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.lg\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.lg\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.lg\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.lg\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.lg\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.lg\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.lg\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.lg\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.lg\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.lg\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.lg\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.lg\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.lg\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.lg\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.lg\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.lg\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.lg\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.lg\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.lg\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.lg\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.lg\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.lg\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.lg\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.lg\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.lg\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.lg\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.lg\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.lg\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.lg\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.lg\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.lg\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.lg\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.lg\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.lg\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.lg\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.lg\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.lg\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.lg\:place-self-auto{place-self:auto}.lg\:place-self-start{place-self:start}.lg\:place-self-end{place-self:end}.lg\:place-self-center{place-self:center}.lg\:place-self-stretch{place-self:stretch}.lg\:self-auto{align-self:auto}.lg\:self-start{align-self:flex-start}.lg\:self-end{align-self:flex-end}.lg\:self-center{align-self:center}.lg\:self-stretch{align-self:stretch}.lg\:self-baseline{align-self:baseline}.lg\:justify-self-auto{justify-self:auto}.lg\:justify-self-start{justify-self:start}.lg\:justify-self-end{justify-self:end}.lg\:justify-self-center{justify-self:center}.lg\:justify-self-stretch{justify-self:stretch}.lg\:overflow-auto{overflow:auto}.lg\:overflow-hidden{overflow:hidden}.lg\:overflow-visible{overflow:visible}.lg\:overflow-scroll{overflow:scroll}.lg\:overflow-x-auto{overflow-x:auto}.lg\:overflow-y-auto{overflow-y:auto}.lg\:overflow-x-hidden{overflow-x:hidden}.lg\:overflow-y-hidden{overflow-y:hidden}.lg\:overflow-x-visible{overflow-x:visible}.lg\:overflow-y-visible{overflow-y:visible}.lg\:overflow-x-scroll{overflow-x:scroll}.lg\:overflow-y-scroll{overflow-y:scroll}.lg\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.lg\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.lg\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.lg\:overscroll-y-auto{overscroll-behavior-y:auto}.lg\:overscroll-y-contain{overscroll-behavior-y:contain}.lg\:overscroll-y-none{overscroll-behavior-y:none}.lg\:overscroll-x-auto{overscroll-behavior-x:auto}.lg\:overscroll-x-contain{overscroll-behavior-x:contain}.lg\:overscroll-x-none{overscroll-behavior-x:none}.lg\:truncate{overflow:hidden;white-space:nowrap}.lg\:overflow-ellipsis,.lg\:truncate{text-overflow:ellipsis}.lg\:overflow-clip{text-overflow:clip}.lg\:whitespace-normal{white-space:normal}.lg\:whitespace-nowrap{white-space:nowrap}.lg\:whitespace-pre{white-space:pre}.lg\:whitespace-pre-line{white-space:pre-line}.lg\:whitespace-pre-wrap{white-space:pre-wrap}.lg\:break-normal{overflow-wrap:normal;word-break:normal}.lg\:break-words{overflow-wrap:break-word}.lg\:break-all{word-break:break-all}.lg\:rounded-none{border-radius:0}.lg\:rounded-sm{border-radius:.125rem}.lg\:rounded{border-radius:.25rem}.lg\:rounded-md{border-radius:.375rem}.lg\:rounded-lg{border-radius:.5rem}.lg\:rounded-xl{border-radius:.75rem}.lg\:rounded-2xl{border-radius:1rem}.lg\:rounded-3xl{border-radius:1.5rem}.lg\:rounded-full{border-radius:9999px}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.lg\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.lg\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.lg\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.lg\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.lg\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.lg\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.lg\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.lg\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.lg\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.lg\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.lg\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.lg\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.lg\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.lg\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.lg\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.lg\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.lg\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.lg\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.lg\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-tl-none{border-top-left-radius:0}.lg\:rounded-tl-sm{border-top-left-radius:.125rem}.lg\:rounded-tl{border-top-left-radius:.25rem}.lg\:rounded-tl-md{border-top-left-radius:.375rem}.lg\:rounded-tl-lg{border-top-left-radius:.5rem}.lg\:rounded-tl-xl{border-top-left-radius:.75rem}.lg\:rounded-tl-2xl{border-top-left-radius:1rem}.lg\:rounded-tl-3xl{border-top-left-radius:1.5rem}.lg\:rounded-tl-full{border-top-left-radius:9999px}.lg\:rounded-tr-none{border-top-right-radius:0}.lg\:rounded-tr-sm{border-top-right-radius:.125rem}.lg\:rounded-tr{border-top-right-radius:.25rem}.lg\:rounded-tr-md{border-top-right-radius:.375rem}.lg\:rounded-tr-lg{border-top-right-radius:.5rem}.lg\:rounded-tr-xl{border-top-right-radius:.75rem}.lg\:rounded-tr-2xl{border-top-right-radius:1rem}.lg\:rounded-tr-3xl{border-top-right-radius:1.5rem}.lg\:rounded-tr-full{border-top-right-radius:9999px}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:rounded-br-sm{border-bottom-right-radius:.125rem}.lg\:rounded-br{border-bottom-right-radius:.25rem}.lg\:rounded-br-md{border-bottom-right-radius:.375rem}.lg\:rounded-br-lg{border-bottom-right-radius:.5rem}.lg\:rounded-br-xl{border-bottom-right-radius:.75rem}.lg\:rounded-br-2xl{border-bottom-right-radius:1rem}.lg\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.lg\:rounded-br-full{border-bottom-right-radius:9999px}.lg\:rounded-bl-none{border-bottom-left-radius:0}.lg\:rounded-bl-sm{border-bottom-left-radius:.125rem}.lg\:rounded-bl{border-bottom-left-radius:.25rem}.lg\:rounded-bl-md{border-bottom-left-radius:.375rem}.lg\:rounded-bl-lg{border-bottom-left-radius:.5rem}.lg\:rounded-bl-xl{border-bottom-left-radius:.75rem}.lg\:rounded-bl-2xl{border-bottom-left-radius:1rem}.lg\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.lg\:rounded-bl-full{border-bottom-left-radius:9999px}.lg\:border-0{border-width:0}.lg\:border-2{border-width:2px}.lg\:border-4{border-width:4px}.lg\:border-8{border-width:8px}.lg\:border{border-width:1px}.lg\:border-t-0{border-top-width:0}.lg\:border-t-2{border-top-width:2px}.lg\:border-t-4{border-top-width:4px}.lg\:border-t-8{border-top-width:8px}.lg\:border-t{border-top-width:1px}.lg\:border-r-0{border-right-width:0}.lg\:border-r-2{border-right-width:2px}.lg\:border-r-4{border-right-width:4px}.lg\:border-r-8{border-right-width:8px}.lg\:border-r{border-right-width:1px}.lg\:border-b-0{border-bottom-width:0}.lg\:border-b-2{border-bottom-width:2px}.lg\:border-b-4{border-bottom-width:4px}.lg\:border-b-8{border-bottom-width:8px}.lg\:border-b{border-bottom-width:1px}.lg\:border-l-0{border-left-width:0}.lg\:border-l-2{border-left-width:2px}.lg\:border-l-4{border-left-width:4px}.lg\:border-l-8{border-left-width:8px}.lg\:border-l{border-left-width:1px}.lg\:border-solid{border-style:solid}.lg\:border-dashed{border-style:dashed}.lg\:border-dotted{border-style:dotted}.lg\:border-double{border-style:double}.lg\:border-none{border-style:none}.lg\:border-transparent{border-color:transparent}.lg\:border-current{border-color:currentColor}.lg\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-transparent{border-color:transparent}.group:hover .lg\:group-hover\:border-current{border-color:currentColor}.group:hover .lg\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:focus-within\:border-transparent:focus-within{border-color:transparent}.lg\:focus-within\:border-current:focus-within{border-color:currentColor}.lg\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:hover\:border-transparent:hover{border-color:transparent}.lg\:hover\:border-current:hover{border-color:currentColor}.lg\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:focus\:border-transparent:focus{border-color:transparent}.lg\:focus\:border-current:focus{border-color:currentColor}.lg\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:border-opacity-0{--tw-border-opacity:0}.lg\:border-opacity-5{--tw-border-opacity:0.05}.lg\:border-opacity-10{--tw-border-opacity:0.1}.lg\:border-opacity-20{--tw-border-opacity:0.2}.lg\:border-opacity-25{--tw-border-opacity:0.25}.lg\:border-opacity-30{--tw-border-opacity:0.3}.lg\:border-opacity-40{--tw-border-opacity:0.4}.lg\:border-opacity-50{--tw-border-opacity:0.5}.lg\:border-opacity-60{--tw-border-opacity:0.6}.lg\:border-opacity-70{--tw-border-opacity:0.7}.lg\:border-opacity-75{--tw-border-opacity:0.75}.lg\:border-opacity-80{--tw-border-opacity:0.8}.lg\:border-opacity-90{--tw-border-opacity:0.9}.lg\:border-opacity-95{--tw-border-opacity:0.95}.lg\:border-opacity-100{--tw-border-opacity:1}.group:hover .lg\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .lg\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .lg\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .lg\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .lg\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .lg\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .lg\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .lg\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .lg\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .lg\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .lg\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .lg\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .lg\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .lg\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .lg\:group-hover\:border-opacity-100{--tw-border-opacity:1}.lg\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.lg\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.lg\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.lg\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.lg\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.lg\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.lg\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.lg\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.lg\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.lg\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.lg\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.lg\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.lg\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.lg\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.lg\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.lg\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.lg\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.lg\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.lg\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.lg\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.lg\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.lg\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.lg\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.lg\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.lg\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.lg\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.lg\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.lg\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.lg\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.lg\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.lg\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.lg\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.lg\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.lg\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.lg\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.lg\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.lg\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.lg\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.lg\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.lg\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.lg\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.lg\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.lg\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.lg\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.lg\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.lg\:bg-transparent{background-color:initial}.lg\:bg-current{background-color:currentColor}.lg\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-transparent{background-color:initial}.group:hover .lg\:group-hover\:bg-current{background-color:currentColor}.group:hover .lg\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:focus-within\:bg-transparent:focus-within{background-color:initial}.lg\:focus-within\:bg-current:focus-within{background-color:currentColor}.lg\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:hover\:bg-transparent:hover{background-color:initial}.lg\:hover\:bg-current:hover{background-color:currentColor}.lg\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:focus\:bg-transparent:focus{background-color:initial}.lg\:focus\:bg-current:focus{background-color:currentColor}.lg\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:bg-opacity-0{--tw-bg-opacity:0}.lg\:bg-opacity-5{--tw-bg-opacity:0.05}.lg\:bg-opacity-10{--tw-bg-opacity:0.1}.lg\:bg-opacity-20{--tw-bg-opacity:0.2}.lg\:bg-opacity-25{--tw-bg-opacity:0.25}.lg\:bg-opacity-30{--tw-bg-opacity:0.3}.lg\:bg-opacity-40{--tw-bg-opacity:0.4}.lg\:bg-opacity-50{--tw-bg-opacity:0.5}.lg\:bg-opacity-60{--tw-bg-opacity:0.6}.lg\:bg-opacity-70{--tw-bg-opacity:0.7}.lg\:bg-opacity-75{--tw-bg-opacity:0.75}.lg\:bg-opacity-80{--tw-bg-opacity:0.8}.lg\:bg-opacity-90{--tw-bg-opacity:0.9}.lg\:bg-opacity-95{--tw-bg-opacity:0.95}.lg\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .lg\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .lg\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .lg\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .lg\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .lg\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .lg\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .lg\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .lg\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .lg\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .lg\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .lg\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .lg\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .lg\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .lg\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .lg\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.lg\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.lg\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.lg\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.lg\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.lg\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.lg\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.lg\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.lg\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.lg\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.lg\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.lg\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.lg\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.lg\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.lg\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.lg\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.lg\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.lg\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.lg\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.lg\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.lg\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.lg\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.lg\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.lg\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.lg\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.lg\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.lg\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.lg\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.lg\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.lg\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.lg\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.lg\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.lg\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.lg\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.lg\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.lg\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.lg\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.lg\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.lg\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.lg\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.lg\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.lg\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.lg\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.lg\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.lg\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.lg\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.lg\:bg-none{background-image:none}.lg\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.lg\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.lg\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lg\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lg\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.lg\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.lg\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.lg\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.lg\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.lg\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.lg\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.lg\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.lg\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.lg\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.lg\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:to-transparent{--tw-gradient-to:transparent}.lg\:to-current{--tw-gradient-to:currentColor}.lg\:to-black{--tw-gradient-to:#000}.lg\:to-white{--tw-gradient-to:#fff}.lg\:to-gray-50{--tw-gradient-to:#f9fafb}.lg\:to-gray-100{--tw-gradient-to:#f3f4f6}.lg\:to-gray-200{--tw-gradient-to:#e5e7eb}.lg\:to-gray-300{--tw-gradient-to:#d1d5db}.lg\:to-gray-400{--tw-gradient-to:#9ca3af}.lg\:to-gray-500{--tw-gradient-to:#6b7280}.lg\:to-gray-600{--tw-gradient-to:#4b5563}.lg\:to-gray-700{--tw-gradient-to:#374151}.lg\:to-gray-800{--tw-gradient-to:#1f2937}.lg\:to-gray-900{--tw-gradient-to:#111827}.lg\:to-red-50{--tw-gradient-to:#fef2f2}.lg\:to-red-100{--tw-gradient-to:#fee2e2}.lg\:to-red-200{--tw-gradient-to:#fecaca}.lg\:to-red-300{--tw-gradient-to:#fca5a5}.lg\:to-red-400{--tw-gradient-to:#f87171}.lg\:to-red-500{--tw-gradient-to:#ef4444}.lg\:to-red-600{--tw-gradient-to:#dc2626}.lg\:to-red-700{--tw-gradient-to:#b91c1c}.lg\:to-red-800{--tw-gradient-to:#991b1b}.lg\:to-red-900{--tw-gradient-to:#7f1d1d}.lg\:to-yellow-50{--tw-gradient-to:#fffbeb}.lg\:to-yellow-100{--tw-gradient-to:#fef3c7}.lg\:to-yellow-200{--tw-gradient-to:#fde68a}.lg\:to-yellow-300{--tw-gradient-to:#fcd34d}.lg\:to-yellow-400{--tw-gradient-to:#fbbf24}.lg\:to-yellow-500{--tw-gradient-to:#f59e0b}.lg\:to-yellow-600{--tw-gradient-to:#d97706}.lg\:to-yellow-700{--tw-gradient-to:#b45309}.lg\:to-yellow-800{--tw-gradient-to:#92400e}.lg\:to-yellow-900{--tw-gradient-to:#78350f}.lg\:to-green-50{--tw-gradient-to:#ecfdf5}.lg\:to-green-100{--tw-gradient-to:#d1fae5}.lg\:to-green-200{--tw-gradient-to:#a7f3d0}.lg\:to-green-300{--tw-gradient-to:#6ee7b7}.lg\:to-green-400{--tw-gradient-to:#34d399}.lg\:to-green-500{--tw-gradient-to:#10b981}.lg\:to-green-600{--tw-gradient-to:#059669}.lg\:to-green-700{--tw-gradient-to:#047857}.lg\:to-green-800{--tw-gradient-to:#065f46}.lg\:to-green-900{--tw-gradient-to:#064e3b}.lg\:to-blue-50{--tw-gradient-to:#eff6ff}.lg\:to-blue-100{--tw-gradient-to:#dbeafe}.lg\:to-blue-200{--tw-gradient-to:#bfdbfe}.lg\:to-blue-300{--tw-gradient-to:#93c5fd}.lg\:to-blue-400{--tw-gradient-to:#60a5fa}.lg\:to-blue-500{--tw-gradient-to:#3b82f6}.lg\:to-blue-600{--tw-gradient-to:#2563eb}.lg\:to-blue-700{--tw-gradient-to:#1d4ed8}.lg\:to-blue-800{--tw-gradient-to:#1e40af}.lg\:to-blue-900{--tw-gradient-to:#1e3a8a}.lg\:to-indigo-50{--tw-gradient-to:#eef2ff}.lg\:to-indigo-100{--tw-gradient-to:#e0e7ff}.lg\:to-indigo-200{--tw-gradient-to:#c7d2fe}.lg\:to-indigo-300{--tw-gradient-to:#a5b4fc}.lg\:to-indigo-400{--tw-gradient-to:#818cf8}.lg\:to-indigo-500{--tw-gradient-to:#6366f1}.lg\:to-indigo-600{--tw-gradient-to:#4f46e5}.lg\:to-indigo-700{--tw-gradient-to:#4338ca}.lg\:to-indigo-800{--tw-gradient-to:#3730a3}.lg\:to-indigo-900{--tw-gradient-to:#312e81}.lg\:to-purple-50{--tw-gradient-to:#f5f3ff}.lg\:to-purple-100{--tw-gradient-to:#ede9fe}.lg\:to-purple-200{--tw-gradient-to:#ddd6fe}.lg\:to-purple-300{--tw-gradient-to:#c4b5fd}.lg\:to-purple-400{--tw-gradient-to:#a78bfa}.lg\:to-purple-500{--tw-gradient-to:#8b5cf6}.lg\:to-purple-600{--tw-gradient-to:#7c3aed}.lg\:to-purple-700{--tw-gradient-to:#6d28d9}.lg\:to-purple-800{--tw-gradient-to:#5b21b6}.lg\:to-purple-900{--tw-gradient-to:#4c1d95}.lg\:to-pink-50{--tw-gradient-to:#fdf2f8}.lg\:to-pink-100{--tw-gradient-to:#fce7f3}.lg\:to-pink-200{--tw-gradient-to:#fbcfe8}.lg\:to-pink-300{--tw-gradient-to:#f9a8d4}.lg\:to-pink-400{--tw-gradient-to:#f472b6}.lg\:to-pink-500{--tw-gradient-to:#ec4899}.lg\:to-pink-600{--tw-gradient-to:#db2777}.lg\:to-pink-700{--tw-gradient-to:#be185d}.lg\:to-pink-800{--tw-gradient-to:#9d174d}.lg\:to-pink-900{--tw-gradient-to:#831843}.lg\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.lg\:hover\:to-current:hover{--tw-gradient-to:currentColor}.lg\:hover\:to-black:hover{--tw-gradient-to:#000}.lg\:hover\:to-white:hover{--tw-gradient-to:#fff}.lg\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.lg\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.lg\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.lg\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.lg\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.lg\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.lg\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.lg\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.lg\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.lg\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.lg\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.lg\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.lg\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.lg\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.lg\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.lg\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.lg\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.lg\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.lg\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.lg\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.lg\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.lg\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.lg\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.lg\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.lg\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.lg\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.lg\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.lg\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.lg\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.lg\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.lg\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.lg\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.lg\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.lg\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.lg\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.lg\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.lg\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.lg\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.lg\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.lg\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.lg\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.lg\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.lg\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.lg\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.lg\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.lg\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.lg\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.lg\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.lg\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.lg\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.lg\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.lg\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.lg\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.lg\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.lg\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.lg\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.lg\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.lg\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.lg\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.lg\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.lg\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.lg\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.lg\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.lg\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.lg\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.lg\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.lg\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.lg\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.lg\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.lg\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.lg\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.lg\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.lg\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.lg\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.lg\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.lg\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.lg\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.lg\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.lg\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.lg\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.lg\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.lg\:focus\:to-current:focus{--tw-gradient-to:currentColor}.lg\:focus\:to-black:focus{--tw-gradient-to:#000}.lg\:focus\:to-white:focus{--tw-gradient-to:#fff}.lg\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.lg\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.lg\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.lg\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.lg\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.lg\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.lg\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.lg\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.lg\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.lg\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.lg\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.lg\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.lg\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.lg\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.lg\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.lg\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.lg\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.lg\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.lg\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.lg\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.lg\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.lg\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.lg\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.lg\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.lg\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.lg\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.lg\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.lg\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.lg\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.lg\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.lg\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.lg\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.lg\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.lg\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.lg\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.lg\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.lg\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.lg\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.lg\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.lg\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.lg\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.lg\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.lg\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.lg\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.lg\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.lg\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.lg\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.lg\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.lg\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.lg\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.lg\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.lg\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.lg\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.lg\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.lg\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.lg\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.lg\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.lg\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.lg\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.lg\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.lg\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.lg\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.lg\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.lg\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.lg\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.lg\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.lg\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.lg\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.lg\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.lg\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.lg\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.lg\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.lg\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.lg\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.lg\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.lg\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.lg\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.lg\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.lg\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.lg\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.lg\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.lg\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.lg\:bg-auto{background-size:auto}.lg\:bg-cover{background-size:cover}.lg\:bg-contain{background-size:contain}.lg\:bg-fixed{background-attachment:fixed}.lg\:bg-local{background-attachment:local}.lg\:bg-scroll{background-attachment:scroll}.lg\:bg-clip-border{background-clip:initial}.lg\:bg-clip-padding{background-clip:padding-box}.lg\:bg-clip-content{background-clip:content-box}.lg\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.lg\:bg-bottom{background-position:bottom}.lg\:bg-center{background-position:50%}.lg\:bg-left{background-position:0}.lg\:bg-left-bottom{background-position:0 100%}.lg\:bg-left-top{background-position:0 0}.lg\:bg-right{background-position:100%}.lg\:bg-right-bottom{background-position:100% 100%}.lg\:bg-right-top{background-position:100% 0}.lg\:bg-top{background-position:top}.lg\:bg-repeat{background-repeat:repeat}.lg\:bg-no-repeat{background-repeat:no-repeat}.lg\:bg-repeat-x{background-repeat:repeat-x}.lg\:bg-repeat-y{background-repeat:repeat-y}.lg\:bg-repeat-round{background-repeat:round}.lg\:bg-repeat-space{background-repeat:space}.lg\:bg-origin-border{background-origin:border-box}.lg\:bg-origin-padding{background-origin:initial}.lg\:bg-origin-content{background-origin:content-box}.lg\:fill-current{fill:currentColor}.lg\:stroke-current{stroke:currentColor}.lg\:stroke-0{stroke-width:0}.lg\:stroke-1{stroke-width:1}.lg\:stroke-2{stroke-width:2}.lg\:object-contain{-o-object-fit:contain;object-fit:contain}.lg\:object-cover{-o-object-fit:cover;object-fit:cover}.lg\:object-fill{-o-object-fit:fill;object-fit:fill}.lg\:object-none{-o-object-fit:none;object-fit:none}.lg\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.lg\:object-bottom{-o-object-position:bottom;object-position:bottom}.lg\:object-center{-o-object-position:center;object-position:center}.lg\:object-left{-o-object-position:left;object-position:left}.lg\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.lg\:object-left-top{-o-object-position:left top;object-position:left top}.lg\:object-right{-o-object-position:right;object-position:right}.lg\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.lg\:object-right-top{-o-object-position:right top;object-position:right top}.lg\:object-top{-o-object-position:top;object-position:top}.lg\:p-0{padding:0}.lg\:p-1{padding:.25rem}.lg\:p-2{padding:.5rem}.lg\:p-3{padding:.75rem}.lg\:p-4{padding:1rem}.lg\:p-5{padding:1.25rem}.lg\:p-6{padding:1.5rem}.lg\:p-7{padding:1.75rem}.lg\:p-8{padding:2rem}.lg\:p-9{padding:2.25rem}.lg\:p-10{padding:2.5rem}.lg\:p-11{padding:2.75rem}.lg\:p-12{padding:3rem}.lg\:p-14{padding:3.5rem}.lg\:p-16{padding:4rem}.lg\:p-20{padding:5rem}.lg\:p-24{padding:6rem}.lg\:p-28{padding:7rem}.lg\:p-32{padding:8rem}.lg\:p-36{padding:9rem}.lg\:p-40{padding:10rem}.lg\:p-44{padding:11rem}.lg\:p-48{padding:12rem}.lg\:p-52{padding:13rem}.lg\:p-56{padding:14rem}.lg\:p-60{padding:15rem}.lg\:p-64{padding:16rem}.lg\:p-72{padding:18rem}.lg\:p-80{padding:20rem}.lg\:p-96{padding:24rem}.lg\:p-px{padding:1px}.lg\:p-0\.5{padding:.125rem}.lg\:p-1\.5{padding:.375rem}.lg\:p-2\.5{padding:.625rem}.lg\:p-3\.5{padding:.875rem}.lg\:px-0{padding-left:0;padding-right:0}.lg\:px-1{padding-left:.25rem;padding-right:.25rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:px-7{padding-left:1.75rem;padding-right:1.75rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:px-9{padding-left:2.25rem;padding-right:2.25rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:px-11{padding-left:2.75rem;padding-right:2.75rem}.lg\:px-12{padding-left:3rem;padding-right:3rem}.lg\:px-14{padding-left:3.5rem;padding-right:3.5rem}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:px-20{padding-left:5rem;padding-right:5rem}.lg\:px-24{padding-left:6rem;padding-right:6rem}.lg\:px-28{padding-left:7rem;padding-right:7rem}.lg\:px-32{padding-left:8rem;padding-right:8rem}.lg\:px-36{padding-left:9rem;padding-right:9rem}.lg\:px-40{padding-left:10rem;padding-right:10rem}.lg\:px-44{padding-left:11rem;padding-right:11rem}.lg\:px-48{padding-left:12rem;padding-right:12rem}.lg\:px-52{padding-left:13rem;padding-right:13rem}.lg\:px-56{padding-left:14rem;padding-right:14rem}.lg\:px-60{padding-left:15rem;padding-right:15rem}.lg\:px-64{padding-left:16rem;padding-right:16rem}.lg\:px-72{padding-left:18rem;padding-right:18rem}.lg\:px-80{padding-left:20rem;padding-right:20rem}.lg\:px-96{padding-left:24rem;padding-right:24rem}.lg\:px-px{padding-left:1px;padding-right:1px}.lg\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.lg\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.lg\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.lg\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.lg\:py-0{padding-top:0;padding-bottom:0}.lg\:py-1{padding-top:.25rem;padding-bottom:.25rem}.lg\:py-2{padding-top:.5rem;padding-bottom:.5rem}.lg\:py-3{padding-top:.75rem;padding-bottom:.75rem}.lg\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.lg\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.lg\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.lg\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.lg\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.lg\:py-12{padding-top:3rem;padding-bottom:3rem}.lg\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.lg\:py-16{padding-top:4rem;padding-bottom:4rem}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:py-24{padding-top:6rem;padding-bottom:6rem}.lg\:py-28{padding-top:7rem;padding-bottom:7rem}.lg\:py-32{padding-top:8rem;padding-bottom:8rem}.lg\:py-36{padding-top:9rem;padding-bottom:9rem}.lg\:py-40{padding-top:10rem;padding-bottom:10rem}.lg\:py-44{padding-top:11rem;padding-bottom:11rem}.lg\:py-48{padding-top:12rem;padding-bottom:12rem}.lg\:py-52{padding-top:13rem;padding-bottom:13rem}.lg\:py-56{padding-top:14rem;padding-bottom:14rem}.lg\:py-60{padding-top:15rem;padding-bottom:15rem}.lg\:py-64{padding-top:16rem;padding-bottom:16rem}.lg\:py-72{padding-top:18rem;padding-bottom:18rem}.lg\:py-80{padding-top:20rem;padding-bottom:20rem}.lg\:py-96{padding-top:24rem;padding-bottom:24rem}.lg\:py-px{padding-top:1px;padding-bottom:1px}.lg\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.lg\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.lg\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.lg\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.lg\:pt-0{padding-top:0}.lg\:pt-1{padding-top:.25rem}.lg\:pt-2{padding-top:.5rem}.lg\:pt-3{padding-top:.75rem}.lg\:pt-4{padding-top:1rem}.lg\:pt-5{padding-top:1.25rem}.lg\:pt-6{padding-top:1.5rem}.lg\:pt-7{padding-top:1.75rem}.lg\:pt-8{padding-top:2rem}.lg\:pt-9{padding-top:2.25rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pt-11{padding-top:2.75rem}.lg\:pt-12{padding-top:3rem}.lg\:pt-14{padding-top:3.5rem}.lg\:pt-16{padding-top:4rem}.lg\:pt-20{padding-top:5rem}.lg\:pt-24{padding-top:6rem}.lg\:pt-28{padding-top:7rem}.lg\:pt-32{padding-top:8rem}.lg\:pt-36{padding-top:9rem}.lg\:pt-40{padding-top:10rem}.lg\:pt-44{padding-top:11rem}.lg\:pt-48{padding-top:12rem}.lg\:pt-52{padding-top:13rem}.lg\:pt-56{padding-top:14rem}.lg\:pt-60{padding-top:15rem}.lg\:pt-64{padding-top:16rem}.lg\:pt-72{padding-top:18rem}.lg\:pt-80{padding-top:20rem}.lg\:pt-96{padding-top:24rem}.lg\:pt-px{padding-top:1px}.lg\:pt-0\.5{padding-top:.125rem}.lg\:pt-1\.5{padding-top:.375rem}.lg\:pt-2\.5{padding-top:.625rem}.lg\:pt-3\.5{padding-top:.875rem}.lg\:pr-0{padding-right:0}.lg\:pr-1{padding-right:.25rem}.lg\:pr-2{padding-right:.5rem}.lg\:pr-3{padding-right:.75rem}.lg\:pr-4{padding-right:1rem}.lg\:pr-5{padding-right:1.25rem}.lg\:pr-6{padding-right:1.5rem}.lg\:pr-7{padding-right:1.75rem}.lg\:pr-8{padding-right:2rem}.lg\:pr-9{padding-right:2.25rem}.lg\:pr-10{padding-right:2.5rem}.lg\:pr-11{padding-right:2.75rem}.lg\:pr-12{padding-right:3rem}.lg\:pr-14{padding-right:3.5rem}.lg\:pr-16{padding-right:4rem}.lg\:pr-20{padding-right:5rem}.lg\:pr-24{padding-right:6rem}.lg\:pr-28{padding-right:7rem}.lg\:pr-32{padding-right:8rem}.lg\:pr-36{padding-right:9rem}.lg\:pr-40{padding-right:10rem}.lg\:pr-44{padding-right:11rem}.lg\:pr-48{padding-right:12rem}.lg\:pr-52{padding-right:13rem}.lg\:pr-56{padding-right:14rem}.lg\:pr-60{padding-right:15rem}.lg\:pr-64{padding-right:16rem}.lg\:pr-72{padding-right:18rem}.lg\:pr-80{padding-right:20rem}.lg\:pr-96{padding-right:24rem}.lg\:pr-px{padding-right:1px}.lg\:pr-0\.5{padding-right:.125rem}.lg\:pr-1\.5{padding-right:.375rem}.lg\:pr-2\.5{padding-right:.625rem}.lg\:pr-3\.5{padding-right:.875rem}.lg\:pb-0{padding-bottom:0}.lg\:pb-1{padding-bottom:.25rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pb-3{padding-bottom:.75rem}.lg\:pb-4{padding-bottom:1rem}.lg\:pb-5{padding-bottom:1.25rem}.lg\:pb-6{padding-bottom:1.5rem}.lg\:pb-7{padding-bottom:1.75rem}.lg\:pb-8{padding-bottom:2rem}.lg\:pb-9{padding-bottom:2.25rem}.lg\:pb-10{padding-bottom:2.5rem}.lg\:pb-11{padding-bottom:2.75rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pb-14{padding-bottom:3.5rem}.lg\:pb-16{padding-bottom:4rem}.lg\:pb-20{padding-bottom:5rem}.lg\:pb-24{padding-bottom:6rem}.lg\:pb-28{padding-bottom:7rem}.lg\:pb-32{padding-bottom:8rem}.lg\:pb-36{padding-bottom:9rem}.lg\:pb-40{padding-bottom:10rem}.lg\:pb-44{padding-bottom:11rem}.lg\:pb-48{padding-bottom:12rem}.lg\:pb-52{padding-bottom:13rem}.lg\:pb-56{padding-bottom:14rem}.lg\:pb-60{padding-bottom:15rem}.lg\:pb-64{padding-bottom:16rem}.lg\:pb-72{padding-bottom:18rem}.lg\:pb-80{padding-bottom:20rem}.lg\:pb-96{padding-bottom:24rem}.lg\:pb-px{padding-bottom:1px}.lg\:pb-0\.5{padding-bottom:.125rem}.lg\:pb-1\.5{padding-bottom:.375rem}.lg\:pb-2\.5{padding-bottom:.625rem}.lg\:pb-3\.5{padding-bottom:.875rem}.lg\:pl-0{padding-left:0}.lg\:pl-1{padding-left:.25rem}.lg\:pl-2{padding-left:.5rem}.lg\:pl-3{padding-left:.75rem}.lg\:pl-4{padding-left:1rem}.lg\:pl-5{padding-left:1.25rem}.lg\:pl-6{padding-left:1.5rem}.lg\:pl-7{padding-left:1.75rem}.lg\:pl-8{padding-left:2rem}.lg\:pl-9{padding-left:2.25rem}.lg\:pl-10{padding-left:2.5rem}.lg\:pl-11{padding-left:2.75rem}.lg\:pl-12{padding-left:3rem}.lg\:pl-14{padding-left:3.5rem}.lg\:pl-16{padding-left:4rem}.lg\:pl-20{padding-left:5rem}.lg\:pl-24{padding-left:6rem}.lg\:pl-28{padding-left:7rem}.lg\:pl-32{padding-left:8rem}.lg\:pl-36{padding-left:9rem}.lg\:pl-40{padding-left:10rem}.lg\:pl-44{padding-left:11rem}.lg\:pl-48{padding-left:12rem}.lg\:pl-52{padding-left:13rem}.lg\:pl-56{padding-left:14rem}.lg\:pl-60{padding-left:15rem}.lg\:pl-64{padding-left:16rem}.lg\:pl-72{padding-left:18rem}.lg\:pl-80{padding-left:20rem}.lg\:pl-96{padding-left:24rem}.lg\:pl-px{padding-left:1px}.lg\:pl-0\.5{padding-left:.125rem}.lg\:pl-1\.5{padding-left:.375rem}.lg\:pl-2\.5{padding-left:.625rem}.lg\:pl-3\.5{padding-left:.875rem}.lg\:text-left{text-align:left}.lg\:text-center{text-align:center}.lg\:text-right{text-align:right}.lg\:text-justify{text-align:justify}.lg\:align-baseline{vertical-align:initial}.lg\:align-top{vertical-align:top}.lg\:align-middle{vertical-align:middle}.lg\:align-bottom{vertical-align:bottom}.lg\:align-text-top{vertical-align:text-top}.lg\:align-text-bottom{vertical-align:text-bottom}.lg\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lg\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.lg\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lg\:text-xs{font-size:.75rem;line-height:1rem}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}.lg\:text-base{font-size:1rem;line-height:1.5rem}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}.lg\:text-xl{font-size:1.25rem;line-height:1.75rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-3xl{font-size:1.875rem;line-height:2.25rem}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:text-5xl{font-size:3rem;line-height:1}.lg\:text-6xl{font-size:3.75rem;line-height:1}.lg\:text-7xl{font-size:4.5rem;line-height:1}.lg\:text-8xl{font-size:6rem;line-height:1}.lg\:text-9xl{font-size:8rem;line-height:1}.lg\:font-thin{font-weight:100}.lg\:font-extralight{font-weight:200}.lg\:font-light{font-weight:300}.lg\:font-normal{font-weight:400}.lg\:font-medium{font-weight:500}.lg\:font-semibold{font-weight:600}.lg\:font-bold{font-weight:700}.lg\:font-extrabold{font-weight:800}.lg\:font-black{font-weight:900}.lg\:uppercase{text-transform:uppercase}.lg\:lowercase{text-transform:lowercase}.lg\:capitalize{text-transform:capitalize}.lg\:normal-case{text-transform:none}.lg\:italic{font-style:italic}.lg\:not-italic{font-style:normal}.lg\:diagonal-fractions,.lg\:lining-nums,.lg\:oldstyle-nums,.lg\:ordinal,.lg\:proportional-nums,.lg\:slashed-zero,.lg\:stacked-fractions,.lg\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.lg\:normal-nums{font-variant-numeric:normal}.lg\:ordinal{--tw-ordinal:ordinal}.lg\:slashed-zero{--tw-slashed-zero:slashed-zero}.lg\:lining-nums{--tw-numeric-figure:lining-nums}.lg\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.lg\:proportional-nums{--tw-numeric-spacing:proportional-nums}.lg\:tabular-nums{--tw-numeric-spacing:tabular-nums}.lg\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.lg\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.lg\:leading-3{line-height:.75rem}.lg\:leading-4{line-height:1rem}.lg\:leading-5{line-height:1.25rem}.lg\:leading-6{line-height:1.5rem}.lg\:leading-7{line-height:1.75rem}.lg\:leading-8{line-height:2rem}.lg\:leading-9{line-height:2.25rem}.lg\:leading-10{line-height:2.5rem}.lg\:leading-none{line-height:1}.lg\:leading-tight{line-height:1.25}.lg\:leading-snug{line-height:1.375}.lg\:leading-normal{line-height:1.5}.lg\:leading-relaxed{line-height:1.625}.lg\:leading-loose{line-height:2}.lg\:tracking-tighter{letter-spacing:-.05em}.lg\:tracking-tight{letter-spacing:-.025em}.lg\:tracking-normal{letter-spacing:0}.lg\:tracking-wide{letter-spacing:.025em}.lg\:tracking-wider{letter-spacing:.05em}.lg\:tracking-widest{letter-spacing:.1em}.lg\:text-transparent{color:transparent}.lg\:text-current{color:currentColor}.lg\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-transparent{color:transparent}.group:hover .lg\:group-hover\:text-current{color:currentColor}.group:hover .lg\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:focus-within\:text-transparent:focus-within{color:transparent}.lg\:focus-within\:text-current:focus-within{color:currentColor}.lg\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:hover\:text-transparent:hover{color:transparent}.lg\:hover\:text-current:hover{color:currentColor}.lg\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:focus\:text-transparent:focus{color:transparent}.lg\:focus\:text-current:focus{color:currentColor}.lg\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:text-opacity-0{--tw-text-opacity:0}.lg\:text-opacity-5{--tw-text-opacity:0.05}.lg\:text-opacity-10{--tw-text-opacity:0.1}.lg\:text-opacity-20{--tw-text-opacity:0.2}.lg\:text-opacity-25{--tw-text-opacity:0.25}.lg\:text-opacity-30{--tw-text-opacity:0.3}.lg\:text-opacity-40{--tw-text-opacity:0.4}.lg\:text-opacity-50{--tw-text-opacity:0.5}.lg\:text-opacity-60{--tw-text-opacity:0.6}.lg\:text-opacity-70{--tw-text-opacity:0.7}.lg\:text-opacity-75{--tw-text-opacity:0.75}.lg\:text-opacity-80{--tw-text-opacity:0.8}.lg\:text-opacity-90{--tw-text-opacity:0.9}.lg\:text-opacity-95{--tw-text-opacity:0.95}.lg\:text-opacity-100{--tw-text-opacity:1}.group:hover .lg\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .lg\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .lg\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .lg\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .lg\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .lg\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .lg\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .lg\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .lg\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .lg\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .lg\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .lg\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .lg\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .lg\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .lg\:group-hover\:text-opacity-100{--tw-text-opacity:1}.lg\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.lg\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.lg\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.lg\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.lg\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.lg\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.lg\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.lg\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.lg\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.lg\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.lg\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.lg\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.lg\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.lg\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.lg\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.lg\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.lg\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.lg\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.lg\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.lg\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.lg\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.lg\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.lg\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.lg\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.lg\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.lg\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.lg\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.lg\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.lg\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.lg\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.lg\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.lg\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.lg\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.lg\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.lg\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.lg\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.lg\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.lg\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.lg\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.lg\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.lg\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.lg\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.lg\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.lg\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.lg\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.lg\:underline{text-decoration:underline}.lg\:line-through{text-decoration:line-through}.lg\:no-underline{text-decoration:none}.group:hover .lg\:group-hover\:underline{text-decoration:underline}.group:hover .lg\:group-hover\:line-through{text-decoration:line-through}.group:hover .lg\:group-hover\:no-underline{text-decoration:none}.lg\:focus-within\:underline:focus-within{text-decoration:underline}.lg\:focus-within\:line-through:focus-within{text-decoration:line-through}.lg\:focus-within\:no-underline:focus-within{text-decoration:none}.lg\:hover\:underline:hover{text-decoration:underline}.lg\:hover\:line-through:hover{text-decoration:line-through}.lg\:hover\:no-underline:hover{text-decoration:none}.lg\:focus\:underline:focus{text-decoration:underline}.lg\:focus\:line-through:focus{text-decoration:line-through}.lg\:focus\:no-underline:focus{text-decoration:none}.lg\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.lg\:placeholder-transparent::-moz-placeholder{color:transparent}.lg\:placeholder-transparent:-ms-input-placeholder{color:transparent}.lg\:placeholder-transparent::placeholder{color:transparent}.lg\:placeholder-current::-moz-placeholder{color:currentColor}.lg\:placeholder-current:-ms-input-placeholder{color:currentColor}.lg\:placeholder-current::placeholder{color:currentColor}.lg\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.lg\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus::placeholder{color:currentColor}.lg\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.lg\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.lg\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.lg\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.lg\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.lg\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.lg\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.lg\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.lg\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.lg\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.lg\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.lg\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.lg\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.lg\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.lg\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.lg\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.lg\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.lg\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.lg\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.lg\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.lg\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.lg\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.lg\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.lg\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.lg\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.lg\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.lg\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.lg\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.lg\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.lg\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.lg\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.lg\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.lg\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.lg\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.lg\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.lg\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.lg\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.lg\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.lg\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.lg\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.lg\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.lg\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.lg\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.lg\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.lg\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.lg\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.lg\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.lg\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.lg\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.lg\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.lg\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.lg\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.lg\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.lg\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.lg\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.lg\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.lg\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.lg\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.lg\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.lg\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.lg\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.lg\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.lg\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.lg\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.lg\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.lg\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.lg\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.lg\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.lg\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.lg\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.lg\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.lg\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.lg\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.lg\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.lg\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.lg\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.lg\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.lg\:opacity-0{opacity:0}.lg\:opacity-5{opacity:.05}.lg\:opacity-10{opacity:.1}.lg\:opacity-20{opacity:.2}.lg\:opacity-25{opacity:.25}.lg\:opacity-30{opacity:.3}.lg\:opacity-40{opacity:.4}.lg\:opacity-50{opacity:.5}.lg\:opacity-60{opacity:.6}.lg\:opacity-70{opacity:.7}.lg\:opacity-75{opacity:.75}.lg\:opacity-80{opacity:.8}.lg\:opacity-90{opacity:.9}.lg\:opacity-95{opacity:.95}.lg\:opacity-100{opacity:1}.group:hover .lg\:group-hover\:opacity-0{opacity:0}.group:hover .lg\:group-hover\:opacity-5{opacity:.05}.group:hover .lg\:group-hover\:opacity-10{opacity:.1}.group:hover .lg\:group-hover\:opacity-20{opacity:.2}.group:hover .lg\:group-hover\:opacity-25{opacity:.25}.group:hover .lg\:group-hover\:opacity-30{opacity:.3}.group:hover .lg\:group-hover\:opacity-40{opacity:.4}.group:hover .lg\:group-hover\:opacity-50{opacity:.5}.group:hover .lg\:group-hover\:opacity-60{opacity:.6}.group:hover .lg\:group-hover\:opacity-70{opacity:.7}.group:hover .lg\:group-hover\:opacity-75{opacity:.75}.group:hover .lg\:group-hover\:opacity-80{opacity:.8}.group:hover .lg\:group-hover\:opacity-90{opacity:.9}.group:hover .lg\:group-hover\:opacity-95{opacity:.95}.group:hover .lg\:group-hover\:opacity-100{opacity:1}.lg\:focus-within\:opacity-0:focus-within{opacity:0}.lg\:focus-within\:opacity-5:focus-within{opacity:.05}.lg\:focus-within\:opacity-10:focus-within{opacity:.1}.lg\:focus-within\:opacity-20:focus-within{opacity:.2}.lg\:focus-within\:opacity-25:focus-within{opacity:.25}.lg\:focus-within\:opacity-30:focus-within{opacity:.3}.lg\:focus-within\:opacity-40:focus-within{opacity:.4}.lg\:focus-within\:opacity-50:focus-within{opacity:.5}.lg\:focus-within\:opacity-60:focus-within{opacity:.6}.lg\:focus-within\:opacity-70:focus-within{opacity:.7}.lg\:focus-within\:opacity-75:focus-within{opacity:.75}.lg\:focus-within\:opacity-80:focus-within{opacity:.8}.lg\:focus-within\:opacity-90:focus-within{opacity:.9}.lg\:focus-within\:opacity-95:focus-within{opacity:.95}.lg\:focus-within\:opacity-100:focus-within{opacity:1}.lg\:hover\:opacity-0:hover{opacity:0}.lg\:hover\:opacity-5:hover{opacity:.05}.lg\:hover\:opacity-10:hover{opacity:.1}.lg\:hover\:opacity-20:hover{opacity:.2}.lg\:hover\:opacity-25:hover{opacity:.25}.lg\:hover\:opacity-30:hover{opacity:.3}.lg\:hover\:opacity-40:hover{opacity:.4}.lg\:hover\:opacity-50:hover{opacity:.5}.lg\:hover\:opacity-60:hover{opacity:.6}.lg\:hover\:opacity-70:hover{opacity:.7}.lg\:hover\:opacity-75:hover{opacity:.75}.lg\:hover\:opacity-80:hover{opacity:.8}.lg\:hover\:opacity-90:hover{opacity:.9}.lg\:hover\:opacity-95:hover{opacity:.95}.lg\:hover\:opacity-100:hover{opacity:1}.lg\:focus\:opacity-0:focus{opacity:0}.lg\:focus\:opacity-5:focus{opacity:.05}.lg\:focus\:opacity-10:focus{opacity:.1}.lg\:focus\:opacity-20:focus{opacity:.2}.lg\:focus\:opacity-25:focus{opacity:.25}.lg\:focus\:opacity-30:focus{opacity:.3}.lg\:focus\:opacity-40:focus{opacity:.4}.lg\:focus\:opacity-50:focus{opacity:.5}.lg\:focus\:opacity-60:focus{opacity:.6}.lg\:focus\:opacity-70:focus{opacity:.7}.lg\:focus\:opacity-75:focus{opacity:.75}.lg\:focus\:opacity-80:focus{opacity:.8}.lg\:focus\:opacity-90:focus{opacity:.9}.lg\:focus\:opacity-95:focus{opacity:.95}.lg\:focus\:opacity-100:focus{opacity:1}.lg\:bg-blend-normal{background-blend-mode:normal}.lg\:bg-blend-multiply{background-blend-mode:multiply}.lg\:bg-blend-screen{background-blend-mode:screen}.lg\:bg-blend-overlay{background-blend-mode:overlay}.lg\:bg-blend-darken{background-blend-mode:darken}.lg\:bg-blend-lighten{background-blend-mode:lighten}.lg\:bg-blend-color-dodge{background-blend-mode:color-dodge}.lg\:bg-blend-color-burn{background-blend-mode:color-burn}.lg\:bg-blend-hard-light{background-blend-mode:hard-light}.lg\:bg-blend-soft-light{background-blend-mode:soft-light}.lg\:bg-blend-difference{background-blend-mode:difference}.lg\:bg-blend-exclusion{background-blend-mode:exclusion}.lg\:bg-blend-hue{background-blend-mode:hue}.lg\:bg-blend-saturation{background-blend-mode:saturation}.lg\:bg-blend-color{background-blend-mode:color}.lg\:bg-blend-luminosity{background-blend-mode:luminosity}.lg\:mix-blend-normal{mix-blend-mode:normal}.lg\:mix-blend-multiply{mix-blend-mode:multiply}.lg\:mix-blend-screen{mix-blend-mode:screen}.lg\:mix-blend-overlay{mix-blend-mode:overlay}.lg\:mix-blend-darken{mix-blend-mode:darken}.lg\:mix-blend-lighten{mix-blend-mode:lighten}.lg\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.lg\:mix-blend-color-burn{mix-blend-mode:color-burn}.lg\:mix-blend-hard-light{mix-blend-mode:hard-light}.lg\:mix-blend-soft-light{mix-blend-mode:soft-light}.lg\:mix-blend-difference{mix-blend-mode:difference}.lg\:mix-blend-exclusion{mix-blend-mode:exclusion}.lg\:mix-blend-hue{mix-blend-mode:hue}.lg\:mix-blend-saturation{mix-blend-mode:saturation}.lg\:mix-blend-color{mix-blend-mode:color}.lg\:mix-blend-luminosity{mix-blend-mode:luminosity}.lg\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.lg\:shadow,.lg\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.lg\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.lg\:shadow-lg,.lg\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.lg\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.lg\:shadow-2xl,.lg\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.lg\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.lg\:shadow-inner,.lg\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .lg\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .lg\:group-hover\:shadow,.group:hover .lg\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .lg\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .lg\:group-hover\:shadow-lg,.group:hover .lg\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .lg\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .lg\:group-hover\:shadow-2xl,.group:hover .lg\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .lg\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .lg\:group-hover\:shadow-inner,.group:hover .lg\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.lg\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.lg\:hover\:shadow-sm:hover,.lg\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.lg\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.lg\:hover\:shadow-lg:hover,.lg\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.lg\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.lg\:hover\:shadow-2xl:hover,.lg\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.lg\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.lg\:hover\:shadow-inner:hover,.lg\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.lg\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.lg\:focus\:shadow-sm:focus,.lg\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.lg\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.lg\:focus\:shadow-lg:focus,.lg\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.lg\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.lg\:focus\:shadow-2xl:focus,.lg\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.lg\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.lg\:focus\:shadow-inner:focus,.lg\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.lg\:outline-none{outline:2px solid transparent;outline-offset:2px}.lg\:outline-white{outline:2px dotted #fff;outline-offset:2px}.lg\:outline-black{outline:2px dotted #000;outline-offset:2px}.lg\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.lg\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.lg\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.lg\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lg\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.lg\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.lg\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-0,.lg\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-2,.lg\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring,.lg\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-0:focus,.lg\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-2:focus,.lg\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-8:focus,.lg\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-inset{--tw-ring-inset:inset}.lg\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.lg\:focus\:ring-inset:focus{--tw-ring-inset:inset}.lg\:ring-transparent{--tw-ring-color:transparent}.lg\:ring-current{--tw-ring-color:currentColor}.lg\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.lg\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.lg\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.lg\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.lg\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.lg\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.lg\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.lg\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.lg\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.lg\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.lg\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.lg\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.lg\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.lg\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.lg\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.lg\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.lg\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.lg\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.lg\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.lg\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.lg\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.lg\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.lg\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.lg\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.lg\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.lg\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.lg\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.lg\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.lg\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.lg\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.lg\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.lg\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.lg\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.lg\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.lg\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.lg\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.lg\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.lg\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.lg\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.lg\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.lg\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.lg\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.lg\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.lg\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.lg\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.lg\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.lg\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.lg\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.lg\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.lg\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.lg\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.lg\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.lg\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.lg\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.lg\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.lg\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.lg\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.lg\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.lg\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.lg\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.lg\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.lg\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.lg\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.lg\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.lg\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.lg\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.lg\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.lg\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.lg\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.lg\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.lg\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.lg\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.lg\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.lg\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.lg\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.lg\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.lg\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.lg\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.lg\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.lg\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.lg\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.lg\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.lg\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.lg\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.lg\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.lg\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.lg\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.lg\:focus\:ring-current:focus{--tw-ring-color:currentColor}.lg\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.lg\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.lg\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.lg\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.lg\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.lg\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.lg\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.lg\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.lg\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.lg\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.lg\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.lg\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.lg\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.lg\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.lg\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.lg\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.lg\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.lg\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.lg\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.lg\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.lg\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.lg\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.lg\:ring-opacity-0{--tw-ring-opacity:0}.lg\:ring-opacity-5{--tw-ring-opacity:0.05}.lg\:ring-opacity-10{--tw-ring-opacity:0.1}.lg\:ring-opacity-20{--tw-ring-opacity:0.2}.lg\:ring-opacity-25{--tw-ring-opacity:0.25}.lg\:ring-opacity-30{--tw-ring-opacity:0.3}.lg\:ring-opacity-40{--tw-ring-opacity:0.4}.lg\:ring-opacity-50{--tw-ring-opacity:0.5}.lg\:ring-opacity-60{--tw-ring-opacity:0.6}.lg\:ring-opacity-70{--tw-ring-opacity:0.7}.lg\:ring-opacity-75{--tw-ring-opacity:0.75}.lg\:ring-opacity-80{--tw-ring-opacity:0.8}.lg\:ring-opacity-90{--tw-ring-opacity:0.9}.lg\:ring-opacity-95{--tw-ring-opacity:0.95}.lg\:ring-opacity-100{--tw-ring-opacity:1}.lg\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.lg\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.lg\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.lg\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.lg\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.lg\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.lg\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.lg\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.lg\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.lg\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.lg\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.lg\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.lg\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.lg\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.lg\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.lg\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.lg\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.lg\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.lg\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.lg\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.lg\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.lg\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.lg\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.lg\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.lg\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.lg\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.lg\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.lg\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.lg\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.lg\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.lg\:ring-offset-0{--tw-ring-offset-width:0px}.lg\:ring-offset-1{--tw-ring-offset-width:1px}.lg\:ring-offset-2{--tw-ring-offset-width:2px}.lg\:ring-offset-4{--tw-ring-offset-width:4px}.lg\:ring-offset-8{--tw-ring-offset-width:8px}.lg\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.lg\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.lg\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.lg\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.lg\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.lg\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.lg\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.lg\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lg\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.lg\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.lg\:ring-offset-transparent{--tw-ring-offset-color:transparent}.lg\:ring-offset-current{--tw-ring-offset-color:currentColor}.lg\:ring-offset-black{--tw-ring-offset-color:#000}.lg\:ring-offset-white{--tw-ring-offset-color:#fff}.lg\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.lg\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.lg\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.lg\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.lg\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.lg\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.lg\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.lg\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.lg\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.lg\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.lg\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.lg\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.lg\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.lg\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.lg\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.lg\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.lg\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.lg\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.lg\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.lg\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.lg\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.lg\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.lg\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.lg\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.lg\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.lg\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.lg\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.lg\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.lg\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.lg\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.lg\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.lg\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.lg\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.lg\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.lg\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.lg\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.lg\:ring-offset-green-600{--tw-ring-offset-color:#059669}.lg\:ring-offset-green-700{--tw-ring-offset-color:#047857}.lg\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.lg\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.lg\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.lg\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.lg\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.lg\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.lg\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.lg\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.lg\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.lg\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.lg\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.lg\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.lg\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.lg\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.lg\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.lg\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.lg\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.lg\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.lg\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.lg\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.lg\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.lg\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.lg\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.lg\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.lg\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.lg\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.lg\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.lg\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.lg\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.lg\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.lg\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.lg\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.lg\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.lg\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.lg\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.lg\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.lg\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.lg\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.lg\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.lg\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.lg\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.lg\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.lg\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.lg\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.lg\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.lg\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.lg\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.lg\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.lg\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.lg\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.lg\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.lg\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.lg\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.lg\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.lg\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.lg\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.lg\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.lg\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.lg\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.lg\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.lg\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.lg\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.lg\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.lg\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.lg\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.lg\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.lg\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.lg\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.lg\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.lg\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.lg\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.lg\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.lg\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.lg\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.lg\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.lg\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.lg\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.lg\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.lg\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.lg\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.lg\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.lg\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.lg\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.lg\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.lg\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.lg\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.lg\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.lg\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.lg\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.lg\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.lg\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.lg\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.lg\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.lg\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.lg\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.lg\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.lg\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.lg\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.lg\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.lg\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.lg\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.lg\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.lg\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.lg\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.lg\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.lg\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.lg\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.lg\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.lg\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.lg\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.lg\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.lg\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.lg\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.lg\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.lg\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.lg\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.lg\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.lg\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.lg\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.lg\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.lg\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.lg\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.lg\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.lg\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.lg\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.lg\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.lg\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.lg\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.lg\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.lg\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.lg\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.lg\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.lg\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.lg\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.lg\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.lg\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.lg\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.lg\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.lg\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.lg\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.lg\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.lg\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.lg\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.lg\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.lg\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.lg\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.lg\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.lg\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.lg\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.lg\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.lg\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.lg\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.lg\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.lg\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.lg\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.lg\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.lg\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.lg\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.lg\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.lg\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.lg\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.lg\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.lg\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.lg\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.lg\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.lg\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.lg\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.lg\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.lg\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.lg\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.lg\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.lg\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.lg\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.lg\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.lg\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.lg\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.lg\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.lg\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.lg\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.lg\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.lg\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.lg\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.lg\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.lg\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.lg\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.lg\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.lg\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.lg\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.lg\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.lg\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.lg\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.lg\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.lg\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.lg\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.lg\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.lg\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.lg\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.lg\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.lg\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.lg\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.lg\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.lg\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.lg\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.lg\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.lg\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.lg\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.lg\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.lg\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.lg\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.lg\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.lg\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lg\:filter-none{filter:none}.lg\:blur-0,.lg\:blur-none{--tw-blur:blur(0)}.lg\:blur-sm{--tw-blur:blur(4px)}.lg\:blur{--tw-blur:blur(8px)}.lg\:blur-md{--tw-blur:blur(12px)}.lg\:blur-lg{--tw-blur:blur(16px)}.lg\:blur-xl{--tw-blur:blur(24px)}.lg\:blur-2xl{--tw-blur:blur(40px)}.lg\:blur-3xl{--tw-blur:blur(64px)}.lg\:brightness-0{--tw-brightness:brightness(0)}.lg\:brightness-50{--tw-brightness:brightness(.5)}.lg\:brightness-75{--tw-brightness:brightness(.75)}.lg\:brightness-90{--tw-brightness:brightness(.9)}.lg\:brightness-95{--tw-brightness:brightness(.95)}.lg\:brightness-100{--tw-brightness:brightness(1)}.lg\:brightness-105{--tw-brightness:brightness(1.05)}.lg\:brightness-110{--tw-brightness:brightness(1.1)}.lg\:brightness-125{--tw-brightness:brightness(1.25)}.lg\:brightness-150{--tw-brightness:brightness(1.5)}.lg\:brightness-200{--tw-brightness:brightness(2)}.lg\:contrast-0{--tw-contrast:contrast(0)}.lg\:contrast-50{--tw-contrast:contrast(.5)}.lg\:contrast-75{--tw-contrast:contrast(.75)}.lg\:contrast-100{--tw-contrast:contrast(1)}.lg\:contrast-125{--tw-contrast:contrast(1.25)}.lg\:contrast-150{--tw-contrast:contrast(1.5)}.lg\:contrast-200{--tw-contrast:contrast(2)}.lg\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.lg\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.lg\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.lg\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.lg\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.lg\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.lg\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.lg\:grayscale-0{--tw-grayscale:grayscale(0)}.lg\:grayscale{--tw-grayscale:grayscale(100%)}.lg\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.lg\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.lg\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.lg\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.lg\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.lg\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.lg\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.lg\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.lg\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.lg\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.lg\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.lg\:invert-0{--tw-invert:invert(0)}.lg\:invert{--tw-invert:invert(100%)}.lg\:saturate-0{--tw-saturate:saturate(0)}.lg\:saturate-50{--tw-saturate:saturate(.5)}.lg\:saturate-100{--tw-saturate:saturate(1)}.lg\:saturate-150{--tw-saturate:saturate(1.5)}.lg\:saturate-200{--tw-saturate:saturate(2)}.lg\:sepia-0{--tw-sepia:sepia(0)}.lg\:sepia{--tw-sepia:sepia(100%)}.lg\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lg\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.lg\:backdrop-blur-0,.lg\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.lg\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lg\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.lg\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.lg\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.lg\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.lg\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.lg\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.lg\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.lg\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.lg\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.lg\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.lg\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.lg\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.lg\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.lg\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.lg\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.lg\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.lg\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.lg\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.lg\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.lg\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.lg\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.lg\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.lg\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.lg\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.lg\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.lg\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.lg\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.lg\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.lg\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.lg\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.lg\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.lg\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.lg\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.lg\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.lg\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.lg\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.lg\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.lg\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.lg\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.lg\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.lg\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.lg\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.lg\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.lg\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.lg\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.lg\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.lg\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.lg\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.lg\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.lg\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.lg\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.lg\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.lg\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.lg\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.lg\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.lg\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.lg\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.lg\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.lg\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.lg\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.lg\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.lg\:transition-none{transition-property:none}.lg\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:delay-75{transition-delay:75ms}.lg\:delay-100{transition-delay:.1s}.lg\:delay-150{transition-delay:.15s}.lg\:delay-200{transition-delay:.2s}.lg\:delay-300{transition-delay:.3s}.lg\:delay-500{transition-delay:.5s}.lg\:delay-700{transition-delay:.7s}.lg\:delay-1000{transition-delay:1s}.lg\:duration-75{transition-duration:75ms}.lg\:duration-100{transition-duration:.1s}.lg\:duration-150{transition-duration:.15s}.lg\:duration-200{transition-duration:.2s}.lg\:duration-300{transition-duration:.3s}.lg\:duration-500{transition-duration:.5s}.lg\:duration-700{transition-duration:.7s}.lg\:duration-1000{transition-duration:1s}.lg\:ease-linear{transition-timing-function:linear}.lg\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lg\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.lg\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}@media (min-width:1536px){.xl\:container{max-width:1536px}}.xl\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:pointer-events-none{pointer-events:none}.xl\:pointer-events-auto{pointer-events:auto}.xl\:visible{visibility:visible}.xl\:invisible{visibility:hidden}.xl\:static{position:static}.xl\:fixed{position:fixed}.xl\:absolute{position:absolute}.xl\:relative{position:relative}.xl\:sticky{position:-webkit-sticky;position:sticky}.xl\:inset-0{top:0;right:0;bottom:0;left:0}.xl\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.xl\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.xl\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.xl\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.xl\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.xl\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.xl\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.xl\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.xl\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.xl\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.xl\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.xl\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.xl\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.xl\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.xl\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.xl\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.xl\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.xl\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.xl\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.xl\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.xl\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.xl\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.xl\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.xl\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.xl\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.xl\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.xl\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.xl\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.xl\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.xl\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.xl\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.xl\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.xl\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.xl\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.xl\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.xl\:-inset-0{top:0;right:0;bottom:0;left:0}.xl\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.xl\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.xl\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.xl\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.xl\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.xl\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.xl\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.xl\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.xl\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.xl\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.xl\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.xl\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.xl\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.xl\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.xl\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.xl\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.xl\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.xl\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.xl\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.xl\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.xl\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.xl\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.xl\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.xl\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.xl\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.xl\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.xl\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.xl\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.xl\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.xl\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.xl\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.xl\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.xl\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.xl\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.xl\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.xl\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.xl\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.xl\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.xl\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.xl\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.xl\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.xl\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.xl\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.xl\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.xl\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.xl\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.xl\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.xl\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.xl\:inset-x-0{left:0;right:0}.xl\:inset-x-1{left:.25rem;right:.25rem}.xl\:inset-x-2{left:.5rem;right:.5rem}.xl\:inset-x-3{left:.75rem;right:.75rem}.xl\:inset-x-4{left:1rem;right:1rem}.xl\:inset-x-5{left:1.25rem;right:1.25rem}.xl\:inset-x-6{left:1.5rem;right:1.5rem}.xl\:inset-x-7{left:1.75rem;right:1.75rem}.xl\:inset-x-8{left:2rem;right:2rem}.xl\:inset-x-9{left:2.25rem;right:2.25rem}.xl\:inset-x-10{left:2.5rem;right:2.5rem}.xl\:inset-x-11{left:2.75rem;right:2.75rem}.xl\:inset-x-12{left:3rem;right:3rem}.xl\:inset-x-14{left:3.5rem;right:3.5rem}.xl\:inset-x-16{left:4rem;right:4rem}.xl\:inset-x-20{left:5rem;right:5rem}.xl\:inset-x-24{left:6rem;right:6rem}.xl\:inset-x-28{left:7rem;right:7rem}.xl\:inset-x-32{left:8rem;right:8rem}.xl\:inset-x-36{left:9rem;right:9rem}.xl\:inset-x-40{left:10rem;right:10rem}.xl\:inset-x-44{left:11rem;right:11rem}.xl\:inset-x-48{left:12rem;right:12rem}.xl\:inset-x-52{left:13rem;right:13rem}.xl\:inset-x-56{left:14rem;right:14rem}.xl\:inset-x-60{left:15rem;right:15rem}.xl\:inset-x-64{left:16rem;right:16rem}.xl\:inset-x-72{left:18rem;right:18rem}.xl\:inset-x-80{left:20rem;right:20rem}.xl\:inset-x-96{left:24rem;right:24rem}.xl\:inset-x-auto{left:auto;right:auto}.xl\:inset-x-px{left:1px;right:1px}.xl\:inset-x-0\.5{left:.125rem;right:.125rem}.xl\:inset-x-1\.5{left:.375rem;right:.375rem}.xl\:inset-x-2\.5{left:.625rem;right:.625rem}.xl\:inset-x-3\.5{left:.875rem;right:.875rem}.xl\:-inset-x-0{left:0;right:0}.xl\:-inset-x-1{left:-.25rem;right:-.25rem}.xl\:-inset-x-2{left:-.5rem;right:-.5rem}.xl\:-inset-x-3{left:-.75rem;right:-.75rem}.xl\:-inset-x-4{left:-1rem;right:-1rem}.xl\:-inset-x-5{left:-1.25rem;right:-1.25rem}.xl\:-inset-x-6{left:-1.5rem;right:-1.5rem}.xl\:-inset-x-7{left:-1.75rem;right:-1.75rem}.xl\:-inset-x-8{left:-2rem;right:-2rem}.xl\:-inset-x-9{left:-2.25rem;right:-2.25rem}.xl\:-inset-x-10{left:-2.5rem;right:-2.5rem}.xl\:-inset-x-11{left:-2.75rem;right:-2.75rem}.xl\:-inset-x-12{left:-3rem;right:-3rem}.xl\:-inset-x-14{left:-3.5rem;right:-3.5rem}.xl\:-inset-x-16{left:-4rem;right:-4rem}.xl\:-inset-x-20{left:-5rem;right:-5rem}.xl\:-inset-x-24{left:-6rem;right:-6rem}.xl\:-inset-x-28{left:-7rem;right:-7rem}.xl\:-inset-x-32{left:-8rem;right:-8rem}.xl\:-inset-x-36{left:-9rem;right:-9rem}.xl\:-inset-x-40{left:-10rem;right:-10rem}.xl\:-inset-x-44{left:-11rem;right:-11rem}.xl\:-inset-x-48{left:-12rem;right:-12rem}.xl\:-inset-x-52{left:-13rem;right:-13rem}.xl\:-inset-x-56{left:-14rem;right:-14rem}.xl\:-inset-x-60{left:-15rem;right:-15rem}.xl\:-inset-x-64{left:-16rem;right:-16rem}.xl\:-inset-x-72{left:-18rem;right:-18rem}.xl\:-inset-x-80{left:-20rem;right:-20rem}.xl\:-inset-x-96{left:-24rem;right:-24rem}.xl\:-inset-x-px{left:-1px;right:-1px}.xl\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.xl\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.xl\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.xl\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.xl\:inset-x-1\/2{left:50%;right:50%}.xl\:inset-x-1\/3{left:33.333333%;right:33.333333%}.xl\:inset-x-2\/3{left:66.666667%;right:66.666667%}.xl\:inset-x-1\/4{left:25%;right:25%}.xl\:inset-x-2\/4{left:50%;right:50%}.xl\:inset-x-3\/4{left:75%;right:75%}.xl\:inset-x-full{left:100%;right:100%}.xl\:-inset-x-1\/2{left:-50%;right:-50%}.xl\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.xl\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.xl\:-inset-x-1\/4{left:-25%;right:-25%}.xl\:-inset-x-2\/4{left:-50%;right:-50%}.xl\:-inset-x-3\/4{left:-75%;right:-75%}.xl\:-inset-x-full{left:-100%;right:-100%}.xl\:inset-y-0{top:0;bottom:0}.xl\:inset-y-1{top:.25rem;bottom:.25rem}.xl\:inset-y-2{top:.5rem;bottom:.5rem}.xl\:inset-y-3{top:.75rem;bottom:.75rem}.xl\:inset-y-4{top:1rem;bottom:1rem}.xl\:inset-y-5{top:1.25rem;bottom:1.25rem}.xl\:inset-y-6{top:1.5rem;bottom:1.5rem}.xl\:inset-y-7{top:1.75rem;bottom:1.75rem}.xl\:inset-y-8{top:2rem;bottom:2rem}.xl\:inset-y-9{top:2.25rem;bottom:2.25rem}.xl\:inset-y-10{top:2.5rem;bottom:2.5rem}.xl\:inset-y-11{top:2.75rem;bottom:2.75rem}.xl\:inset-y-12{top:3rem;bottom:3rem}.xl\:inset-y-14{top:3.5rem;bottom:3.5rem}.xl\:inset-y-16{top:4rem;bottom:4rem}.xl\:inset-y-20{top:5rem;bottom:5rem}.xl\:inset-y-24{top:6rem;bottom:6rem}.xl\:inset-y-28{top:7rem;bottom:7rem}.xl\:inset-y-32{top:8rem;bottom:8rem}.xl\:inset-y-36{top:9rem;bottom:9rem}.xl\:inset-y-40{top:10rem;bottom:10rem}.xl\:inset-y-44{top:11rem;bottom:11rem}.xl\:inset-y-48{top:12rem;bottom:12rem}.xl\:inset-y-52{top:13rem;bottom:13rem}.xl\:inset-y-56{top:14rem;bottom:14rem}.xl\:inset-y-60{top:15rem;bottom:15rem}.xl\:inset-y-64{top:16rem;bottom:16rem}.xl\:inset-y-72{top:18rem;bottom:18rem}.xl\:inset-y-80{top:20rem;bottom:20rem}.xl\:inset-y-96{top:24rem;bottom:24rem}.xl\:inset-y-auto{top:auto;bottom:auto}.xl\:inset-y-px{top:1px;bottom:1px}.xl\:inset-y-0\.5{top:.125rem;bottom:.125rem}.xl\:inset-y-1\.5{top:.375rem;bottom:.375rem}.xl\:inset-y-2\.5{top:.625rem;bottom:.625rem}.xl\:inset-y-3\.5{top:.875rem;bottom:.875rem}.xl\:-inset-y-0{top:0;bottom:0}.xl\:-inset-y-1{top:-.25rem;bottom:-.25rem}.xl\:-inset-y-2{top:-.5rem;bottom:-.5rem}.xl\:-inset-y-3{top:-.75rem;bottom:-.75rem}.xl\:-inset-y-4{top:-1rem;bottom:-1rem}.xl\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.xl\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.xl\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.xl\:-inset-y-8{top:-2rem;bottom:-2rem}.xl\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.xl\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.xl\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.xl\:-inset-y-12{top:-3rem;bottom:-3rem}.xl\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.xl\:-inset-y-16{top:-4rem;bottom:-4rem}.xl\:-inset-y-20{top:-5rem;bottom:-5rem}.xl\:-inset-y-24{top:-6rem;bottom:-6rem}.xl\:-inset-y-28{top:-7rem;bottom:-7rem}.xl\:-inset-y-32{top:-8rem;bottom:-8rem}.xl\:-inset-y-36{top:-9rem;bottom:-9rem}.xl\:-inset-y-40{top:-10rem;bottom:-10rem}.xl\:-inset-y-44{top:-11rem;bottom:-11rem}.xl\:-inset-y-48{top:-12rem;bottom:-12rem}.xl\:-inset-y-52{top:-13rem;bottom:-13rem}.xl\:-inset-y-56{top:-14rem;bottom:-14rem}.xl\:-inset-y-60{top:-15rem;bottom:-15rem}.xl\:-inset-y-64{top:-16rem;bottom:-16rem}.xl\:-inset-y-72{top:-18rem;bottom:-18rem}.xl\:-inset-y-80{top:-20rem;bottom:-20rem}.xl\:-inset-y-96{top:-24rem;bottom:-24rem}.xl\:-inset-y-px{top:-1px;bottom:-1px}.xl\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.xl\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.xl\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.xl\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.xl\:inset-y-1\/2{top:50%;bottom:50%}.xl\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.xl\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.xl\:inset-y-1\/4{top:25%;bottom:25%}.xl\:inset-y-2\/4{top:50%;bottom:50%}.xl\:inset-y-3\/4{top:75%;bottom:75%}.xl\:inset-y-full{top:100%;bottom:100%}.xl\:-inset-y-1\/2{top:-50%;bottom:-50%}.xl\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.xl\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.xl\:-inset-y-1\/4{top:-25%;bottom:-25%}.xl\:-inset-y-2\/4{top:-50%;bottom:-50%}.xl\:-inset-y-3\/4{top:-75%;bottom:-75%}.xl\:-inset-y-full{top:-100%;bottom:-100%}.xl\:top-0{top:0}.xl\:top-1{top:.25rem}.xl\:top-2{top:.5rem}.xl\:top-3{top:.75rem}.xl\:top-4{top:1rem}.xl\:top-5{top:1.25rem}.xl\:top-6{top:1.5rem}.xl\:top-7{top:1.75rem}.xl\:top-8{top:2rem}.xl\:top-9{top:2.25rem}.xl\:top-10{top:2.5rem}.xl\:top-11{top:2.75rem}.xl\:top-12{top:3rem}.xl\:top-14{top:3.5rem}.xl\:top-16{top:4rem}.xl\:top-20{top:5rem}.xl\:top-24{top:6rem}.xl\:top-28{top:7rem}.xl\:top-32{top:8rem}.xl\:top-36{top:9rem}.xl\:top-40{top:10rem}.xl\:top-44{top:11rem}.xl\:top-48{top:12rem}.xl\:top-52{top:13rem}.xl\:top-56{top:14rem}.xl\:top-60{top:15rem}.xl\:top-64{top:16rem}.xl\:top-72{top:18rem}.xl\:top-80{top:20rem}.xl\:top-96{top:24rem}.xl\:top-auto{top:auto}.xl\:top-px{top:1px}.xl\:top-0\.5{top:.125rem}.xl\:top-1\.5{top:.375rem}.xl\:top-2\.5{top:.625rem}.xl\:top-3\.5{top:.875rem}.xl\:-top-0{top:0}.xl\:-top-1{top:-.25rem}.xl\:-top-2{top:-.5rem}.xl\:-top-3{top:-.75rem}.xl\:-top-4{top:-1rem}.xl\:-top-5{top:-1.25rem}.xl\:-top-6{top:-1.5rem}.xl\:-top-7{top:-1.75rem}.xl\:-top-8{top:-2rem}.xl\:-top-9{top:-2.25rem}.xl\:-top-10{top:-2.5rem}.xl\:-top-11{top:-2.75rem}.xl\:-top-12{top:-3rem}.xl\:-top-14{top:-3.5rem}.xl\:-top-16{top:-4rem}.xl\:-top-20{top:-5rem}.xl\:-top-24{top:-6rem}.xl\:-top-28{top:-7rem}.xl\:-top-32{top:-8rem}.xl\:-top-36{top:-9rem}.xl\:-top-40{top:-10rem}.xl\:-top-44{top:-11rem}.xl\:-top-48{top:-12rem}.xl\:-top-52{top:-13rem}.xl\:-top-56{top:-14rem}.xl\:-top-60{top:-15rem}.xl\:-top-64{top:-16rem}.xl\:-top-72{top:-18rem}.xl\:-top-80{top:-20rem}.xl\:-top-96{top:-24rem}.xl\:-top-px{top:-1px}.xl\:-top-0\.5{top:-.125rem}.xl\:-top-1\.5{top:-.375rem}.xl\:-top-2\.5{top:-.625rem}.xl\:-top-3\.5{top:-.875rem}.xl\:top-1\/2{top:50%}.xl\:top-1\/3{top:33.333333%}.xl\:top-2\/3{top:66.666667%}.xl\:top-1\/4{top:25%}.xl\:top-2\/4{top:50%}.xl\:top-3\/4{top:75%}.xl\:top-full{top:100%}.xl\:-top-1\/2{top:-50%}.xl\:-top-1\/3{top:-33.333333%}.xl\:-top-2\/3{top:-66.666667%}.xl\:-top-1\/4{top:-25%}.xl\:-top-2\/4{top:-50%}.xl\:-top-3\/4{top:-75%}.xl\:-top-full{top:-100%}.xl\:right-0{right:0}.xl\:right-1{right:.25rem}.xl\:right-2{right:.5rem}.xl\:right-3{right:.75rem}.xl\:right-4{right:1rem}.xl\:right-5{right:1.25rem}.xl\:right-6{right:1.5rem}.xl\:right-7{right:1.75rem}.xl\:right-8{right:2rem}.xl\:right-9{right:2.25rem}.xl\:right-10{right:2.5rem}.xl\:right-11{right:2.75rem}.xl\:right-12{right:3rem}.xl\:right-14{right:3.5rem}.xl\:right-16{right:4rem}.xl\:right-20{right:5rem}.xl\:right-24{right:6rem}.xl\:right-28{right:7rem}.xl\:right-32{right:8rem}.xl\:right-36{right:9rem}.xl\:right-40{right:10rem}.xl\:right-44{right:11rem}.xl\:right-48{right:12rem}.xl\:right-52{right:13rem}.xl\:right-56{right:14rem}.xl\:right-60{right:15rem}.xl\:right-64{right:16rem}.xl\:right-72{right:18rem}.xl\:right-80{right:20rem}.xl\:right-96{right:24rem}.xl\:right-auto{right:auto}.xl\:right-px{right:1px}.xl\:right-0\.5{right:.125rem}.xl\:right-1\.5{right:.375rem}.xl\:right-2\.5{right:.625rem}.xl\:right-3\.5{right:.875rem}.xl\:-right-0{right:0}.xl\:-right-1{right:-.25rem}.xl\:-right-2{right:-.5rem}.xl\:-right-3{right:-.75rem}.xl\:-right-4{right:-1rem}.xl\:-right-5{right:-1.25rem}.xl\:-right-6{right:-1.5rem}.xl\:-right-7{right:-1.75rem}.xl\:-right-8{right:-2rem}.xl\:-right-9{right:-2.25rem}.xl\:-right-10{right:-2.5rem}.xl\:-right-11{right:-2.75rem}.xl\:-right-12{right:-3rem}.xl\:-right-14{right:-3.5rem}.xl\:-right-16{right:-4rem}.xl\:-right-20{right:-5rem}.xl\:-right-24{right:-6rem}.xl\:-right-28{right:-7rem}.xl\:-right-32{right:-8rem}.xl\:-right-36{right:-9rem}.xl\:-right-40{right:-10rem}.xl\:-right-44{right:-11rem}.xl\:-right-48{right:-12rem}.xl\:-right-52{right:-13rem}.xl\:-right-56{right:-14rem}.xl\:-right-60{right:-15rem}.xl\:-right-64{right:-16rem}.xl\:-right-72{right:-18rem}.xl\:-right-80{right:-20rem}.xl\:-right-96{right:-24rem}.xl\:-right-px{right:-1px}.xl\:-right-0\.5{right:-.125rem}.xl\:-right-1\.5{right:-.375rem}.xl\:-right-2\.5{right:-.625rem}.xl\:-right-3\.5{right:-.875rem}.xl\:right-1\/2{right:50%}.xl\:right-1\/3{right:33.333333%}.xl\:right-2\/3{right:66.666667%}.xl\:right-1\/4{right:25%}.xl\:right-2\/4{right:50%}.xl\:right-3\/4{right:75%}.xl\:right-full{right:100%}.xl\:-right-1\/2{right:-50%}.xl\:-right-1\/3{right:-33.333333%}.xl\:-right-2\/3{right:-66.666667%}.xl\:-right-1\/4{right:-25%}.xl\:-right-2\/4{right:-50%}.xl\:-right-3\/4{right:-75%}.xl\:-right-full{right:-100%}.xl\:bottom-0{bottom:0}.xl\:bottom-1{bottom:.25rem}.xl\:bottom-2{bottom:.5rem}.xl\:bottom-3{bottom:.75rem}.xl\:bottom-4{bottom:1rem}.xl\:bottom-5{bottom:1.25rem}.xl\:bottom-6{bottom:1.5rem}.xl\:bottom-7{bottom:1.75rem}.xl\:bottom-8{bottom:2rem}.xl\:bottom-9{bottom:2.25rem}.xl\:bottom-10{bottom:2.5rem}.xl\:bottom-11{bottom:2.75rem}.xl\:bottom-12{bottom:3rem}.xl\:bottom-14{bottom:3.5rem}.xl\:bottom-16{bottom:4rem}.xl\:bottom-20{bottom:5rem}.xl\:bottom-24{bottom:6rem}.xl\:bottom-28{bottom:7rem}.xl\:bottom-32{bottom:8rem}.xl\:bottom-36{bottom:9rem}.xl\:bottom-40{bottom:10rem}.xl\:bottom-44{bottom:11rem}.xl\:bottom-48{bottom:12rem}.xl\:bottom-52{bottom:13rem}.xl\:bottom-56{bottom:14rem}.xl\:bottom-60{bottom:15rem}.xl\:bottom-64{bottom:16rem}.xl\:bottom-72{bottom:18rem}.xl\:bottom-80{bottom:20rem}.xl\:bottom-96{bottom:24rem}.xl\:bottom-auto{bottom:auto}.xl\:bottom-px{bottom:1px}.xl\:bottom-0\.5{bottom:.125rem}.xl\:bottom-1\.5{bottom:.375rem}.xl\:bottom-2\.5{bottom:.625rem}.xl\:bottom-3\.5{bottom:.875rem}.xl\:-bottom-0{bottom:0}.xl\:-bottom-1{bottom:-.25rem}.xl\:-bottom-2{bottom:-.5rem}.xl\:-bottom-3{bottom:-.75rem}.xl\:-bottom-4{bottom:-1rem}.xl\:-bottom-5{bottom:-1.25rem}.xl\:-bottom-6{bottom:-1.5rem}.xl\:-bottom-7{bottom:-1.75rem}.xl\:-bottom-8{bottom:-2rem}.xl\:-bottom-9{bottom:-2.25rem}.xl\:-bottom-10{bottom:-2.5rem}.xl\:-bottom-11{bottom:-2.75rem}.xl\:-bottom-12{bottom:-3rem}.xl\:-bottom-14{bottom:-3.5rem}.xl\:-bottom-16{bottom:-4rem}.xl\:-bottom-20{bottom:-5rem}.xl\:-bottom-24{bottom:-6rem}.xl\:-bottom-28{bottom:-7rem}.xl\:-bottom-32{bottom:-8rem}.xl\:-bottom-36{bottom:-9rem}.xl\:-bottom-40{bottom:-10rem}.xl\:-bottom-44{bottom:-11rem}.xl\:-bottom-48{bottom:-12rem}.xl\:-bottom-52{bottom:-13rem}.xl\:-bottom-56{bottom:-14rem}.xl\:-bottom-60{bottom:-15rem}.xl\:-bottom-64{bottom:-16rem}.xl\:-bottom-72{bottom:-18rem}.xl\:-bottom-80{bottom:-20rem}.xl\:-bottom-96{bottom:-24rem}.xl\:-bottom-px{bottom:-1px}.xl\:-bottom-0\.5{bottom:-.125rem}.xl\:-bottom-1\.5{bottom:-.375rem}.xl\:-bottom-2\.5{bottom:-.625rem}.xl\:-bottom-3\.5{bottom:-.875rem}.xl\:bottom-1\/2{bottom:50%}.xl\:bottom-1\/3{bottom:33.333333%}.xl\:bottom-2\/3{bottom:66.666667%}.xl\:bottom-1\/4{bottom:25%}.xl\:bottom-2\/4{bottom:50%}.xl\:bottom-3\/4{bottom:75%}.xl\:bottom-full{bottom:100%}.xl\:-bottom-1\/2{bottom:-50%}.xl\:-bottom-1\/3{bottom:-33.333333%}.xl\:-bottom-2\/3{bottom:-66.666667%}.xl\:-bottom-1\/4{bottom:-25%}.xl\:-bottom-2\/4{bottom:-50%}.xl\:-bottom-3\/4{bottom:-75%}.xl\:-bottom-full{bottom:-100%}.xl\:left-0{left:0}.xl\:left-1{left:.25rem}.xl\:left-2{left:.5rem}.xl\:left-3{left:.75rem}.xl\:left-4{left:1rem}.xl\:left-5{left:1.25rem}.xl\:left-6{left:1.5rem}.xl\:left-7{left:1.75rem}.xl\:left-8{left:2rem}.xl\:left-9{left:2.25rem}.xl\:left-10{left:2.5rem}.xl\:left-11{left:2.75rem}.xl\:left-12{left:3rem}.xl\:left-14{left:3.5rem}.xl\:left-16{left:4rem}.xl\:left-20{left:5rem}.xl\:left-24{left:6rem}.xl\:left-28{left:7rem}.xl\:left-32{left:8rem}.xl\:left-36{left:9rem}.xl\:left-40{left:10rem}.xl\:left-44{left:11rem}.xl\:left-48{left:12rem}.xl\:left-52{left:13rem}.xl\:left-56{left:14rem}.xl\:left-60{left:15rem}.xl\:left-64{left:16rem}.xl\:left-72{left:18rem}.xl\:left-80{left:20rem}.xl\:left-96{left:24rem}.xl\:left-auto{left:auto}.xl\:left-px{left:1px}.xl\:left-0\.5{left:.125rem}.xl\:left-1\.5{left:.375rem}.xl\:left-2\.5{left:.625rem}.xl\:left-3\.5{left:.875rem}.xl\:-left-0{left:0}.xl\:-left-1{left:-.25rem}.xl\:-left-2{left:-.5rem}.xl\:-left-3{left:-.75rem}.xl\:-left-4{left:-1rem}.xl\:-left-5{left:-1.25rem}.xl\:-left-6{left:-1.5rem}.xl\:-left-7{left:-1.75rem}.xl\:-left-8{left:-2rem}.xl\:-left-9{left:-2.25rem}.xl\:-left-10{left:-2.5rem}.xl\:-left-11{left:-2.75rem}.xl\:-left-12{left:-3rem}.xl\:-left-14{left:-3.5rem}.xl\:-left-16{left:-4rem}.xl\:-left-20{left:-5rem}.xl\:-left-24{left:-6rem}.xl\:-left-28{left:-7rem}.xl\:-left-32{left:-8rem}.xl\:-left-36{left:-9rem}.xl\:-left-40{left:-10rem}.xl\:-left-44{left:-11rem}.xl\:-left-48{left:-12rem}.xl\:-left-52{left:-13rem}.xl\:-left-56{left:-14rem}.xl\:-left-60{left:-15rem}.xl\:-left-64{left:-16rem}.xl\:-left-72{left:-18rem}.xl\:-left-80{left:-20rem}.xl\:-left-96{left:-24rem}.xl\:-left-px{left:-1px}.xl\:-left-0\.5{left:-.125rem}.xl\:-left-1\.5{left:-.375rem}.xl\:-left-2\.5{left:-.625rem}.xl\:-left-3\.5{left:-.875rem}.xl\:left-1\/2{left:50%}.xl\:left-1\/3{left:33.333333%}.xl\:left-2\/3{left:66.666667%}.xl\:left-1\/4{left:25%}.xl\:left-2\/4{left:50%}.xl\:left-3\/4{left:75%}.xl\:left-full{left:100%}.xl\:-left-1\/2{left:-50%}.xl\:-left-1\/3{left:-33.333333%}.xl\:-left-2\/3{left:-66.666667%}.xl\:-left-1\/4{left:-25%}.xl\:-left-2\/4{left:-50%}.xl\:-left-3\/4{left:-75%}.xl\:-left-full{left:-100%}.xl\:isolate{isolation:isolate}.xl\:isolation-auto{isolation:auto}.xl\:z-0{z-index:0}.xl\:z-10{z-index:10}.xl\:z-20{z-index:20}.xl\:z-30{z-index:30}.xl\:z-40{z-index:40}.xl\:z-50{z-index:50}.xl\:z-auto{z-index:auto}.xl\:focus-within\:z-0:focus-within{z-index:0}.xl\:focus-within\:z-10:focus-within{z-index:10}.xl\:focus-within\:z-20:focus-within{z-index:20}.xl\:focus-within\:z-30:focus-within{z-index:30}.xl\:focus-within\:z-40:focus-within{z-index:40}.xl\:focus-within\:z-50:focus-within{z-index:50}.xl\:focus-within\:z-auto:focus-within{z-index:auto}.xl\:focus\:z-0:focus{z-index:0}.xl\:focus\:z-10:focus{z-index:10}.xl\:focus\:z-20:focus{z-index:20}.xl\:focus\:z-30:focus{z-index:30}.xl\:focus\:z-40:focus{z-index:40}.xl\:focus\:z-50:focus{z-index:50}.xl\:focus\:z-auto:focus{z-index:auto}.xl\:order-1{order:1}.xl\:order-2{order:2}.xl\:order-3{order:3}.xl\:order-4{order:4}.xl\:order-5{order:5}.xl\:order-6{order:6}.xl\:order-7{order:7}.xl\:order-8{order:8}.xl\:order-9{order:9}.xl\:order-10{order:10}.xl\:order-11{order:11}.xl\:order-12{order:12}.xl\:order-first{order:-9999}.xl\:order-last{order:9999}.xl\:order-none{order:0}.xl\:col-auto{grid-column:auto}.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:col-span-9{grid-column:span 9/span 9}.xl\:col-span-10{grid-column:span 10/span 10}.xl\:col-span-11{grid-column:span 11/span 11}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:col-start-3{grid-column-start:3}.xl\:col-start-4{grid-column-start:4}.xl\:col-start-5{grid-column-start:5}.xl\:col-start-6{grid-column-start:6}.xl\:col-start-7{grid-column-start:7}.xl\:col-start-8{grid-column-start:8}.xl\:col-start-9{grid-column-start:9}.xl\:col-start-10{grid-column-start:10}.xl\:col-start-11{grid-column-start:11}.xl\:col-start-12{grid-column-start:12}.xl\:col-start-13{grid-column-start:13}.xl\:col-start-auto{grid-column-start:auto}.xl\:col-end-1{grid-column-end:1}.xl\:col-end-2{grid-column-end:2}.xl\:col-end-3{grid-column-end:3}.xl\:col-end-4{grid-column-end:4}.xl\:col-end-5{grid-column-end:5}.xl\:col-end-6{grid-column-end:6}.xl\:col-end-7{grid-column-end:7}.xl\:col-end-8{grid-column-end:8}.xl\:col-end-9{grid-column-end:9}.xl\:col-end-10{grid-column-end:10}.xl\:col-end-11{grid-column-end:11}.xl\:col-end-12{grid-column-end:12}.xl\:col-end-13{grid-column-end:13}.xl\:col-end-auto{grid-column-end:auto}.xl\:row-auto{grid-row:auto}.xl\:row-span-1{grid-row:span 1/span 1}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-span-3{grid-row:span 3/span 3}.xl\:row-span-4{grid-row:span 4/span 4}.xl\:row-span-5{grid-row:span 5/span 5}.xl\:row-span-6{grid-row:span 6/span 6}.xl\:row-span-full{grid-row:1/-1}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:row-start-3{grid-row-start:3}.xl\:row-start-4{grid-row-start:4}.xl\:row-start-5{grid-row-start:5}.xl\:row-start-6{grid-row-start:6}.xl\:row-start-7{grid-row-start:7}.xl\:row-start-auto{grid-row-start:auto}.xl\:row-end-1{grid-row-end:1}.xl\:row-end-2{grid-row-end:2}.xl\:row-end-3{grid-row-end:3}.xl\:row-end-4{grid-row-end:4}.xl\:row-end-5{grid-row-end:5}.xl\:row-end-6{grid-row-end:6}.xl\:row-end-7{grid-row-end:7}.xl\:row-end-auto{grid-row-end:auto}.xl\:float-right{float:right}.xl\:float-left{float:left}.xl\:float-none{float:none}.xl\:clear-left{clear:left}.xl\:clear-right{clear:right}.xl\:clear-both{clear:both}.xl\:clear-none{clear:none}.xl\:m-0{margin:0}.xl\:m-1{margin:.25rem}.xl\:m-2{margin:.5rem}.xl\:m-3{margin:.75rem}.xl\:m-4{margin:1rem}.xl\:m-5{margin:1.25rem}.xl\:m-6{margin:1.5rem}.xl\:m-7{margin:1.75rem}.xl\:m-8{margin:2rem}.xl\:m-9{margin:2.25rem}.xl\:m-10{margin:2.5rem}.xl\:m-11{margin:2.75rem}.xl\:m-12{margin:3rem}.xl\:m-14{margin:3.5rem}.xl\:m-16{margin:4rem}.xl\:m-20{margin:5rem}.xl\:m-24{margin:6rem}.xl\:m-28{margin:7rem}.xl\:m-32{margin:8rem}.xl\:m-36{margin:9rem}.xl\:m-40{margin:10rem}.xl\:m-44{margin:11rem}.xl\:m-48{margin:12rem}.xl\:m-52{margin:13rem}.xl\:m-56{margin:14rem}.xl\:m-60{margin:15rem}.xl\:m-64{margin:16rem}.xl\:m-72{margin:18rem}.xl\:m-80{margin:20rem}.xl\:m-96{margin:24rem}.xl\:m-auto{margin:auto}.xl\:m-px{margin:1px}.xl\:m-0\.5{margin:.125rem}.xl\:m-1\.5{margin:.375rem}.xl\:m-2\.5{margin:.625rem}.xl\:m-3\.5{margin:.875rem}.xl\:-m-0{margin:0}.xl\:-m-1{margin:-.25rem}.xl\:-m-2{margin:-.5rem}.xl\:-m-3{margin:-.75rem}.xl\:-m-4{margin:-1rem}.xl\:-m-5{margin:-1.25rem}.xl\:-m-6{margin:-1.5rem}.xl\:-m-7{margin:-1.75rem}.xl\:-m-8{margin:-2rem}.xl\:-m-9{margin:-2.25rem}.xl\:-m-10{margin:-2.5rem}.xl\:-m-11{margin:-2.75rem}.xl\:-m-12{margin:-3rem}.xl\:-m-14{margin:-3.5rem}.xl\:-m-16{margin:-4rem}.xl\:-m-20{margin:-5rem}.xl\:-m-24{margin:-6rem}.xl\:-m-28{margin:-7rem}.xl\:-m-32{margin:-8rem}.xl\:-m-36{margin:-9rem}.xl\:-m-40{margin:-10rem}.xl\:-m-44{margin:-11rem}.xl\:-m-48{margin:-12rem}.xl\:-m-52{margin:-13rem}.xl\:-m-56{margin:-14rem}.xl\:-m-60{margin:-15rem}.xl\:-m-64{margin:-16rem}.xl\:-m-72{margin:-18rem}.xl\:-m-80{margin:-20rem}.xl\:-m-96{margin:-24rem}.xl\:-m-px{margin:-1px}.xl\:-m-0\.5{margin:-.125rem}.xl\:-m-1\.5{margin:-.375rem}.xl\:-m-2\.5{margin:-.625rem}.xl\:-m-3\.5{margin:-.875rem}.xl\:mx-0{margin-left:0;margin-right:0}.xl\:mx-1{margin-left:.25rem;margin-right:.25rem}.xl\:mx-2{margin-left:.5rem;margin-right:.5rem}.xl\:mx-3{margin-left:.75rem;margin-right:.75rem}.xl\:mx-4{margin-left:1rem;margin-right:1rem}.xl\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.xl\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mx-8{margin-left:2rem;margin-right:2rem}.xl\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.xl\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.xl\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.xl\:mx-12{margin-left:3rem;margin-right:3rem}.xl\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.xl\:mx-16{margin-left:4rem;margin-right:4rem}.xl\:mx-20{margin-left:5rem;margin-right:5rem}.xl\:mx-24{margin-left:6rem;margin-right:6rem}.xl\:mx-28{margin-left:7rem;margin-right:7rem}.xl\:mx-32{margin-left:8rem;margin-right:8rem}.xl\:mx-36{margin-left:9rem;margin-right:9rem}.xl\:mx-40{margin-left:10rem;margin-right:10rem}.xl\:mx-44{margin-left:11rem;margin-right:11rem}.xl\:mx-48{margin-left:12rem;margin-right:12rem}.xl\:mx-52{margin-left:13rem;margin-right:13rem}.xl\:mx-56{margin-left:14rem;margin-right:14rem}.xl\:mx-60{margin-left:15rem;margin-right:15rem}.xl\:mx-64{margin-left:16rem;margin-right:16rem}.xl\:mx-72{margin-left:18rem;margin-right:18rem}.xl\:mx-80{margin-left:20rem;margin-right:20rem}.xl\:mx-96{margin-left:24rem;margin-right:24rem}.xl\:mx-auto{margin-left:auto;margin-right:auto}.xl\:mx-px{margin-left:1px;margin-right:1px}.xl\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.xl\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.xl\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.xl\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.xl\:-mx-0{margin-left:0;margin-right:0}.xl\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.xl\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.xl\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.xl\:-mx-4{margin-left:-1rem;margin-right:-1rem}.xl\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.xl\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.xl\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.xl\:-mx-8{margin-left:-2rem;margin-right:-2rem}.xl\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.xl\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.xl\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.xl\:-mx-12{margin-left:-3rem;margin-right:-3rem}.xl\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.xl\:-mx-16{margin-left:-4rem;margin-right:-4rem}.xl\:-mx-20{margin-left:-5rem;margin-right:-5rem}.xl\:-mx-24{margin-left:-6rem;margin-right:-6rem}.xl\:-mx-28{margin-left:-7rem;margin-right:-7rem}.xl\:-mx-32{margin-left:-8rem;margin-right:-8rem}.xl\:-mx-36{margin-left:-9rem;margin-right:-9rem}.xl\:-mx-40{margin-left:-10rem;margin-right:-10rem}.xl\:-mx-44{margin-left:-11rem;margin-right:-11rem}.xl\:-mx-48{margin-left:-12rem;margin-right:-12rem}.xl\:-mx-52{margin-left:-13rem;margin-right:-13rem}.xl\:-mx-56{margin-left:-14rem;margin-right:-14rem}.xl\:-mx-60{margin-left:-15rem;margin-right:-15rem}.xl\:-mx-64{margin-left:-16rem;margin-right:-16rem}.xl\:-mx-72{margin-left:-18rem;margin-right:-18rem}.xl\:-mx-80{margin-left:-20rem;margin-right:-20rem}.xl\:-mx-96{margin-left:-24rem;margin-right:-24rem}.xl\:-mx-px{margin-left:-1px;margin-right:-1px}.xl\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.xl\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.xl\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.xl\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.xl\:my-0{margin-top:0;margin-bottom:0}.xl\:my-1{margin-top:.25rem;margin-bottom:.25rem}.xl\:my-2{margin-top:.5rem;margin-bottom:.5rem}.xl\:my-3{margin-top:.75rem;margin-bottom:.75rem}.xl\:my-4{margin-top:1rem;margin-bottom:1rem}.xl\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.xl\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.xl\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.xl\:my-8{margin-top:2rem;margin-bottom:2rem}.xl\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.xl\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.xl\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.xl\:my-12{margin-top:3rem;margin-bottom:3rem}.xl\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.xl\:my-16{margin-top:4rem;margin-bottom:4rem}.xl\:my-20{margin-top:5rem;margin-bottom:5rem}.xl\:my-24{margin-top:6rem;margin-bottom:6rem}.xl\:my-28{margin-top:7rem;margin-bottom:7rem}.xl\:my-32{margin-top:8rem;margin-bottom:8rem}.xl\:my-36{margin-top:9rem;margin-bottom:9rem}.xl\:my-40{margin-top:10rem;margin-bottom:10rem}.xl\:my-44{margin-top:11rem;margin-bottom:11rem}.xl\:my-48{margin-top:12rem;margin-bottom:12rem}.xl\:my-52{margin-top:13rem;margin-bottom:13rem}.xl\:my-56{margin-top:14rem;margin-bottom:14rem}.xl\:my-60{margin-top:15rem;margin-bottom:15rem}.xl\:my-64{margin-top:16rem;margin-bottom:16rem}.xl\:my-72{margin-top:18rem;margin-bottom:18rem}.xl\:my-80{margin-top:20rem;margin-bottom:20rem}.xl\:my-96{margin-top:24rem;margin-bottom:24rem}.xl\:my-auto{margin-top:auto;margin-bottom:auto}.xl\:my-px{margin-top:1px;margin-bottom:1px}.xl\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.xl\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.xl\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.xl\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.xl\:-my-0{margin-top:0;margin-bottom:0}.xl\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.xl\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.xl\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.xl\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.xl\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.xl\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.xl\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.xl\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.xl\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.xl\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.xl\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.xl\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.xl\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.xl\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.xl\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.xl\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.xl\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.xl\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.xl\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.xl\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.xl\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.xl\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.xl\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.xl\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.xl\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.xl\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.xl\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.xl\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.xl\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.xl\:-my-px{margin-top:-1px;margin-bottom:-1px}.xl\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.xl\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.xl\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.xl\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.xl\:mt-0{margin-top:0}.xl\:mt-1{margin-top:.25rem}.xl\:mt-2{margin-top:.5rem}.xl\:mt-3{margin-top:.75rem}.xl\:mt-4{margin-top:1rem}.xl\:mt-5{margin-top:1.25rem}.xl\:mt-6{margin-top:1.5rem}.xl\:mt-7{margin-top:1.75rem}.xl\:mt-8{margin-top:2rem}.xl\:mt-9{margin-top:2.25rem}.xl\:mt-10{margin-top:2.5rem}.xl\:mt-11{margin-top:2.75rem}.xl\:mt-12{margin-top:3rem}.xl\:mt-14{margin-top:3.5rem}.xl\:mt-16{margin-top:4rem}.xl\:mt-20{margin-top:5rem}.xl\:mt-24{margin-top:6rem}.xl\:mt-28{margin-top:7rem}.xl\:mt-32{margin-top:8rem}.xl\:mt-36{margin-top:9rem}.xl\:mt-40{margin-top:10rem}.xl\:mt-44{margin-top:11rem}.xl\:mt-48{margin-top:12rem}.xl\:mt-52{margin-top:13rem}.xl\:mt-56{margin-top:14rem}.xl\:mt-60{margin-top:15rem}.xl\:mt-64{margin-top:16rem}.xl\:mt-72{margin-top:18rem}.xl\:mt-80{margin-top:20rem}.xl\:mt-96{margin-top:24rem}.xl\:mt-auto{margin-top:auto}.xl\:mt-px{margin-top:1px}.xl\:mt-0\.5{margin-top:.125rem}.xl\:mt-1\.5{margin-top:.375rem}.xl\:mt-2\.5{margin-top:.625rem}.xl\:mt-3\.5{margin-top:.875rem}.xl\:-mt-0{margin-top:0}.xl\:-mt-1{margin-top:-.25rem}.xl\:-mt-2{margin-top:-.5rem}.xl\:-mt-3{margin-top:-.75rem}.xl\:-mt-4{margin-top:-1rem}.xl\:-mt-5{margin-top:-1.25rem}.xl\:-mt-6{margin-top:-1.5rem}.xl\:-mt-7{margin-top:-1.75rem}.xl\:-mt-8{margin-top:-2rem}.xl\:-mt-9{margin-top:-2.25rem}.xl\:-mt-10{margin-top:-2.5rem}.xl\:-mt-11{margin-top:-2.75rem}.xl\:-mt-12{margin-top:-3rem}.xl\:-mt-14{margin-top:-3.5rem}.xl\:-mt-16{margin-top:-4rem}.xl\:-mt-20{margin-top:-5rem}.xl\:-mt-24{margin-top:-6rem}.xl\:-mt-28{margin-top:-7rem}.xl\:-mt-32{margin-top:-8rem}.xl\:-mt-36{margin-top:-9rem}.xl\:-mt-40{margin-top:-10rem}.xl\:-mt-44{margin-top:-11rem}.xl\:-mt-48{margin-top:-12rem}.xl\:-mt-52{margin-top:-13rem}.xl\:-mt-56{margin-top:-14rem}.xl\:-mt-60{margin-top:-15rem}.xl\:-mt-64{margin-top:-16rem}.xl\:-mt-72{margin-top:-18rem}.xl\:-mt-80{margin-top:-20rem}.xl\:-mt-96{margin-top:-24rem}.xl\:-mt-px{margin-top:-1px}.xl\:-mt-0\.5{margin-top:-.125rem}.xl\:-mt-1\.5{margin-top:-.375rem}.xl\:-mt-2\.5{margin-top:-.625rem}.xl\:-mt-3\.5{margin-top:-.875rem}.xl\:mr-0{margin-right:0}.xl\:mr-1{margin-right:.25rem}.xl\:mr-2{margin-right:.5rem}.xl\:mr-3{margin-right:.75rem}.xl\:mr-4{margin-right:1rem}.xl\:mr-5{margin-right:1.25rem}.xl\:mr-6{margin-right:1.5rem}.xl\:mr-7{margin-right:1.75rem}.xl\:mr-8{margin-right:2rem}.xl\:mr-9{margin-right:2.25rem}.xl\:mr-10{margin-right:2.5rem}.xl\:mr-11{margin-right:2.75rem}.xl\:mr-12{margin-right:3rem}.xl\:mr-14{margin-right:3.5rem}.xl\:mr-16{margin-right:4rem}.xl\:mr-20{margin-right:5rem}.xl\:mr-24{margin-right:6rem}.xl\:mr-28{margin-right:7rem}.xl\:mr-32{margin-right:8rem}.xl\:mr-36{margin-right:9rem}.xl\:mr-40{margin-right:10rem}.xl\:mr-44{margin-right:11rem}.xl\:mr-48{margin-right:12rem}.xl\:mr-52{margin-right:13rem}.xl\:mr-56{margin-right:14rem}.xl\:mr-60{margin-right:15rem}.xl\:mr-64{margin-right:16rem}.xl\:mr-72{margin-right:18rem}.xl\:mr-80{margin-right:20rem}.xl\:mr-96{margin-right:24rem}.xl\:mr-auto{margin-right:auto}.xl\:mr-px{margin-right:1px}.xl\:mr-0\.5{margin-right:.125rem}.xl\:mr-1\.5{margin-right:.375rem}.xl\:mr-2\.5{margin-right:.625rem}.xl\:mr-3\.5{margin-right:.875rem}.xl\:-mr-0{margin-right:0}.xl\:-mr-1{margin-right:-.25rem}.xl\:-mr-2{margin-right:-.5rem}.xl\:-mr-3{margin-right:-.75rem}.xl\:-mr-4{margin-right:-1rem}.xl\:-mr-5{margin-right:-1.25rem}.xl\:-mr-6{margin-right:-1.5rem}.xl\:-mr-7{margin-right:-1.75rem}.xl\:-mr-8{margin-right:-2rem}.xl\:-mr-9{margin-right:-2.25rem}.xl\:-mr-10{margin-right:-2.5rem}.xl\:-mr-11{margin-right:-2.75rem}.xl\:-mr-12{margin-right:-3rem}.xl\:-mr-14{margin-right:-3.5rem}.xl\:-mr-16{margin-right:-4rem}.xl\:-mr-20{margin-right:-5rem}.xl\:-mr-24{margin-right:-6rem}.xl\:-mr-28{margin-right:-7rem}.xl\:-mr-32{margin-right:-8rem}.xl\:-mr-36{margin-right:-9rem}.xl\:-mr-40{margin-right:-10rem}.xl\:-mr-44{margin-right:-11rem}.xl\:-mr-48{margin-right:-12rem}.xl\:-mr-52{margin-right:-13rem}.xl\:-mr-56{margin-right:-14rem}.xl\:-mr-60{margin-right:-15rem}.xl\:-mr-64{margin-right:-16rem}.xl\:-mr-72{margin-right:-18rem}.xl\:-mr-80{margin-right:-20rem}.xl\:-mr-96{margin-right:-24rem}.xl\:-mr-px{margin-right:-1px}.xl\:-mr-0\.5{margin-right:-.125rem}.xl\:-mr-1\.5{margin-right:-.375rem}.xl\:-mr-2\.5{margin-right:-.625rem}.xl\:-mr-3\.5{margin-right:-.875rem}.xl\:mb-0{margin-bottom:0}.xl\:mb-1{margin-bottom:.25rem}.xl\:mb-2{margin-bottom:.5rem}.xl\:mb-3{margin-bottom:.75rem}.xl\:mb-4{margin-bottom:1rem}.xl\:mb-5{margin-bottom:1.25rem}.xl\:mb-6{margin-bottom:1.5rem}.xl\:mb-7{margin-bottom:1.75rem}.xl\:mb-8{margin-bottom:2rem}.xl\:mb-9{margin-bottom:2.25rem}.xl\:mb-10{margin-bottom:2.5rem}.xl\:mb-11{margin-bottom:2.75rem}.xl\:mb-12{margin-bottom:3rem}.xl\:mb-14{margin-bottom:3.5rem}.xl\:mb-16{margin-bottom:4rem}.xl\:mb-20{margin-bottom:5rem}.xl\:mb-24{margin-bottom:6rem}.xl\:mb-28{margin-bottom:7rem}.xl\:mb-32{margin-bottom:8rem}.xl\:mb-36{margin-bottom:9rem}.xl\:mb-40{margin-bottom:10rem}.xl\:mb-44{margin-bottom:11rem}.xl\:mb-48{margin-bottom:12rem}.xl\:mb-52{margin-bottom:13rem}.xl\:mb-56{margin-bottom:14rem}.xl\:mb-60{margin-bottom:15rem}.xl\:mb-64{margin-bottom:16rem}.xl\:mb-72{margin-bottom:18rem}.xl\:mb-80{margin-bottom:20rem}.xl\:mb-96{margin-bottom:24rem}.xl\:mb-auto{margin-bottom:auto}.xl\:mb-px{margin-bottom:1px}.xl\:mb-0\.5{margin-bottom:.125rem}.xl\:mb-1\.5{margin-bottom:.375rem}.xl\:mb-2\.5{margin-bottom:.625rem}.xl\:mb-3\.5{margin-bottom:.875rem}.xl\:-mb-0{margin-bottom:0}.xl\:-mb-1{margin-bottom:-.25rem}.xl\:-mb-2{margin-bottom:-.5rem}.xl\:-mb-3{margin-bottom:-.75rem}.xl\:-mb-4{margin-bottom:-1rem}.xl\:-mb-5{margin-bottom:-1.25rem}.xl\:-mb-6{margin-bottom:-1.5rem}.xl\:-mb-7{margin-bottom:-1.75rem}.xl\:-mb-8{margin-bottom:-2rem}.xl\:-mb-9{margin-bottom:-2.25rem}.xl\:-mb-10{margin-bottom:-2.5rem}.xl\:-mb-11{margin-bottom:-2.75rem}.xl\:-mb-12{margin-bottom:-3rem}.xl\:-mb-14{margin-bottom:-3.5rem}.xl\:-mb-16{margin-bottom:-4rem}.xl\:-mb-20{margin-bottom:-5rem}.xl\:-mb-24{margin-bottom:-6rem}.xl\:-mb-28{margin-bottom:-7rem}.xl\:-mb-32{margin-bottom:-8rem}.xl\:-mb-36{margin-bottom:-9rem}.xl\:-mb-40{margin-bottom:-10rem}.xl\:-mb-44{margin-bottom:-11rem}.xl\:-mb-48{margin-bottom:-12rem}.xl\:-mb-52{margin-bottom:-13rem}.xl\:-mb-56{margin-bottom:-14rem}.xl\:-mb-60{margin-bottom:-15rem}.xl\:-mb-64{margin-bottom:-16rem}.xl\:-mb-72{margin-bottom:-18rem}.xl\:-mb-80{margin-bottom:-20rem}.xl\:-mb-96{margin-bottom:-24rem}.xl\:-mb-px{margin-bottom:-1px}.xl\:-mb-0\.5{margin-bottom:-.125rem}.xl\:-mb-1\.5{margin-bottom:-.375rem}.xl\:-mb-2\.5{margin-bottom:-.625rem}.xl\:-mb-3\.5{margin-bottom:-.875rem}.xl\:ml-0{margin-left:0}.xl\:ml-1{margin-left:.25rem}.xl\:ml-2{margin-left:.5rem}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-5{margin-left:1.25rem}.xl\:ml-6{margin-left:1.5rem}.xl\:ml-7{margin-left:1.75rem}.xl\:ml-8{margin-left:2rem}.xl\:ml-9{margin-left:2.25rem}.xl\:ml-10{margin-left:2.5rem}.xl\:ml-11{margin-left:2.75rem}.xl\:ml-12{margin-left:3rem}.xl\:ml-14{margin-left:3.5rem}.xl\:ml-16{margin-left:4rem}.xl\:ml-20{margin-left:5rem}.xl\:ml-24{margin-left:6rem}.xl\:ml-28{margin-left:7rem}.xl\:ml-32{margin-left:8rem}.xl\:ml-36{margin-left:9rem}.xl\:ml-40{margin-left:10rem}.xl\:ml-44{margin-left:11rem}.xl\:ml-48{margin-left:12rem}.xl\:ml-52{margin-left:13rem}.xl\:ml-56{margin-left:14rem}.xl\:ml-60{margin-left:15rem}.xl\:ml-64{margin-left:16rem}.xl\:ml-72{margin-left:18rem}.xl\:ml-80{margin-left:20rem}.xl\:ml-96{margin-left:24rem}.xl\:ml-auto{margin-left:auto}.xl\:ml-px{margin-left:1px}.xl\:ml-0\.5{margin-left:.125rem}.xl\:ml-1\.5{margin-left:.375rem}.xl\:ml-2\.5{margin-left:.625rem}.xl\:ml-3\.5{margin-left:.875rem}.xl\:-ml-0{margin-left:0}.xl\:-ml-1{margin-left:-.25rem}.xl\:-ml-2{margin-left:-.5rem}.xl\:-ml-3{margin-left:-.75rem}.xl\:-ml-4{margin-left:-1rem}.xl\:-ml-5{margin-left:-1.25rem}.xl\:-ml-6{margin-left:-1.5rem}.xl\:-ml-7{margin-left:-1.75rem}.xl\:-ml-8{margin-left:-2rem}.xl\:-ml-9{margin-left:-2.25rem}.xl\:-ml-10{margin-left:-2.5rem}.xl\:-ml-11{margin-left:-2.75rem}.xl\:-ml-12{margin-left:-3rem}.xl\:-ml-14{margin-left:-3.5rem}.xl\:-ml-16{margin-left:-4rem}.xl\:-ml-20{margin-left:-5rem}.xl\:-ml-24{margin-left:-6rem}.xl\:-ml-28{margin-left:-7rem}.xl\:-ml-32{margin-left:-8rem}.xl\:-ml-36{margin-left:-9rem}.xl\:-ml-40{margin-left:-10rem}.xl\:-ml-44{margin-left:-11rem}.xl\:-ml-48{margin-left:-12rem}.xl\:-ml-52{margin-left:-13rem}.xl\:-ml-56{margin-left:-14rem}.xl\:-ml-60{margin-left:-15rem}.xl\:-ml-64{margin-left:-16rem}.xl\:-ml-72{margin-left:-18rem}.xl\:-ml-80{margin-left:-20rem}.xl\:-ml-96{margin-left:-24rem}.xl\:-ml-px{margin-left:-1px}.xl\:-ml-0\.5{margin-left:-.125rem}.xl\:-ml-1\.5{margin-left:-.375rem}.xl\:-ml-2\.5{margin-left:-.625rem}.xl\:-ml-3\.5{margin-left:-.875rem}.xl\:box-border{box-sizing:border-box}.xl\:box-content{box-sizing:initial}.xl\:block{display:block}.xl\:inline-block{display:inline-block}.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:inline-flex{display:inline-flex}.xl\:table{display:table}.xl\:inline-table{display:inline-table}.xl\:table-caption{display:table-caption}.xl\:table-cell{display:table-cell}.xl\:table-column{display:table-column}.xl\:table-column-group{display:table-column-group}.xl\:table-footer-group{display:table-footer-group}.xl\:table-header-group{display:table-header-group}.xl\:table-row-group{display:table-row-group}.xl\:table-row{display:table-row}.xl\:flow-root{display:flow-root}.xl\:grid{display:grid}.xl\:inline-grid{display:inline-grid}.xl\:contents{display:contents}.xl\:list-item{display:list-item}.xl\:hidden{display:none}.xl\:h-0{height:0}.xl\:h-1{height:.25rem}.xl\:h-2{height:.5rem}.xl\:h-3{height:.75rem}.xl\:h-4{height:1rem}.xl\:h-5{height:1.25rem}.xl\:h-6{height:1.5rem}.xl\:h-7{height:1.75rem}.xl\:h-8{height:2rem}.xl\:h-9{height:2.25rem}.xl\:h-10{height:2.5rem}.xl\:h-11{height:2.75rem}.xl\:h-12{height:3rem}.xl\:h-14{height:3.5rem}.xl\:h-16{height:4rem}.xl\:h-20{height:5rem}.xl\:h-24{height:6rem}.xl\:h-28{height:7rem}.xl\:h-32{height:8rem}.xl\:h-36{height:9rem}.xl\:h-40{height:10rem}.xl\:h-44{height:11rem}.xl\:h-48{height:12rem}.xl\:h-52{height:13rem}.xl\:h-56{height:14rem}.xl\:h-60{height:15rem}.xl\:h-64{height:16rem}.xl\:h-72{height:18rem}.xl\:h-80{height:20rem}.xl\:h-96{height:24rem}.xl\:h-auto{height:auto}.xl\:h-px{height:1px}.xl\:h-0\.5{height:.125rem}.xl\:h-1\.5{height:.375rem}.xl\:h-2\.5{height:.625rem}.xl\:h-3\.5{height:.875rem}.xl\:h-1\/2{height:50%}.xl\:h-1\/3{height:33.333333%}.xl\:h-2\/3{height:66.666667%}.xl\:h-1\/4{height:25%}.xl\:h-2\/4{height:50%}.xl\:h-3\/4{height:75%}.xl\:h-1\/5{height:20%}.xl\:h-2\/5{height:40%}.xl\:h-3\/5{height:60%}.xl\:h-4\/5{height:80%}.xl\:h-1\/6{height:16.666667%}.xl\:h-2\/6{height:33.333333%}.xl\:h-3\/6{height:50%}.xl\:h-4\/6{height:66.666667%}.xl\:h-5\/6{height:83.333333%}.xl\:h-full{height:100%}.xl\:h-screen{height:100vh}.xl\:max-h-0{max-height:0}.xl\:max-h-1{max-height:.25rem}.xl\:max-h-2{max-height:.5rem}.xl\:max-h-3{max-height:.75rem}.xl\:max-h-4{max-height:1rem}.xl\:max-h-5{max-height:1.25rem}.xl\:max-h-6{max-height:1.5rem}.xl\:max-h-7{max-height:1.75rem}.xl\:max-h-8{max-height:2rem}.xl\:max-h-9{max-height:2.25rem}.xl\:max-h-10{max-height:2.5rem}.xl\:max-h-11{max-height:2.75rem}.xl\:max-h-12{max-height:3rem}.xl\:max-h-14{max-height:3.5rem}.xl\:max-h-16{max-height:4rem}.xl\:max-h-20{max-height:5rem}.xl\:max-h-24{max-height:6rem}.xl\:max-h-28{max-height:7rem}.xl\:max-h-32{max-height:8rem}.xl\:max-h-36{max-height:9rem}.xl\:max-h-40{max-height:10rem}.xl\:max-h-44{max-height:11rem}.xl\:max-h-48{max-height:12rem}.xl\:max-h-52{max-height:13rem}.xl\:max-h-56{max-height:14rem}.xl\:max-h-60{max-height:15rem}.xl\:max-h-64{max-height:16rem}.xl\:max-h-72{max-height:18rem}.xl\:max-h-80{max-height:20rem}.xl\:max-h-96{max-height:24rem}.xl\:max-h-px{max-height:1px}.xl\:max-h-0\.5{max-height:.125rem}.xl\:max-h-1\.5{max-height:.375rem}.xl\:max-h-2\.5{max-height:.625rem}.xl\:max-h-3\.5{max-height:.875rem}.xl\:max-h-full{max-height:100%}.xl\:max-h-screen{max-height:100vh}.xl\:min-h-0{min-height:0}.xl\:min-h-full{min-height:100%}.xl\:min-h-screen{min-height:100vh}.xl\:w-0{width:0}.xl\:w-1{width:.25rem}.xl\:w-2{width:.5rem}.xl\:w-3{width:.75rem}.xl\:w-4{width:1rem}.xl\:w-5{width:1.25rem}.xl\:w-6{width:1.5rem}.xl\:w-7{width:1.75rem}.xl\:w-8{width:2rem}.xl\:w-9{width:2.25rem}.xl\:w-10{width:2.5rem}.xl\:w-11{width:2.75rem}.xl\:w-12{width:3rem}.xl\:w-14{width:3.5rem}.xl\:w-16{width:4rem}.xl\:w-20{width:5rem}.xl\:w-24{width:6rem}.xl\:w-28{width:7rem}.xl\:w-32{width:8rem}.xl\:w-36{width:9rem}.xl\:w-40{width:10rem}.xl\:w-44{width:11rem}.xl\:w-48{width:12rem}.xl\:w-52{width:13rem}.xl\:w-56{width:14rem}.xl\:w-60{width:15rem}.xl\:w-64{width:16rem}.xl\:w-72{width:18rem}.xl\:w-80{width:20rem}.xl\:w-96{width:24rem}.xl\:w-auto{width:auto}.xl\:w-px{width:1px}.xl\:w-0\.5{width:.125rem}.xl\:w-1\.5{width:.375rem}.xl\:w-2\.5{width:.625rem}.xl\:w-3\.5{width:.875rem}.xl\:w-1\/2{width:50%}.xl\:w-1\/3{width:33.333333%}.xl\:w-2\/3{width:66.666667%}.xl\:w-1\/4{width:25%}.xl\:w-2\/4{width:50%}.xl\:w-3\/4{width:75%}.xl\:w-1\/5{width:20%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-4\/5{width:80%}.xl\:w-1\/6{width:16.666667%}.xl\:w-2\/6{width:33.333333%}.xl\:w-3\/6{width:50%}.xl\:w-4\/6{width:66.666667%}.xl\:w-5\/6{width:83.333333%}.xl\:w-1\/12{width:8.333333%}.xl\:w-2\/12{width:16.666667%}.xl\:w-3\/12{width:25%}.xl\:w-4\/12{width:33.333333%}.xl\:w-5\/12{width:41.666667%}.xl\:w-6\/12{width:50%}.xl\:w-7\/12{width:58.333333%}.xl\:w-8\/12{width:66.666667%}.xl\:w-9\/12{width:75%}.xl\:w-10\/12{width:83.333333%}.xl\:w-11\/12{width:91.666667%}.xl\:w-full{width:100%}.xl\:w-screen{width:100vw}.xl\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.xl\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.xl\:min-w-0{min-width:0}.xl\:min-w-full{min-width:100%}.xl\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.xl\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.xl\:max-w-0{max-width:0}.xl\:max-w-none{max-width:none}.xl\:max-w-xs{max-width:20rem}.xl\:max-w-sm{max-width:24rem}.xl\:max-w-md{max-width:28rem}.xl\:max-w-lg{max-width:32rem}.xl\:max-w-xl{max-width:36rem}.xl\:max-w-2xl{max-width:42rem}.xl\:max-w-3xl{max-width:48rem}.xl\:max-w-4xl{max-width:56rem}.xl\:max-w-5xl{max-width:64rem}.xl\:max-w-6xl{max-width:72rem}.xl\:max-w-7xl{max-width:80rem}.xl\:max-w-full{max-width:100%}.xl\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.xl\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.xl\:max-w-prose{max-width:65ch}.xl\:max-w-screen-sm{max-width:640px}.xl\:max-w-screen-md{max-width:768px}.xl\:max-w-screen-lg{max-width:1024px}.xl\:max-w-screen-xl{max-width:1280px}.xl\:max-w-screen-2xl{max-width:1536px}.xl\:flex-1{flex:1 1 0%}.xl\:flex-auto{flex:1 1 auto}.xl\:flex-initial{flex:0 1 auto}.xl\:flex-none{flex:none}.xl\:flex-shrink-0{flex-shrink:0}.xl\:flex-shrink{flex-shrink:1}.xl\:flex-grow-0{flex-grow:0}.xl\:flex-grow{flex-grow:1}.xl\:table-auto{table-layout:auto}.xl\:table-fixed{table-layout:fixed}.xl\:border-collapse{border-collapse:collapse}.xl\:border-separate{border-collapse:initial}.xl\:origin-center{transform-origin:center}.xl\:origin-top{transform-origin:top}.xl\:origin-top-right{transform-origin:top right}.xl\:origin-right{transform-origin:right}.xl\:origin-bottom-right{transform-origin:bottom right}.xl\:origin-bottom{transform-origin:bottom}.xl\:origin-bottom-left{transform-origin:bottom left}.xl\:origin-left{transform-origin:left}.xl\:origin-top-left{transform-origin:top left}.xl\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xl\:transform,.xl\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.xl\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xl\:transform-none{transform:none}.xl\:translate-x-0{--tw-translate-x:0px}.xl\:translate-x-1{--tw-translate-x:0.25rem}.xl\:translate-x-2{--tw-translate-x:0.5rem}.xl\:translate-x-3{--tw-translate-x:0.75rem}.xl\:translate-x-4{--tw-translate-x:1rem}.xl\:translate-x-5{--tw-translate-x:1.25rem}.xl\:translate-x-6{--tw-translate-x:1.5rem}.xl\:translate-x-7{--tw-translate-x:1.75rem}.xl\:translate-x-8{--tw-translate-x:2rem}.xl\:translate-x-9{--tw-translate-x:2.25rem}.xl\:translate-x-10{--tw-translate-x:2.5rem}.xl\:translate-x-11{--tw-translate-x:2.75rem}.xl\:translate-x-12{--tw-translate-x:3rem}.xl\:translate-x-14{--tw-translate-x:3.5rem}.xl\:translate-x-16{--tw-translate-x:4rem}.xl\:translate-x-20{--tw-translate-x:5rem}.xl\:translate-x-24{--tw-translate-x:6rem}.xl\:translate-x-28{--tw-translate-x:7rem}.xl\:translate-x-32{--tw-translate-x:8rem}.xl\:translate-x-36{--tw-translate-x:9rem}.xl\:translate-x-40{--tw-translate-x:10rem}.xl\:translate-x-44{--tw-translate-x:11rem}.xl\:translate-x-48{--tw-translate-x:12rem}.xl\:translate-x-52{--tw-translate-x:13rem}.xl\:translate-x-56{--tw-translate-x:14rem}.xl\:translate-x-60{--tw-translate-x:15rem}.xl\:translate-x-64{--tw-translate-x:16rem}.xl\:translate-x-72{--tw-translate-x:18rem}.xl\:translate-x-80{--tw-translate-x:20rem}.xl\:translate-x-96{--tw-translate-x:24rem}.xl\:translate-x-px{--tw-translate-x:1px}.xl\:translate-x-0\.5{--tw-translate-x:0.125rem}.xl\:translate-x-1\.5{--tw-translate-x:0.375rem}.xl\:translate-x-2\.5{--tw-translate-x:0.625rem}.xl\:translate-x-3\.5{--tw-translate-x:0.875rem}.xl\:-translate-x-0{--tw-translate-x:0px}.xl\:-translate-x-1{--tw-translate-x:-0.25rem}.xl\:-translate-x-2{--tw-translate-x:-0.5rem}.xl\:-translate-x-3{--tw-translate-x:-0.75rem}.xl\:-translate-x-4{--tw-translate-x:-1rem}.xl\:-translate-x-5{--tw-translate-x:-1.25rem}.xl\:-translate-x-6{--tw-translate-x:-1.5rem}.xl\:-translate-x-7{--tw-translate-x:-1.75rem}.xl\:-translate-x-8{--tw-translate-x:-2rem}.xl\:-translate-x-9{--tw-translate-x:-2.25rem}.xl\:-translate-x-10{--tw-translate-x:-2.5rem}.xl\:-translate-x-11{--tw-translate-x:-2.75rem}.xl\:-translate-x-12{--tw-translate-x:-3rem}.xl\:-translate-x-14{--tw-translate-x:-3.5rem}.xl\:-translate-x-16{--tw-translate-x:-4rem}.xl\:-translate-x-20{--tw-translate-x:-5rem}.xl\:-translate-x-24{--tw-translate-x:-6rem}.xl\:-translate-x-28{--tw-translate-x:-7rem}.xl\:-translate-x-32{--tw-translate-x:-8rem}.xl\:-translate-x-36{--tw-translate-x:-9rem}.xl\:-translate-x-40{--tw-translate-x:-10rem}.xl\:-translate-x-44{--tw-translate-x:-11rem}.xl\:-translate-x-48{--tw-translate-x:-12rem}.xl\:-translate-x-52{--tw-translate-x:-13rem}.xl\:-translate-x-56{--tw-translate-x:-14rem}.xl\:-translate-x-60{--tw-translate-x:-15rem}.xl\:-translate-x-64{--tw-translate-x:-16rem}.xl\:-translate-x-72{--tw-translate-x:-18rem}.xl\:-translate-x-80{--tw-translate-x:-20rem}.xl\:-translate-x-96{--tw-translate-x:-24rem}.xl\:-translate-x-px{--tw-translate-x:-1px}.xl\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.xl\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.xl\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.xl\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.xl\:translate-x-1\/2{--tw-translate-x:50%}.xl\:translate-x-1\/3{--tw-translate-x:33.333333%}.xl\:translate-x-2\/3{--tw-translate-x:66.666667%}.xl\:translate-x-1\/4{--tw-translate-x:25%}.xl\:translate-x-2\/4{--tw-translate-x:50%}.xl\:translate-x-3\/4{--tw-translate-x:75%}.xl\:translate-x-full{--tw-translate-x:100%}.xl\:-translate-x-1\/2{--tw-translate-x:-50%}.xl\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.xl\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.xl\:-translate-x-1\/4{--tw-translate-x:-25%}.xl\:-translate-x-2\/4{--tw-translate-x:-50%}.xl\:-translate-x-3\/4{--tw-translate-x:-75%}.xl\:-translate-x-full{--tw-translate-x:-100%}.xl\:translate-y-0{--tw-translate-y:0px}.xl\:translate-y-1{--tw-translate-y:0.25rem}.xl\:translate-y-2{--tw-translate-y:0.5rem}.xl\:translate-y-3{--tw-translate-y:0.75rem}.xl\:translate-y-4{--tw-translate-y:1rem}.xl\:translate-y-5{--tw-translate-y:1.25rem}.xl\:translate-y-6{--tw-translate-y:1.5rem}.xl\:translate-y-7{--tw-translate-y:1.75rem}.xl\:translate-y-8{--tw-translate-y:2rem}.xl\:translate-y-9{--tw-translate-y:2.25rem}.xl\:translate-y-10{--tw-translate-y:2.5rem}.xl\:translate-y-11{--tw-translate-y:2.75rem}.xl\:translate-y-12{--tw-translate-y:3rem}.xl\:translate-y-14{--tw-translate-y:3.5rem}.xl\:translate-y-16{--tw-translate-y:4rem}.xl\:translate-y-20{--tw-translate-y:5rem}.xl\:translate-y-24{--tw-translate-y:6rem}.xl\:translate-y-28{--tw-translate-y:7rem}.xl\:translate-y-32{--tw-translate-y:8rem}.xl\:translate-y-36{--tw-translate-y:9rem}.xl\:translate-y-40{--tw-translate-y:10rem}.xl\:translate-y-44{--tw-translate-y:11rem}.xl\:translate-y-48{--tw-translate-y:12rem}.xl\:translate-y-52{--tw-translate-y:13rem}.xl\:translate-y-56{--tw-translate-y:14rem}.xl\:translate-y-60{--tw-translate-y:15rem}.xl\:translate-y-64{--tw-translate-y:16rem}.xl\:translate-y-72{--tw-translate-y:18rem}.xl\:translate-y-80{--tw-translate-y:20rem}.xl\:translate-y-96{--tw-translate-y:24rem}.xl\:translate-y-px{--tw-translate-y:1px}.xl\:translate-y-0\.5{--tw-translate-y:0.125rem}.xl\:translate-y-1\.5{--tw-translate-y:0.375rem}.xl\:translate-y-2\.5{--tw-translate-y:0.625rem}.xl\:translate-y-3\.5{--tw-translate-y:0.875rem}.xl\:-translate-y-0{--tw-translate-y:0px}.xl\:-translate-y-1{--tw-translate-y:-0.25rem}.xl\:-translate-y-2{--tw-translate-y:-0.5rem}.xl\:-translate-y-3{--tw-translate-y:-0.75rem}.xl\:-translate-y-4{--tw-translate-y:-1rem}.xl\:-translate-y-5{--tw-translate-y:-1.25rem}.xl\:-translate-y-6{--tw-translate-y:-1.5rem}.xl\:-translate-y-7{--tw-translate-y:-1.75rem}.xl\:-translate-y-8{--tw-translate-y:-2rem}.xl\:-translate-y-9{--tw-translate-y:-2.25rem}.xl\:-translate-y-10{--tw-translate-y:-2.5rem}.xl\:-translate-y-11{--tw-translate-y:-2.75rem}.xl\:-translate-y-12{--tw-translate-y:-3rem}.xl\:-translate-y-14{--tw-translate-y:-3.5rem}.xl\:-translate-y-16{--tw-translate-y:-4rem}.xl\:-translate-y-20{--tw-translate-y:-5rem}.xl\:-translate-y-24{--tw-translate-y:-6rem}.xl\:-translate-y-28{--tw-translate-y:-7rem}.xl\:-translate-y-32{--tw-translate-y:-8rem}.xl\:-translate-y-36{--tw-translate-y:-9rem}.xl\:-translate-y-40{--tw-translate-y:-10rem}.xl\:-translate-y-44{--tw-translate-y:-11rem}.xl\:-translate-y-48{--tw-translate-y:-12rem}.xl\:-translate-y-52{--tw-translate-y:-13rem}.xl\:-translate-y-56{--tw-translate-y:-14rem}.xl\:-translate-y-60{--tw-translate-y:-15rem}.xl\:-translate-y-64{--tw-translate-y:-16rem}.xl\:-translate-y-72{--tw-translate-y:-18rem}.xl\:-translate-y-80{--tw-translate-y:-20rem}.xl\:-translate-y-96{--tw-translate-y:-24rem}.xl\:-translate-y-px{--tw-translate-y:-1px}.xl\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.xl\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.xl\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.xl\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.xl\:translate-y-1\/2{--tw-translate-y:50%}.xl\:translate-y-1\/3{--tw-translate-y:33.333333%}.xl\:translate-y-2\/3{--tw-translate-y:66.666667%}.xl\:translate-y-1\/4{--tw-translate-y:25%}.xl\:translate-y-2\/4{--tw-translate-y:50%}.xl\:translate-y-3\/4{--tw-translate-y:75%}.xl\:translate-y-full{--tw-translate-y:100%}.xl\:-translate-y-1\/2{--tw-translate-y:-50%}.xl\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.xl\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.xl\:-translate-y-1\/4{--tw-translate-y:-25%}.xl\:-translate-y-2\/4{--tw-translate-y:-50%}.xl\:-translate-y-3\/4{--tw-translate-y:-75%}.xl\:-translate-y-full{--tw-translate-y:-100%}.xl\:hover\:translate-x-0:hover{--tw-translate-x:0px}.xl\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.xl\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.xl\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.xl\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.xl\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.xl\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.xl\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.xl\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.xl\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.xl\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.xl\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.xl\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.xl\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.xl\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.xl\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.xl\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.xl\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.xl\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.xl\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.xl\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.xl\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.xl\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.xl\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.xl\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.xl\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.xl\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.xl\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.xl\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.xl\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.xl\:hover\:translate-x-px:hover{--tw-translate-x:1px}.xl\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.xl\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.xl\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.xl\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.xl\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.xl\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.xl\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.xl\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.xl\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.xl\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.xl\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.xl\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.xl\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.xl\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.xl\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.xl\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.xl\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.xl\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.xl\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.xl\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.xl\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.xl\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.xl\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.xl\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.xl\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.xl\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.xl\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.xl\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.xl\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.xl\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.xl\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.xl\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.xl\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.xl\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.xl\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.xl\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.xl\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.xl\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.xl\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.xl\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.xl\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.xl\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.xl\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.xl\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.xl\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.xl\:hover\:translate-x-full:hover{--tw-translate-x:100%}.xl\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.xl\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.xl\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.xl\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.xl\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.xl\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.xl\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.xl\:hover\:translate-y-0:hover{--tw-translate-y:0px}.xl\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.xl\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.xl\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.xl\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.xl\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.xl\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.xl\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.xl\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.xl\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.xl\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.xl\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.xl\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.xl\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.xl\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.xl\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.xl\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.xl\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.xl\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.xl\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.xl\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.xl\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.xl\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.xl\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.xl\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.xl\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.xl\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.xl\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.xl\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.xl\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.xl\:hover\:translate-y-px:hover{--tw-translate-y:1px}.xl\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.xl\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.xl\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.xl\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.xl\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.xl\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.xl\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.xl\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.xl\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.xl\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.xl\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.xl\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.xl\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.xl\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.xl\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.xl\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.xl\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.xl\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.xl\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.xl\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.xl\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.xl\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.xl\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.xl\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.xl\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.xl\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.xl\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.xl\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.xl\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.xl\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.xl\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.xl\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.xl\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.xl\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.xl\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.xl\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.xl\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.xl\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.xl\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.xl\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.xl\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.xl\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.xl\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.xl\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.xl\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.xl\:hover\:translate-y-full:hover{--tw-translate-y:100%}.xl\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.xl\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.xl\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.xl\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.xl\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.xl\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.xl\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.xl\:focus\:translate-x-0:focus{--tw-translate-x:0px}.xl\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.xl\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.xl\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.xl\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.xl\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.xl\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.xl\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.xl\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.xl\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.xl\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.xl\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.xl\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.xl\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.xl\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.xl\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.xl\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.xl\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.xl\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.xl\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.xl\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.xl\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.xl\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.xl\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.xl\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.xl\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.xl\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.xl\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.xl\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.xl\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.xl\:focus\:translate-x-px:focus{--tw-translate-x:1px}.xl\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.xl\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.xl\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.xl\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.xl\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.xl\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.xl\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.xl\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.xl\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.xl\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.xl\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.xl\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.xl\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.xl\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.xl\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.xl\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.xl\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.xl\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.xl\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.xl\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.xl\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.xl\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.xl\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.xl\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.xl\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.xl\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.xl\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.xl\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.xl\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.xl\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.xl\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.xl\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.xl\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.xl\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.xl\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.xl\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.xl\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.xl\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.xl\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.xl\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.xl\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.xl\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.xl\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.xl\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.xl\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.xl\:focus\:translate-x-full:focus{--tw-translate-x:100%}.xl\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.xl\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.xl\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.xl\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.xl\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.xl\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.xl\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.xl\:focus\:translate-y-0:focus{--tw-translate-y:0px}.xl\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.xl\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.xl\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.xl\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.xl\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.xl\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.xl\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.xl\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.xl\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.xl\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.xl\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.xl\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.xl\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.xl\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.xl\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.xl\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.xl\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.xl\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.xl\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.xl\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.xl\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.xl\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.xl\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.xl\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.xl\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.xl\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.xl\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.xl\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.xl\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.xl\:focus\:translate-y-px:focus{--tw-translate-y:1px}.xl\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.xl\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.xl\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.xl\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.xl\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.xl\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.xl\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.xl\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.xl\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.xl\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.xl\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.xl\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.xl\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.xl\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.xl\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.xl\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.xl\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.xl\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.xl\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.xl\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.xl\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.xl\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.xl\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.xl\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.xl\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.xl\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.xl\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.xl\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.xl\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.xl\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.xl\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.xl\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.xl\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.xl\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.xl\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.xl\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.xl\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.xl\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.xl\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.xl\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.xl\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.xl\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.xl\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.xl\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.xl\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.xl\:focus\:translate-y-full:focus{--tw-translate-y:100%}.xl\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.xl\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.xl\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.xl\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.xl\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.xl\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.xl\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.xl\:rotate-0{--tw-rotate:0deg}.xl\:rotate-1{--tw-rotate:1deg}.xl\:rotate-2{--tw-rotate:2deg}.xl\:rotate-3{--tw-rotate:3deg}.xl\:rotate-6{--tw-rotate:6deg}.xl\:rotate-12{--tw-rotate:12deg}.xl\:rotate-45{--tw-rotate:45deg}.xl\:rotate-90{--tw-rotate:90deg}.xl\:rotate-180{--tw-rotate:180deg}.xl\:-rotate-180{--tw-rotate:-180deg}.xl\:-rotate-90{--tw-rotate:-90deg}.xl\:-rotate-45{--tw-rotate:-45deg}.xl\:-rotate-12{--tw-rotate:-12deg}.xl\:-rotate-6{--tw-rotate:-6deg}.xl\:-rotate-3{--tw-rotate:-3deg}.xl\:-rotate-2{--tw-rotate:-2deg}.xl\:-rotate-1{--tw-rotate:-1deg}.xl\:hover\:rotate-0:hover{--tw-rotate:0deg}.xl\:hover\:rotate-1:hover{--tw-rotate:1deg}.xl\:hover\:rotate-2:hover{--tw-rotate:2deg}.xl\:hover\:rotate-3:hover{--tw-rotate:3deg}.xl\:hover\:rotate-6:hover{--tw-rotate:6deg}.xl\:hover\:rotate-12:hover{--tw-rotate:12deg}.xl\:hover\:rotate-45:hover{--tw-rotate:45deg}.xl\:hover\:rotate-90:hover{--tw-rotate:90deg}.xl\:hover\:rotate-180:hover{--tw-rotate:180deg}.xl\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.xl\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.xl\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.xl\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.xl\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.xl\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.xl\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.xl\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.xl\:focus\:rotate-0:focus{--tw-rotate:0deg}.xl\:focus\:rotate-1:focus{--tw-rotate:1deg}.xl\:focus\:rotate-2:focus{--tw-rotate:2deg}.xl\:focus\:rotate-3:focus{--tw-rotate:3deg}.xl\:focus\:rotate-6:focus{--tw-rotate:6deg}.xl\:focus\:rotate-12:focus{--tw-rotate:12deg}.xl\:focus\:rotate-45:focus{--tw-rotate:45deg}.xl\:focus\:rotate-90:focus{--tw-rotate:90deg}.xl\:focus\:rotate-180:focus{--tw-rotate:180deg}.xl\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.xl\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.xl\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.xl\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.xl\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.xl\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.xl\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.xl\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.xl\:skew-x-0{--tw-skew-x:0deg}.xl\:skew-x-1{--tw-skew-x:1deg}.xl\:skew-x-2{--tw-skew-x:2deg}.xl\:skew-x-3{--tw-skew-x:3deg}.xl\:skew-x-6{--tw-skew-x:6deg}.xl\:skew-x-12{--tw-skew-x:12deg}.xl\:-skew-x-12{--tw-skew-x:-12deg}.xl\:-skew-x-6{--tw-skew-x:-6deg}.xl\:-skew-x-3{--tw-skew-x:-3deg}.xl\:-skew-x-2{--tw-skew-x:-2deg}.xl\:-skew-x-1{--tw-skew-x:-1deg}.xl\:skew-y-0{--tw-skew-y:0deg}.xl\:skew-y-1{--tw-skew-y:1deg}.xl\:skew-y-2{--tw-skew-y:2deg}.xl\:skew-y-3{--tw-skew-y:3deg}.xl\:skew-y-6{--tw-skew-y:6deg}.xl\:skew-y-12{--tw-skew-y:12deg}.xl\:-skew-y-12{--tw-skew-y:-12deg}.xl\:-skew-y-6{--tw-skew-y:-6deg}.xl\:-skew-y-3{--tw-skew-y:-3deg}.xl\:-skew-y-2{--tw-skew-y:-2deg}.xl\:-skew-y-1{--tw-skew-y:-1deg}.xl\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.xl\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.xl\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.xl\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.xl\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.xl\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.xl\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.xl\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.xl\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.xl\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.xl\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.xl\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.xl\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.xl\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.xl\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.xl\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.xl\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.xl\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.xl\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.xl\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.xl\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.xl\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.xl\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.xl\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.xl\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.xl\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.xl\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.xl\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.xl\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.xl\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.xl\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.xl\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.xl\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.xl\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.xl\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.xl\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.xl\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.xl\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.xl\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.xl\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.xl\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.xl\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.xl\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.xl\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.xl\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.xl\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.xl\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.xl\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.xl\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.xl\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.xl\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.xl\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.xl\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.xl\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.xl\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.xl\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.xl\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.xl\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.xl\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.xl\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.xl\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.xl\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.xl\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.xl\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.xl\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.xl\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.xl\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.xl\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.xl\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.xl\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.xl\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.xl\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.xl\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.xl\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.xl\:scale-x-0{--tw-scale-x:0}.xl\:scale-x-50{--tw-scale-x:.5}.xl\:scale-x-75{--tw-scale-x:.75}.xl\:scale-x-90{--tw-scale-x:.9}.xl\:scale-x-95{--tw-scale-x:.95}.xl\:scale-x-100{--tw-scale-x:1}.xl\:scale-x-105{--tw-scale-x:1.05}.xl\:scale-x-110{--tw-scale-x:1.1}.xl\:scale-x-125{--tw-scale-x:1.25}.xl\:scale-x-150{--tw-scale-x:1.5}.xl\:scale-y-0{--tw-scale-y:0}.xl\:scale-y-50{--tw-scale-y:.5}.xl\:scale-y-75{--tw-scale-y:.75}.xl\:scale-y-90{--tw-scale-y:.9}.xl\:scale-y-95{--tw-scale-y:.95}.xl\:scale-y-100{--tw-scale-y:1}.xl\:scale-y-105{--tw-scale-y:1.05}.xl\:scale-y-110{--tw-scale-y:1.1}.xl\:scale-y-125{--tw-scale-y:1.25}.xl\:scale-y-150{--tw-scale-y:1.5}.xl\:hover\:scale-x-0:hover{--tw-scale-x:0}.xl\:hover\:scale-x-50:hover{--tw-scale-x:.5}.xl\:hover\:scale-x-75:hover{--tw-scale-x:.75}.xl\:hover\:scale-x-90:hover{--tw-scale-x:.9}.xl\:hover\:scale-x-95:hover{--tw-scale-x:.95}.xl\:hover\:scale-x-100:hover{--tw-scale-x:1}.xl\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.xl\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.xl\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.xl\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.xl\:hover\:scale-y-0:hover{--tw-scale-y:0}.xl\:hover\:scale-y-50:hover{--tw-scale-y:.5}.xl\:hover\:scale-y-75:hover{--tw-scale-y:.75}.xl\:hover\:scale-y-90:hover{--tw-scale-y:.9}.xl\:hover\:scale-y-95:hover{--tw-scale-y:.95}.xl\:hover\:scale-y-100:hover{--tw-scale-y:1}.xl\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.xl\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.xl\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.xl\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.xl\:focus\:scale-x-0:focus{--tw-scale-x:0}.xl\:focus\:scale-x-50:focus{--tw-scale-x:.5}.xl\:focus\:scale-x-75:focus{--tw-scale-x:.75}.xl\:focus\:scale-x-90:focus{--tw-scale-x:.9}.xl\:focus\:scale-x-95:focus{--tw-scale-x:.95}.xl\:focus\:scale-x-100:focus{--tw-scale-x:1}.xl\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.xl\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.xl\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.xl\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.xl\:focus\:scale-y-0:focus{--tw-scale-y:0}.xl\:focus\:scale-y-50:focus{--tw-scale-y:.5}.xl\:focus\:scale-y-75:focus{--tw-scale-y:.75}.xl\:focus\:scale-y-90:focus{--tw-scale-y:.9}.xl\:focus\:scale-y-95:focus{--tw-scale-y:.95}.xl\:focus\:scale-y-100:focus{--tw-scale-y:1}.xl\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.xl\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.xl\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.xl\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.xl\:animate-none{-webkit-animation:none;animation:none}.xl\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.xl\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.xl\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.xl\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.xl\:cursor-auto{cursor:auto}.xl\:cursor-default{cursor:default}.xl\:cursor-pointer{cursor:pointer}.xl\:cursor-wait{cursor:wait}.xl\:cursor-text{cursor:text}.xl\:cursor-move{cursor:move}.xl\:cursor-help{cursor:help}.xl\:cursor-not-allowed{cursor:not-allowed}.xl\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.xl\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.xl\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.xl\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.xl\:resize-none{resize:none}.xl\:resize-y{resize:vertical}.xl\:resize-x{resize:horizontal}.xl\:resize{resize:both}.xl\:list-inside{list-style-position:inside}.xl\:list-outside{list-style-position:outside}.xl\:list-none{list-style-type:none}.xl\:list-disc{list-style-type:disc}.xl\:list-decimal{list-style-type:decimal}.xl\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.xl\:auto-cols-auto{grid-auto-columns:auto}.xl\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.xl\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.xl\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.xl\:grid-flow-row{grid-auto-flow:row}.xl\:grid-flow-col{grid-auto-flow:column}.xl\:grid-flow-row-dense{grid-auto-flow:row dense}.xl\:grid-flow-col-dense{grid-auto-flow:column dense}.xl\:auto-rows-auto{grid-auto-rows:auto}.xl\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.xl\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.xl\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-none{grid-template-columns:none}.xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.xl\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.xl\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.xl\:grid-rows-none{grid-template-rows:none}.xl\:flex-row{flex-direction:row}.xl\:flex-row-reverse{flex-direction:row-reverse}.xl\:flex-col{flex-direction:column}.xl\:flex-col-reverse{flex-direction:column-reverse}.xl\:flex-wrap{flex-wrap:wrap}.xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}.xl\:flex-nowrap{flex-wrap:nowrap}.xl\:place-content-center{place-content:center}.xl\:place-content-start{place-content:start}.xl\:place-content-end{place-content:end}.xl\:place-content-between{place-content:space-between}.xl\:place-content-around{place-content:space-around}.xl\:place-content-evenly{place-content:space-evenly}.xl\:place-content-stretch{place-content:stretch}.xl\:place-items-start{place-items:start}.xl\:place-items-end{place-items:end}.xl\:place-items-center{place-items:center}.xl\:place-items-stretch{place-items:stretch}.xl\:content-center{align-content:center}.xl\:content-start{align-content:flex-start}.xl\:content-end{align-content:flex-end}.xl\:content-between{align-content:space-between}.xl\:content-around{align-content:space-around}.xl\:content-evenly{align-content:space-evenly}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:items-baseline{align-items:baseline}.xl\:items-stretch{align-items:stretch}.xl\:justify-start{justify-content:flex-start}.xl\:justify-end{justify-content:flex-end}.xl\:justify-center{justify-content:center}.xl\:justify-between{justify-content:space-between}.xl\:justify-around{justify-content:space-around}.xl\:justify-evenly{justify-content:space-evenly}.xl\:justify-items-start{justify-items:start}.xl\:justify-items-end{justify-items:end}.xl\:justify-items-center{justify-items:center}.xl\:justify-items-stretch{justify-items:stretch}.xl\:gap-0{gap:0}.xl\:gap-1{gap:.25rem}.xl\:gap-2{gap:.5rem}.xl\:gap-3{gap:.75rem}.xl\:gap-4{gap:1rem}.xl\:gap-5{gap:1.25rem}.xl\:gap-6{gap:1.5rem}.xl\:gap-7{gap:1.75rem}.xl\:gap-8{gap:2rem}.xl\:gap-9{gap:2.25rem}.xl\:gap-10{gap:2.5rem}.xl\:gap-11{gap:2.75rem}.xl\:gap-12{gap:3rem}.xl\:gap-14{gap:3.5rem}.xl\:gap-16{gap:4rem}.xl\:gap-20{gap:5rem}.xl\:gap-24{gap:6rem}.xl\:gap-28{gap:7rem}.xl\:gap-32{gap:8rem}.xl\:gap-36{gap:9rem}.xl\:gap-40{gap:10rem}.xl\:gap-44{gap:11rem}.xl\:gap-48{gap:12rem}.xl\:gap-52{gap:13rem}.xl\:gap-56{gap:14rem}.xl\:gap-60{gap:15rem}.xl\:gap-64{gap:16rem}.xl\:gap-72{gap:18rem}.xl\:gap-80{gap:20rem}.xl\:gap-96{gap:24rem}.xl\:gap-px{gap:1px}.xl\:gap-0\.5{gap:.125rem}.xl\:gap-1\.5{gap:.375rem}.xl\:gap-2\.5{gap:.625rem}.xl\:gap-3\.5{gap:.875rem}.xl\:gap-x-0{-moz-column-gap:0;column-gap:0}.xl\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.xl\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.xl\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.xl\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.xl\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.xl\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.xl\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.xl\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.xl\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.xl\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.xl\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.xl\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.xl\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.xl\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.xl\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.xl\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.xl\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.xl\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.xl\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.xl\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.xl\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.xl\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.xl\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.xl\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.xl\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.xl\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.xl\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.xl\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.xl\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.xl\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.xl\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.xl\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.xl\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.xl\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.xl\:gap-y-0{row-gap:0}.xl\:gap-y-1{row-gap:.25rem}.xl\:gap-y-2{row-gap:.5rem}.xl\:gap-y-3{row-gap:.75rem}.xl\:gap-y-4{row-gap:1rem}.xl\:gap-y-5{row-gap:1.25rem}.xl\:gap-y-6{row-gap:1.5rem}.xl\:gap-y-7{row-gap:1.75rem}.xl\:gap-y-8{row-gap:2rem}.xl\:gap-y-9{row-gap:2.25rem}.xl\:gap-y-10{row-gap:2.5rem}.xl\:gap-y-11{row-gap:2.75rem}.xl\:gap-y-12{row-gap:3rem}.xl\:gap-y-14{row-gap:3.5rem}.xl\:gap-y-16{row-gap:4rem}.xl\:gap-y-20{row-gap:5rem}.xl\:gap-y-24{row-gap:6rem}.xl\:gap-y-28{row-gap:7rem}.xl\:gap-y-32{row-gap:8rem}.xl\:gap-y-36{row-gap:9rem}.xl\:gap-y-40{row-gap:10rem}.xl\:gap-y-44{row-gap:11rem}.xl\:gap-y-48{row-gap:12rem}.xl\:gap-y-52{row-gap:13rem}.xl\:gap-y-56{row-gap:14rem}.xl\:gap-y-60{row-gap:15rem}.xl\:gap-y-64{row-gap:16rem}.xl\:gap-y-72{row-gap:18rem}.xl\:gap-y-80{row-gap:20rem}.xl\:gap-y-96{row-gap:24rem}.xl\:gap-y-px{row-gap:1px}.xl\:gap-y-0\.5{row-gap:.125rem}.xl\:gap-y-1\.5{row-gap:.375rem}.xl\:gap-y-2\.5{row-gap:.625rem}.xl\:gap-y-3\.5{row-gap:.875rem}.xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.xl\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.xl\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.xl\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.xl\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.xl\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.xl\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.xl\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.xl\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.xl\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.xl\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.xl\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.xl\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.xl\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.xl\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.xl\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.xl\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.xl\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.xl\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.xl\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.xl\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.xl\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.xl\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.xl\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.xl\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.xl\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.xl\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.xl\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.xl\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.xl\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.xl\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.xl\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.xl\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.xl\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.xl\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.xl\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.xl\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.xl\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.xl\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.xl\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.xl\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.xl\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.xl\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.xl\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.xl\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.xl\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.xl\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.xl\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.xl\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.xl\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.xl\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.xl\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.xl\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.xl\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.xl\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.xl\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.xl\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.xl\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.xl\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.xl\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.xl\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.xl\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.xl\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.xl\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.xl\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.xl\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.xl\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.xl\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.xl\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.xl\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.xl\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.xl\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.xl\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.xl\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.xl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.xl\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.xl\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.xl\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.xl\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.xl\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.xl\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.xl\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.xl\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.xl\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.xl\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.xl\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.xl\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.xl\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.xl\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.xl\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.xl\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.xl\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.xl\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.xl\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.xl\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.xl\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.xl\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.xl\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.xl\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.xl\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.xl\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.xl\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.xl\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.xl\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.xl\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.xl\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.xl\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.xl\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.xl\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.xl\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.xl\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.xl\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.xl\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.xl\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.xl\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.xl\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.xl\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.xl\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.xl\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.xl\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.xl\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.xl\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.xl\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.xl\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.xl\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.xl\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.xl\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.xl\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.xl\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.xl\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.xl\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.xl\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.xl\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.xl\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.xl\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.xl\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.xl\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.xl\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.xl\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.xl\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.xl\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.xl\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.xl\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.xl\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.xl\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.xl\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.xl\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.xl\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.xl\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.xl\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.xl\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.xl\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.xl\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.xl\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.xl\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.xl\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.xl\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.xl\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.xl\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.xl\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.xl\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.xl\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.xl\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.xl\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.xl\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.xl\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.xl\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.xl\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.xl\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.xl\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.xl\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.xl\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.xl\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.xl\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.xl\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.xl\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.xl\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.xl\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.xl\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.xl\:place-self-auto{place-self:auto}.xl\:place-self-start{place-self:start}.xl\:place-self-end{place-self:end}.xl\:place-self-center{place-self:center}.xl\:place-self-stretch{place-self:stretch}.xl\:self-auto{align-self:auto}.xl\:self-start{align-self:flex-start}.xl\:self-end{align-self:flex-end}.xl\:self-center{align-self:center}.xl\:self-stretch{align-self:stretch}.xl\:self-baseline{align-self:baseline}.xl\:justify-self-auto{justify-self:auto}.xl\:justify-self-start{justify-self:start}.xl\:justify-self-end{justify-self:end}.xl\:justify-self-center{justify-self:center}.xl\:justify-self-stretch{justify-self:stretch}.xl\:overflow-auto{overflow:auto}.xl\:overflow-hidden{overflow:hidden}.xl\:overflow-visible{overflow:visible}.xl\:overflow-scroll{overflow:scroll}.xl\:overflow-x-auto{overflow-x:auto}.xl\:overflow-y-auto{overflow-y:auto}.xl\:overflow-x-hidden{overflow-x:hidden}.xl\:overflow-y-hidden{overflow-y:hidden}.xl\:overflow-x-visible{overflow-x:visible}.xl\:overflow-y-visible{overflow-y:visible}.xl\:overflow-x-scroll{overflow-x:scroll}.xl\:overflow-y-scroll{overflow-y:scroll}.xl\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.xl\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.xl\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.xl\:overscroll-y-auto{overscroll-behavior-y:auto}.xl\:overscroll-y-contain{overscroll-behavior-y:contain}.xl\:overscroll-y-none{overscroll-behavior-y:none}.xl\:overscroll-x-auto{overscroll-behavior-x:auto}.xl\:overscroll-x-contain{overscroll-behavior-x:contain}.xl\:overscroll-x-none{overscroll-behavior-x:none}.xl\:truncate{overflow:hidden;white-space:nowrap}.xl\:overflow-ellipsis,.xl\:truncate{text-overflow:ellipsis}.xl\:overflow-clip{text-overflow:clip}.xl\:whitespace-normal{white-space:normal}.xl\:whitespace-nowrap{white-space:nowrap}.xl\:whitespace-pre{white-space:pre}.xl\:whitespace-pre-line{white-space:pre-line}.xl\:whitespace-pre-wrap{white-space:pre-wrap}.xl\:break-normal{overflow-wrap:normal;word-break:normal}.xl\:break-words{overflow-wrap:break-word}.xl\:break-all{word-break:break-all}.xl\:rounded-none{border-radius:0}.xl\:rounded-sm{border-radius:.125rem}.xl\:rounded{border-radius:.25rem}.xl\:rounded-md{border-radius:.375rem}.xl\:rounded-lg{border-radius:.5rem}.xl\:rounded-xl{border-radius:.75rem}.xl\:rounded-2xl{border-radius:1rem}.xl\:rounded-3xl{border-radius:1.5rem}.xl\:rounded-full{border-radius:9999px}.xl\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.xl\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.xl\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.xl\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.xl\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.xl\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.xl\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.xl\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.xl\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.xl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.xl\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.xl\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.xl\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.xl\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.xl\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.xl\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.xl\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.xl\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.xl\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.xl\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.xl\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-tl-none{border-top-left-radius:0}.xl\:rounded-tl-sm{border-top-left-radius:.125rem}.xl\:rounded-tl{border-top-left-radius:.25rem}.xl\:rounded-tl-md{border-top-left-radius:.375rem}.xl\:rounded-tl-lg{border-top-left-radius:.5rem}.xl\:rounded-tl-xl{border-top-left-radius:.75rem}.xl\:rounded-tl-2xl{border-top-left-radius:1rem}.xl\:rounded-tl-3xl{border-top-left-radius:1.5rem}.xl\:rounded-tl-full{border-top-left-radius:9999px}.xl\:rounded-tr-none{border-top-right-radius:0}.xl\:rounded-tr-sm{border-top-right-radius:.125rem}.xl\:rounded-tr{border-top-right-radius:.25rem}.xl\:rounded-tr-md{border-top-right-radius:.375rem}.xl\:rounded-tr-lg{border-top-right-radius:.5rem}.xl\:rounded-tr-xl{border-top-right-radius:.75rem}.xl\:rounded-tr-2xl{border-top-right-radius:1rem}.xl\:rounded-tr-3xl{border-top-right-radius:1.5rem}.xl\:rounded-tr-full{border-top-right-radius:9999px}.xl\:rounded-br-none{border-bottom-right-radius:0}.xl\:rounded-br-sm{border-bottom-right-radius:.125rem}.xl\:rounded-br{border-bottom-right-radius:.25rem}.xl\:rounded-br-md{border-bottom-right-radius:.375rem}.xl\:rounded-br-lg{border-bottom-right-radius:.5rem}.xl\:rounded-br-xl{border-bottom-right-radius:.75rem}.xl\:rounded-br-2xl{border-bottom-right-radius:1rem}.xl\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.xl\:rounded-br-full{border-bottom-right-radius:9999px}.xl\:rounded-bl-none{border-bottom-left-radius:0}.xl\:rounded-bl-sm{border-bottom-left-radius:.125rem}.xl\:rounded-bl{border-bottom-left-radius:.25rem}.xl\:rounded-bl-md{border-bottom-left-radius:.375rem}.xl\:rounded-bl-lg{border-bottom-left-radius:.5rem}.xl\:rounded-bl-xl{border-bottom-left-radius:.75rem}.xl\:rounded-bl-2xl{border-bottom-left-radius:1rem}.xl\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.xl\:rounded-bl-full{border-bottom-left-radius:9999px}.xl\:border-0{border-width:0}.xl\:border-2{border-width:2px}.xl\:border-4{border-width:4px}.xl\:border-8{border-width:8px}.xl\:border{border-width:1px}.xl\:border-t-0{border-top-width:0}.xl\:border-t-2{border-top-width:2px}.xl\:border-t-4{border-top-width:4px}.xl\:border-t-8{border-top-width:8px}.xl\:border-t{border-top-width:1px}.xl\:border-r-0{border-right-width:0}.xl\:border-r-2{border-right-width:2px}.xl\:border-r-4{border-right-width:4px}.xl\:border-r-8{border-right-width:8px}.xl\:border-r{border-right-width:1px}.xl\:border-b-0{border-bottom-width:0}.xl\:border-b-2{border-bottom-width:2px}.xl\:border-b-4{border-bottom-width:4px}.xl\:border-b-8{border-bottom-width:8px}.xl\:border-b{border-bottom-width:1px}.xl\:border-l-0{border-left-width:0}.xl\:border-l-2{border-left-width:2px}.xl\:border-l-4{border-left-width:4px}.xl\:border-l-8{border-left-width:8px}.xl\:border-l{border-left-width:1px}.xl\:border-solid{border-style:solid}.xl\:border-dashed{border-style:dashed}.xl\:border-dotted{border-style:dotted}.xl\:border-double{border-style:double}.xl\:border-none{border-style:none}.xl\:border-transparent{border-color:transparent}.xl\:border-current{border-color:currentColor}.xl\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-transparent{border-color:transparent}.group:hover .xl\:group-hover\:border-current{border-color:currentColor}.group:hover .xl\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:focus-within\:border-transparent:focus-within{border-color:transparent}.xl\:focus-within\:border-current:focus-within{border-color:currentColor}.xl\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:hover\:border-transparent:hover{border-color:transparent}.xl\:hover\:border-current:hover{border-color:currentColor}.xl\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:focus\:border-transparent:focus{border-color:transparent}.xl\:focus\:border-current:focus{border-color:currentColor}.xl\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:border-opacity-0{--tw-border-opacity:0}.xl\:border-opacity-5{--tw-border-opacity:0.05}.xl\:border-opacity-10{--tw-border-opacity:0.1}.xl\:border-opacity-20{--tw-border-opacity:0.2}.xl\:border-opacity-25{--tw-border-opacity:0.25}.xl\:border-opacity-30{--tw-border-opacity:0.3}.xl\:border-opacity-40{--tw-border-opacity:0.4}.xl\:border-opacity-50{--tw-border-opacity:0.5}.xl\:border-opacity-60{--tw-border-opacity:0.6}.xl\:border-opacity-70{--tw-border-opacity:0.7}.xl\:border-opacity-75{--tw-border-opacity:0.75}.xl\:border-opacity-80{--tw-border-opacity:0.8}.xl\:border-opacity-90{--tw-border-opacity:0.9}.xl\:border-opacity-95{--tw-border-opacity:0.95}.xl\:border-opacity-100{--tw-border-opacity:1}.group:hover .xl\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .xl\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .xl\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .xl\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .xl\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .xl\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .xl\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .xl\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .xl\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .xl\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .xl\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .xl\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .xl\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .xl\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .xl\:group-hover\:border-opacity-100{--tw-border-opacity:1}.xl\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.xl\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.xl\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.xl\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.xl\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.xl\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.xl\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.xl\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.xl\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.xl\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.xl\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.xl\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.xl\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.xl\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.xl\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.xl\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.xl\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.xl\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.xl\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.xl\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.xl\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.xl\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.xl\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.xl\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.xl\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.xl\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.xl\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.xl\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.xl\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.xl\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.xl\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.xl\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.xl\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.xl\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.xl\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.xl\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.xl\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.xl\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.xl\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.xl\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.xl\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.xl\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.xl\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.xl\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.xl\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.xl\:bg-transparent{background-color:initial}.xl\:bg-current{background-color:currentColor}.xl\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-transparent{background-color:initial}.group:hover .xl\:group-hover\:bg-current{background-color:currentColor}.group:hover .xl\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:focus-within\:bg-transparent:focus-within{background-color:initial}.xl\:focus-within\:bg-current:focus-within{background-color:currentColor}.xl\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:hover\:bg-transparent:hover{background-color:initial}.xl\:hover\:bg-current:hover{background-color:currentColor}.xl\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:focus\:bg-transparent:focus{background-color:initial}.xl\:focus\:bg-current:focus{background-color:currentColor}.xl\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:bg-opacity-0{--tw-bg-opacity:0}.xl\:bg-opacity-5{--tw-bg-opacity:0.05}.xl\:bg-opacity-10{--tw-bg-opacity:0.1}.xl\:bg-opacity-20{--tw-bg-opacity:0.2}.xl\:bg-opacity-25{--tw-bg-opacity:0.25}.xl\:bg-opacity-30{--tw-bg-opacity:0.3}.xl\:bg-opacity-40{--tw-bg-opacity:0.4}.xl\:bg-opacity-50{--tw-bg-opacity:0.5}.xl\:bg-opacity-60{--tw-bg-opacity:0.6}.xl\:bg-opacity-70{--tw-bg-opacity:0.7}.xl\:bg-opacity-75{--tw-bg-opacity:0.75}.xl\:bg-opacity-80{--tw-bg-opacity:0.8}.xl\:bg-opacity-90{--tw-bg-opacity:0.9}.xl\:bg-opacity-95{--tw-bg-opacity:0.95}.xl\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .xl\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .xl\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .xl\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .xl\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .xl\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .xl\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .xl\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .xl\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .xl\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .xl\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .xl\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .xl\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .xl\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .xl\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .xl\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.xl\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.xl\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.xl\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.xl\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.xl\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.xl\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.xl\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.xl\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.xl\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.xl\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.xl\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.xl\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.xl\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.xl\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.xl\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.xl\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.xl\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.xl\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.xl\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.xl\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.xl\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.xl\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.xl\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.xl\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.xl\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.xl\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.xl\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.xl\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.xl\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.xl\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.xl\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.xl\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.xl\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.xl\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.xl\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.xl\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.xl\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.xl\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.xl\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.xl\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.xl\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.xl\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.xl\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.xl\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.xl\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.xl\:bg-none{background-image:none}.xl\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.xl\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.xl\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.xl\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.xl\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.xl\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.xl\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.xl\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.xl\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.xl\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.xl\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.xl\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.xl\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.xl\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.xl\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:to-transparent{--tw-gradient-to:transparent}.xl\:to-current{--tw-gradient-to:currentColor}.xl\:to-black{--tw-gradient-to:#000}.xl\:to-white{--tw-gradient-to:#fff}.xl\:to-gray-50{--tw-gradient-to:#f9fafb}.xl\:to-gray-100{--tw-gradient-to:#f3f4f6}.xl\:to-gray-200{--tw-gradient-to:#e5e7eb}.xl\:to-gray-300{--tw-gradient-to:#d1d5db}.xl\:to-gray-400{--tw-gradient-to:#9ca3af}.xl\:to-gray-500{--tw-gradient-to:#6b7280}.xl\:to-gray-600{--tw-gradient-to:#4b5563}.xl\:to-gray-700{--tw-gradient-to:#374151}.xl\:to-gray-800{--tw-gradient-to:#1f2937}.xl\:to-gray-900{--tw-gradient-to:#111827}.xl\:to-red-50{--tw-gradient-to:#fef2f2}.xl\:to-red-100{--tw-gradient-to:#fee2e2}.xl\:to-red-200{--tw-gradient-to:#fecaca}.xl\:to-red-300{--tw-gradient-to:#fca5a5}.xl\:to-red-400{--tw-gradient-to:#f87171}.xl\:to-red-500{--tw-gradient-to:#ef4444}.xl\:to-red-600{--tw-gradient-to:#dc2626}.xl\:to-red-700{--tw-gradient-to:#b91c1c}.xl\:to-red-800{--tw-gradient-to:#991b1b}.xl\:to-red-900{--tw-gradient-to:#7f1d1d}.xl\:to-yellow-50{--tw-gradient-to:#fffbeb}.xl\:to-yellow-100{--tw-gradient-to:#fef3c7}.xl\:to-yellow-200{--tw-gradient-to:#fde68a}.xl\:to-yellow-300{--tw-gradient-to:#fcd34d}.xl\:to-yellow-400{--tw-gradient-to:#fbbf24}.xl\:to-yellow-500{--tw-gradient-to:#f59e0b}.xl\:to-yellow-600{--tw-gradient-to:#d97706}.xl\:to-yellow-700{--tw-gradient-to:#b45309}.xl\:to-yellow-800{--tw-gradient-to:#92400e}.xl\:to-yellow-900{--tw-gradient-to:#78350f}.xl\:to-green-50{--tw-gradient-to:#ecfdf5}.xl\:to-green-100{--tw-gradient-to:#d1fae5}.xl\:to-green-200{--tw-gradient-to:#a7f3d0}.xl\:to-green-300{--tw-gradient-to:#6ee7b7}.xl\:to-green-400{--tw-gradient-to:#34d399}.xl\:to-green-500{--tw-gradient-to:#10b981}.xl\:to-green-600{--tw-gradient-to:#059669}.xl\:to-green-700{--tw-gradient-to:#047857}.xl\:to-green-800{--tw-gradient-to:#065f46}.xl\:to-green-900{--tw-gradient-to:#064e3b}.xl\:to-blue-50{--tw-gradient-to:#eff6ff}.xl\:to-blue-100{--tw-gradient-to:#dbeafe}.xl\:to-blue-200{--tw-gradient-to:#bfdbfe}.xl\:to-blue-300{--tw-gradient-to:#93c5fd}.xl\:to-blue-400{--tw-gradient-to:#60a5fa}.xl\:to-blue-500{--tw-gradient-to:#3b82f6}.xl\:to-blue-600{--tw-gradient-to:#2563eb}.xl\:to-blue-700{--tw-gradient-to:#1d4ed8}.xl\:to-blue-800{--tw-gradient-to:#1e40af}.xl\:to-blue-900{--tw-gradient-to:#1e3a8a}.xl\:to-indigo-50{--tw-gradient-to:#eef2ff}.xl\:to-indigo-100{--tw-gradient-to:#e0e7ff}.xl\:to-indigo-200{--tw-gradient-to:#c7d2fe}.xl\:to-indigo-300{--tw-gradient-to:#a5b4fc}.xl\:to-indigo-400{--tw-gradient-to:#818cf8}.xl\:to-indigo-500{--tw-gradient-to:#6366f1}.xl\:to-indigo-600{--tw-gradient-to:#4f46e5}.xl\:to-indigo-700{--tw-gradient-to:#4338ca}.xl\:to-indigo-800{--tw-gradient-to:#3730a3}.xl\:to-indigo-900{--tw-gradient-to:#312e81}.xl\:to-purple-50{--tw-gradient-to:#f5f3ff}.xl\:to-purple-100{--tw-gradient-to:#ede9fe}.xl\:to-purple-200{--tw-gradient-to:#ddd6fe}.xl\:to-purple-300{--tw-gradient-to:#c4b5fd}.xl\:to-purple-400{--tw-gradient-to:#a78bfa}.xl\:to-purple-500{--tw-gradient-to:#8b5cf6}.xl\:to-purple-600{--tw-gradient-to:#7c3aed}.xl\:to-purple-700{--tw-gradient-to:#6d28d9}.xl\:to-purple-800{--tw-gradient-to:#5b21b6}.xl\:to-purple-900{--tw-gradient-to:#4c1d95}.xl\:to-pink-50{--tw-gradient-to:#fdf2f8}.xl\:to-pink-100{--tw-gradient-to:#fce7f3}.xl\:to-pink-200{--tw-gradient-to:#fbcfe8}.xl\:to-pink-300{--tw-gradient-to:#f9a8d4}.xl\:to-pink-400{--tw-gradient-to:#f472b6}.xl\:to-pink-500{--tw-gradient-to:#ec4899}.xl\:to-pink-600{--tw-gradient-to:#db2777}.xl\:to-pink-700{--tw-gradient-to:#be185d}.xl\:to-pink-800{--tw-gradient-to:#9d174d}.xl\:to-pink-900{--tw-gradient-to:#831843}.xl\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.xl\:hover\:to-current:hover{--tw-gradient-to:currentColor}.xl\:hover\:to-black:hover{--tw-gradient-to:#000}.xl\:hover\:to-white:hover{--tw-gradient-to:#fff}.xl\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.xl\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.xl\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.xl\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.xl\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.xl\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.xl\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.xl\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.xl\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.xl\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.xl\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.xl\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.xl\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.xl\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.xl\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.xl\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.xl\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.xl\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.xl\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.xl\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.xl\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.xl\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.xl\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.xl\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.xl\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.xl\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.xl\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.xl\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.xl\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.xl\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.xl\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.xl\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.xl\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.xl\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.xl\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.xl\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.xl\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.xl\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.xl\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.xl\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.xl\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.xl\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.xl\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.xl\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.xl\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.xl\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.xl\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.xl\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.xl\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.xl\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.xl\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.xl\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.xl\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.xl\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.xl\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.xl\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.xl\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.xl\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.xl\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.xl\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.xl\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.xl\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.xl\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.xl\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.xl\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.xl\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.xl\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.xl\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.xl\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.xl\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.xl\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.xl\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.xl\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.xl\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.xl\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.xl\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.xl\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.xl\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.xl\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.xl\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.xl\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.xl\:focus\:to-current:focus{--tw-gradient-to:currentColor}.xl\:focus\:to-black:focus{--tw-gradient-to:#000}.xl\:focus\:to-white:focus{--tw-gradient-to:#fff}.xl\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.xl\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.xl\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.xl\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.xl\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.xl\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.xl\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.xl\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.xl\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.xl\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.xl\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.xl\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.xl\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.xl\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.xl\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.xl\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.xl\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.xl\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.xl\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.xl\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.xl\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.xl\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.xl\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.xl\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.xl\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.xl\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.xl\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.xl\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.xl\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.xl\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.xl\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.xl\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.xl\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.xl\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.xl\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.xl\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.xl\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.xl\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.xl\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.xl\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.xl\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.xl\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.xl\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.xl\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.xl\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.xl\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.xl\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.xl\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.xl\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.xl\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.xl\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.xl\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.xl\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.xl\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.xl\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.xl\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.xl\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.xl\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.xl\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.xl\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.xl\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.xl\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.xl\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.xl\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.xl\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.xl\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.xl\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.xl\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.xl\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.xl\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.xl\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.xl\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.xl\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.xl\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.xl\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.xl\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.xl\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.xl\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.xl\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.xl\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.xl\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.xl\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.xl\:bg-auto{background-size:auto}.xl\:bg-cover{background-size:cover}.xl\:bg-contain{background-size:contain}.xl\:bg-fixed{background-attachment:fixed}.xl\:bg-local{background-attachment:local}.xl\:bg-scroll{background-attachment:scroll}.xl\:bg-clip-border{background-clip:initial}.xl\:bg-clip-padding{background-clip:padding-box}.xl\:bg-clip-content{background-clip:content-box}.xl\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.xl\:bg-bottom{background-position:bottom}.xl\:bg-center{background-position:50%}.xl\:bg-left{background-position:0}.xl\:bg-left-bottom{background-position:0 100%}.xl\:bg-left-top{background-position:0 0}.xl\:bg-right{background-position:100%}.xl\:bg-right-bottom{background-position:100% 100%}.xl\:bg-right-top{background-position:100% 0}.xl\:bg-top{background-position:top}.xl\:bg-repeat{background-repeat:repeat}.xl\:bg-no-repeat{background-repeat:no-repeat}.xl\:bg-repeat-x{background-repeat:repeat-x}.xl\:bg-repeat-y{background-repeat:repeat-y}.xl\:bg-repeat-round{background-repeat:round}.xl\:bg-repeat-space{background-repeat:space}.xl\:bg-origin-border{background-origin:border-box}.xl\:bg-origin-padding{background-origin:initial}.xl\:bg-origin-content{background-origin:content-box}.xl\:fill-current{fill:currentColor}.xl\:stroke-current{stroke:currentColor}.xl\:stroke-0{stroke-width:0}.xl\:stroke-1{stroke-width:1}.xl\:stroke-2{stroke-width:2}.xl\:object-contain{-o-object-fit:contain;object-fit:contain}.xl\:object-cover{-o-object-fit:cover;object-fit:cover}.xl\:object-fill{-o-object-fit:fill;object-fit:fill}.xl\:object-none{-o-object-fit:none;object-fit:none}.xl\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.xl\:object-bottom{-o-object-position:bottom;object-position:bottom}.xl\:object-center{-o-object-position:center;object-position:center}.xl\:object-left{-o-object-position:left;object-position:left}.xl\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.xl\:object-left-top{-o-object-position:left top;object-position:left top}.xl\:object-right{-o-object-position:right;object-position:right}.xl\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.xl\:object-right-top{-o-object-position:right top;object-position:right top}.xl\:object-top{-o-object-position:top;object-position:top}.xl\:p-0{padding:0}.xl\:p-1{padding:.25rem}.xl\:p-2{padding:.5rem}.xl\:p-3{padding:.75rem}.xl\:p-4{padding:1rem}.xl\:p-5{padding:1.25rem}.xl\:p-6{padding:1.5rem}.xl\:p-7{padding:1.75rem}.xl\:p-8{padding:2rem}.xl\:p-9{padding:2.25rem}.xl\:p-10{padding:2.5rem}.xl\:p-11{padding:2.75rem}.xl\:p-12{padding:3rem}.xl\:p-14{padding:3.5rem}.xl\:p-16{padding:4rem}.xl\:p-20{padding:5rem}.xl\:p-24{padding:6rem}.xl\:p-28{padding:7rem}.xl\:p-32{padding:8rem}.xl\:p-36{padding:9rem}.xl\:p-40{padding:10rem}.xl\:p-44{padding:11rem}.xl\:p-48{padding:12rem}.xl\:p-52{padding:13rem}.xl\:p-56{padding:14rem}.xl\:p-60{padding:15rem}.xl\:p-64{padding:16rem}.xl\:p-72{padding:18rem}.xl\:p-80{padding:20rem}.xl\:p-96{padding:24rem}.xl\:p-px{padding:1px}.xl\:p-0\.5{padding:.125rem}.xl\:p-1\.5{padding:.375rem}.xl\:p-2\.5{padding:.625rem}.xl\:p-3\.5{padding:.875rem}.xl\:px-0{padding-left:0;padding-right:0}.xl\:px-1{padding-left:.25rem;padding-right:.25rem}.xl\:px-2{padding-left:.5rem;padding-right:.5rem}.xl\:px-3{padding-left:.75rem;padding-right:.75rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.xl\:px-6{padding-left:1.5rem;padding-right:1.5rem}.xl\:px-7{padding-left:1.75rem;padding-right:1.75rem}.xl\:px-8{padding-left:2rem;padding-right:2rem}.xl\:px-9{padding-left:2.25rem;padding-right:2.25rem}.xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.xl\:px-11{padding-left:2.75rem;padding-right:2.75rem}.xl\:px-12{padding-left:3rem;padding-right:3rem}.xl\:px-14{padding-left:3.5rem;padding-right:3.5rem}.xl\:px-16{padding-left:4rem;padding-right:4rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:px-24{padding-left:6rem;padding-right:6rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:px-32{padding-left:8rem;padding-right:8rem}.xl\:px-36{padding-left:9rem;padding-right:9rem}.xl\:px-40{padding-left:10rem;padding-right:10rem}.xl\:px-44{padding-left:11rem;padding-right:11rem}.xl\:px-48{padding-left:12rem;padding-right:12rem}.xl\:px-52{padding-left:13rem;padding-right:13rem}.xl\:px-56{padding-left:14rem;padding-right:14rem}.xl\:px-60{padding-left:15rem;padding-right:15rem}.xl\:px-64{padding-left:16rem;padding-right:16rem}.xl\:px-72{padding-left:18rem;padding-right:18rem}.xl\:px-80{padding-left:20rem;padding-right:20rem}.xl\:px-96{padding-left:24rem;padding-right:24rem}.xl\:px-px{padding-left:1px;padding-right:1px}.xl\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.xl\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.xl\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.xl\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.xl\:py-0{padding-top:0;padding-bottom:0}.xl\:py-1{padding-top:.25rem;padding-bottom:.25rem}.xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.xl\:py-3{padding-top:.75rem;padding-bottom:.75rem}.xl\:py-4{padding-top:1rem;padding-bottom:1rem}.xl\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.xl\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.xl\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.xl\:py-8{padding-top:2rem;padding-bottom:2rem}.xl\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.xl\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.xl\:py-12{padding-top:3rem;padding-bottom:3rem}.xl\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.xl\:py-16{padding-top:4rem;padding-bottom:4rem}.xl\:py-20{padding-top:5rem;padding-bottom:5rem}.xl\:py-24{padding-top:6rem;padding-bottom:6rem}.xl\:py-28{padding-top:7rem;padding-bottom:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}.xl\:py-36{padding-top:9rem;padding-bottom:9rem}.xl\:py-40{padding-top:10rem;padding-bottom:10rem}.xl\:py-44{padding-top:11rem;padding-bottom:11rem}.xl\:py-48{padding-top:12rem;padding-bottom:12rem}.xl\:py-52{padding-top:13rem;padding-bottom:13rem}.xl\:py-56{padding-top:14rem;padding-bottom:14rem}.xl\:py-60{padding-top:15rem;padding-bottom:15rem}.xl\:py-64{padding-top:16rem;padding-bottom:16rem}.xl\:py-72{padding-top:18rem;padding-bottom:18rem}.xl\:py-80{padding-top:20rem;padding-bottom:20rem}.xl\:py-96{padding-top:24rem;padding-bottom:24rem}.xl\:py-px{padding-top:1px;padding-bottom:1px}.xl\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.xl\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.xl\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.xl\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.xl\:pt-0{padding-top:0}.xl\:pt-1{padding-top:.25rem}.xl\:pt-2{padding-top:.5rem}.xl\:pt-3{padding-top:.75rem}.xl\:pt-4{padding-top:1rem}.xl\:pt-5{padding-top:1.25rem}.xl\:pt-6{padding-top:1.5rem}.xl\:pt-7{padding-top:1.75rem}.xl\:pt-8{padding-top:2rem}.xl\:pt-9{padding-top:2.25rem}.xl\:pt-10{padding-top:2.5rem}.xl\:pt-11{padding-top:2.75rem}.xl\:pt-12{padding-top:3rem}.xl\:pt-14{padding-top:3.5rem}.xl\:pt-16{padding-top:4rem}.xl\:pt-20{padding-top:5rem}.xl\:pt-24{padding-top:6rem}.xl\:pt-28{padding-top:7rem}.xl\:pt-32{padding-top:8rem}.xl\:pt-36{padding-top:9rem}.xl\:pt-40{padding-top:10rem}.xl\:pt-44{padding-top:11rem}.xl\:pt-48{padding-top:12rem}.xl\:pt-52{padding-top:13rem}.xl\:pt-56{padding-top:14rem}.xl\:pt-60{padding-top:15rem}.xl\:pt-64{padding-top:16rem}.xl\:pt-72{padding-top:18rem}.xl\:pt-80{padding-top:20rem}.xl\:pt-96{padding-top:24rem}.xl\:pt-px{padding-top:1px}.xl\:pt-0\.5{padding-top:.125rem}.xl\:pt-1\.5{padding-top:.375rem}.xl\:pt-2\.5{padding-top:.625rem}.xl\:pt-3\.5{padding-top:.875rem}.xl\:pr-0{padding-right:0}.xl\:pr-1{padding-right:.25rem}.xl\:pr-2{padding-right:.5rem}.xl\:pr-3{padding-right:.75rem}.xl\:pr-4{padding-right:1rem}.xl\:pr-5{padding-right:1.25rem}.xl\:pr-6{padding-right:1.5rem}.xl\:pr-7{padding-right:1.75rem}.xl\:pr-8{padding-right:2rem}.xl\:pr-9{padding-right:2.25rem}.xl\:pr-10{padding-right:2.5rem}.xl\:pr-11{padding-right:2.75rem}.xl\:pr-12{padding-right:3rem}.xl\:pr-14{padding-right:3.5rem}.xl\:pr-16{padding-right:4rem}.xl\:pr-20{padding-right:5rem}.xl\:pr-24{padding-right:6rem}.xl\:pr-28{padding-right:7rem}.xl\:pr-32{padding-right:8rem}.xl\:pr-36{padding-right:9rem}.xl\:pr-40{padding-right:10rem}.xl\:pr-44{padding-right:11rem}.xl\:pr-48{padding-right:12rem}.xl\:pr-52{padding-right:13rem}.xl\:pr-56{padding-right:14rem}.xl\:pr-60{padding-right:15rem}.xl\:pr-64{padding-right:16rem}.xl\:pr-72{padding-right:18rem}.xl\:pr-80{padding-right:20rem}.xl\:pr-96{padding-right:24rem}.xl\:pr-px{padding-right:1px}.xl\:pr-0\.5{padding-right:.125rem}.xl\:pr-1\.5{padding-right:.375rem}.xl\:pr-2\.5{padding-right:.625rem}.xl\:pr-3\.5{padding-right:.875rem}.xl\:pb-0{padding-bottom:0}.xl\:pb-1{padding-bottom:.25rem}.xl\:pb-2{padding-bottom:.5rem}.xl\:pb-3{padding-bottom:.75rem}.xl\:pb-4{padding-bottom:1rem}.xl\:pb-5{padding-bottom:1.25rem}.xl\:pb-6{padding-bottom:1.5rem}.xl\:pb-7{padding-bottom:1.75rem}.xl\:pb-8{padding-bottom:2rem}.xl\:pb-9{padding-bottom:2.25rem}.xl\:pb-10{padding-bottom:2.5rem}.xl\:pb-11{padding-bottom:2.75rem}.xl\:pb-12{padding-bottom:3rem}.xl\:pb-14{padding-bottom:3.5rem}.xl\:pb-16{padding-bottom:4rem}.xl\:pb-20{padding-bottom:5rem}.xl\:pb-24{padding-bottom:6rem}.xl\:pb-28{padding-bottom:7rem}.xl\:pb-32{padding-bottom:8rem}.xl\:pb-36{padding-bottom:9rem}.xl\:pb-40{padding-bottom:10rem}.xl\:pb-44{padding-bottom:11rem}.xl\:pb-48{padding-bottom:12rem}.xl\:pb-52{padding-bottom:13rem}.xl\:pb-56{padding-bottom:14rem}.xl\:pb-60{padding-bottom:15rem}.xl\:pb-64{padding-bottom:16rem}.xl\:pb-72{padding-bottom:18rem}.xl\:pb-80{padding-bottom:20rem}.xl\:pb-96{padding-bottom:24rem}.xl\:pb-px{padding-bottom:1px}.xl\:pb-0\.5{padding-bottom:.125rem}.xl\:pb-1\.5{padding-bottom:.375rem}.xl\:pb-2\.5{padding-bottom:.625rem}.xl\:pb-3\.5{padding-bottom:.875rem}.xl\:pl-0{padding-left:0}.xl\:pl-1{padding-left:.25rem}.xl\:pl-2{padding-left:.5rem}.xl\:pl-3{padding-left:.75rem}.xl\:pl-4{padding-left:1rem}.xl\:pl-5{padding-left:1.25rem}.xl\:pl-6{padding-left:1.5rem}.xl\:pl-7{padding-left:1.75rem}.xl\:pl-8{padding-left:2rem}.xl\:pl-9{padding-left:2.25rem}.xl\:pl-10{padding-left:2.5rem}.xl\:pl-11{padding-left:2.75rem}.xl\:pl-12{padding-left:3rem}.xl\:pl-14{padding-left:3.5rem}.xl\:pl-16{padding-left:4rem}.xl\:pl-20{padding-left:5rem}.xl\:pl-24{padding-left:6rem}.xl\:pl-28{padding-left:7rem}.xl\:pl-32{padding-left:8rem}.xl\:pl-36{padding-left:9rem}.xl\:pl-40{padding-left:10rem}.xl\:pl-44{padding-left:11rem}.xl\:pl-48{padding-left:12rem}.xl\:pl-52{padding-left:13rem}.xl\:pl-56{padding-left:14rem}.xl\:pl-60{padding-left:15rem}.xl\:pl-64{padding-left:16rem}.xl\:pl-72{padding-left:18rem}.xl\:pl-80{padding-left:20rem}.xl\:pl-96{padding-left:24rem}.xl\:pl-px{padding-left:1px}.xl\:pl-0\.5{padding-left:.125rem}.xl\:pl-1\.5{padding-left:.375rem}.xl\:pl-2\.5{padding-left:.625rem}.xl\:pl-3\.5{padding-left:.875rem}.xl\:text-left{text-align:left}.xl\:text-center{text-align:center}.xl\:text-right{text-align:right}.xl\:text-justify{text-align:justify}.xl\:align-baseline{vertical-align:initial}.xl\:align-top{vertical-align:top}.xl\:align-middle{vertical-align:middle}.xl\:align-bottom{vertical-align:bottom}.xl\:align-text-top{vertical-align:text-top}.xl\:align-text-bottom{vertical-align:text-bottom}.xl\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.xl\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.xl\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.xl\:text-xs{font-size:.75rem;line-height:1rem}.xl\:text-sm{font-size:.875rem;line-height:1.25rem}.xl\:text-base{font-size:1rem;line-height:1.5rem}.xl\:text-lg{font-size:1.125rem;line-height:1.75rem}.xl\:text-xl{font-size:1.25rem;line-height:1.75rem}.xl\:text-2xl{font-size:1.5rem;line-height:2rem}.xl\:text-3xl{font-size:1.875rem;line-height:2.25rem}.xl\:text-4xl{font-size:2.25rem;line-height:2.5rem}.xl\:text-5xl{font-size:3rem;line-height:1}.xl\:text-6xl{font-size:3.75rem;line-height:1}.xl\:text-7xl{font-size:4.5rem;line-height:1}.xl\:text-8xl{font-size:6rem;line-height:1}.xl\:text-9xl{font-size:8rem;line-height:1}.xl\:font-thin{font-weight:100}.xl\:font-extralight{font-weight:200}.xl\:font-light{font-weight:300}.xl\:font-normal{font-weight:400}.xl\:font-medium{font-weight:500}.xl\:font-semibold{font-weight:600}.xl\:font-bold{font-weight:700}.xl\:font-extrabold{font-weight:800}.xl\:font-black{font-weight:900}.xl\:uppercase{text-transform:uppercase}.xl\:lowercase{text-transform:lowercase}.xl\:capitalize{text-transform:capitalize}.xl\:normal-case{text-transform:none}.xl\:italic{font-style:italic}.xl\:not-italic{font-style:normal}.xl\:diagonal-fractions,.xl\:lining-nums,.xl\:oldstyle-nums,.xl\:ordinal,.xl\:proportional-nums,.xl\:slashed-zero,.xl\:stacked-fractions,.xl\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.xl\:normal-nums{font-variant-numeric:normal}.xl\:ordinal{--tw-ordinal:ordinal}.xl\:slashed-zero{--tw-slashed-zero:slashed-zero}.xl\:lining-nums{--tw-numeric-figure:lining-nums}.xl\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.xl\:proportional-nums{--tw-numeric-spacing:proportional-nums}.xl\:tabular-nums{--tw-numeric-spacing:tabular-nums}.xl\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.xl\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.xl\:leading-3{line-height:.75rem}.xl\:leading-4{line-height:1rem}.xl\:leading-5{line-height:1.25rem}.xl\:leading-6{line-height:1.5rem}.xl\:leading-7{line-height:1.75rem}.xl\:leading-8{line-height:2rem}.xl\:leading-9{line-height:2.25rem}.xl\:leading-10{line-height:2.5rem}.xl\:leading-none{line-height:1}.xl\:leading-tight{line-height:1.25}.xl\:leading-snug{line-height:1.375}.xl\:leading-normal{line-height:1.5}.xl\:leading-relaxed{line-height:1.625}.xl\:leading-loose{line-height:2}.xl\:tracking-tighter{letter-spacing:-.05em}.xl\:tracking-tight{letter-spacing:-.025em}.xl\:tracking-normal{letter-spacing:0}.xl\:tracking-wide{letter-spacing:.025em}.xl\:tracking-wider{letter-spacing:.05em}.xl\:tracking-widest{letter-spacing:.1em}.xl\:text-transparent{color:transparent}.xl\:text-current{color:currentColor}.xl\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-transparent{color:transparent}.group:hover .xl\:group-hover\:text-current{color:currentColor}.group:hover .xl\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:focus-within\:text-transparent:focus-within{color:transparent}.xl\:focus-within\:text-current:focus-within{color:currentColor}.xl\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:hover\:text-transparent:hover{color:transparent}.xl\:hover\:text-current:hover{color:currentColor}.xl\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:focus\:text-transparent:focus{color:transparent}.xl\:focus\:text-current:focus{color:currentColor}.xl\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:text-opacity-0{--tw-text-opacity:0}.xl\:text-opacity-5{--tw-text-opacity:0.05}.xl\:text-opacity-10{--tw-text-opacity:0.1}.xl\:text-opacity-20{--tw-text-opacity:0.2}.xl\:text-opacity-25{--tw-text-opacity:0.25}.xl\:text-opacity-30{--tw-text-opacity:0.3}.xl\:text-opacity-40{--tw-text-opacity:0.4}.xl\:text-opacity-50{--tw-text-opacity:0.5}.xl\:text-opacity-60{--tw-text-opacity:0.6}.xl\:text-opacity-70{--tw-text-opacity:0.7}.xl\:text-opacity-75{--tw-text-opacity:0.75}.xl\:text-opacity-80{--tw-text-opacity:0.8}.xl\:text-opacity-90{--tw-text-opacity:0.9}.xl\:text-opacity-95{--tw-text-opacity:0.95}.xl\:text-opacity-100{--tw-text-opacity:1}.group:hover .xl\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .xl\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .xl\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .xl\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .xl\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .xl\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .xl\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .xl\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .xl\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .xl\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .xl\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .xl\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .xl\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .xl\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .xl\:group-hover\:text-opacity-100{--tw-text-opacity:1}.xl\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.xl\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.xl\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.xl\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.xl\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.xl\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.xl\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.xl\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.xl\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.xl\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.xl\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.xl\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.xl\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.xl\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.xl\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.xl\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.xl\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.xl\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.xl\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.xl\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.xl\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.xl\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.xl\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.xl\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.xl\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.xl\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.xl\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.xl\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.xl\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.xl\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.xl\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.xl\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.xl\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.xl\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.xl\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.xl\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.xl\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.xl\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.xl\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.xl\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.xl\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.xl\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.xl\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.xl\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.xl\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.xl\:underline{text-decoration:underline}.xl\:line-through{text-decoration:line-through}.xl\:no-underline{text-decoration:none}.group:hover .xl\:group-hover\:underline{text-decoration:underline}.group:hover .xl\:group-hover\:line-through{text-decoration:line-through}.group:hover .xl\:group-hover\:no-underline{text-decoration:none}.xl\:focus-within\:underline:focus-within{text-decoration:underline}.xl\:focus-within\:line-through:focus-within{text-decoration:line-through}.xl\:focus-within\:no-underline:focus-within{text-decoration:none}.xl\:hover\:underline:hover{text-decoration:underline}.xl\:hover\:line-through:hover{text-decoration:line-through}.xl\:hover\:no-underline:hover{text-decoration:none}.xl\:focus\:underline:focus{text-decoration:underline}.xl\:focus\:line-through:focus{text-decoration:line-through}.xl\:focus\:no-underline:focus{text-decoration:none}.xl\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.xl\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.xl\:placeholder-transparent::-moz-placeholder{color:transparent}.xl\:placeholder-transparent:-ms-input-placeholder{color:transparent}.xl\:placeholder-transparent::placeholder{color:transparent}.xl\:placeholder-current::-moz-placeholder{color:currentColor}.xl\:placeholder-current:-ms-input-placeholder{color:currentColor}.xl\:placeholder-current::placeholder{color:currentColor}.xl\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.xl\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus::placeholder{color:currentColor}.xl\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.xl\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.xl\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.xl\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.xl\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.xl\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.xl\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.xl\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.xl\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.xl\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.xl\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.xl\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.xl\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.xl\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.xl\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.xl\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.xl\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.xl\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.xl\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.xl\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.xl\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.xl\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.xl\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.xl\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.xl\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.xl\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.xl\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.xl\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.xl\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.xl\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.xl\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.xl\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.xl\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.xl\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.xl\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.xl\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.xl\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.xl\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.xl\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.xl\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.xl\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.xl\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.xl\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.xl\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.xl\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.xl\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.xl\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.xl\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.xl\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.xl\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.xl\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.xl\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.xl\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.xl\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.xl\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.xl\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.xl\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.xl\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.xl\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.xl\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.xl\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.xl\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.xl\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.xl\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.xl\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.xl\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.xl\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.xl\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.xl\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.xl\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.xl\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.xl\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.xl\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.xl\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.xl\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.xl\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.xl\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.xl\:opacity-0{opacity:0}.xl\:opacity-5{opacity:.05}.xl\:opacity-10{opacity:.1}.xl\:opacity-20{opacity:.2}.xl\:opacity-25{opacity:.25}.xl\:opacity-30{opacity:.3}.xl\:opacity-40{opacity:.4}.xl\:opacity-50{opacity:.5}.xl\:opacity-60{opacity:.6}.xl\:opacity-70{opacity:.7}.xl\:opacity-75{opacity:.75}.xl\:opacity-80{opacity:.8}.xl\:opacity-90{opacity:.9}.xl\:opacity-95{opacity:.95}.xl\:opacity-100{opacity:1}.group:hover .xl\:group-hover\:opacity-0{opacity:0}.group:hover .xl\:group-hover\:opacity-5{opacity:.05}.group:hover .xl\:group-hover\:opacity-10{opacity:.1}.group:hover .xl\:group-hover\:opacity-20{opacity:.2}.group:hover .xl\:group-hover\:opacity-25{opacity:.25}.group:hover .xl\:group-hover\:opacity-30{opacity:.3}.group:hover .xl\:group-hover\:opacity-40{opacity:.4}.group:hover .xl\:group-hover\:opacity-50{opacity:.5}.group:hover .xl\:group-hover\:opacity-60{opacity:.6}.group:hover .xl\:group-hover\:opacity-70{opacity:.7}.group:hover .xl\:group-hover\:opacity-75{opacity:.75}.group:hover .xl\:group-hover\:opacity-80{opacity:.8}.group:hover .xl\:group-hover\:opacity-90{opacity:.9}.group:hover .xl\:group-hover\:opacity-95{opacity:.95}.group:hover .xl\:group-hover\:opacity-100{opacity:1}.xl\:focus-within\:opacity-0:focus-within{opacity:0}.xl\:focus-within\:opacity-5:focus-within{opacity:.05}.xl\:focus-within\:opacity-10:focus-within{opacity:.1}.xl\:focus-within\:opacity-20:focus-within{opacity:.2}.xl\:focus-within\:opacity-25:focus-within{opacity:.25}.xl\:focus-within\:opacity-30:focus-within{opacity:.3}.xl\:focus-within\:opacity-40:focus-within{opacity:.4}.xl\:focus-within\:opacity-50:focus-within{opacity:.5}.xl\:focus-within\:opacity-60:focus-within{opacity:.6}.xl\:focus-within\:opacity-70:focus-within{opacity:.7}.xl\:focus-within\:opacity-75:focus-within{opacity:.75}.xl\:focus-within\:opacity-80:focus-within{opacity:.8}.xl\:focus-within\:opacity-90:focus-within{opacity:.9}.xl\:focus-within\:opacity-95:focus-within{opacity:.95}.xl\:focus-within\:opacity-100:focus-within{opacity:1}.xl\:hover\:opacity-0:hover{opacity:0}.xl\:hover\:opacity-5:hover{opacity:.05}.xl\:hover\:opacity-10:hover{opacity:.1}.xl\:hover\:opacity-20:hover{opacity:.2}.xl\:hover\:opacity-25:hover{opacity:.25}.xl\:hover\:opacity-30:hover{opacity:.3}.xl\:hover\:opacity-40:hover{opacity:.4}.xl\:hover\:opacity-50:hover{opacity:.5}.xl\:hover\:opacity-60:hover{opacity:.6}.xl\:hover\:opacity-70:hover{opacity:.7}.xl\:hover\:opacity-75:hover{opacity:.75}.xl\:hover\:opacity-80:hover{opacity:.8}.xl\:hover\:opacity-90:hover{opacity:.9}.xl\:hover\:opacity-95:hover{opacity:.95}.xl\:hover\:opacity-100:hover{opacity:1}.xl\:focus\:opacity-0:focus{opacity:0}.xl\:focus\:opacity-5:focus{opacity:.05}.xl\:focus\:opacity-10:focus{opacity:.1}.xl\:focus\:opacity-20:focus{opacity:.2}.xl\:focus\:opacity-25:focus{opacity:.25}.xl\:focus\:opacity-30:focus{opacity:.3}.xl\:focus\:opacity-40:focus{opacity:.4}.xl\:focus\:opacity-50:focus{opacity:.5}.xl\:focus\:opacity-60:focus{opacity:.6}.xl\:focus\:opacity-70:focus{opacity:.7}.xl\:focus\:opacity-75:focus{opacity:.75}.xl\:focus\:opacity-80:focus{opacity:.8}.xl\:focus\:opacity-90:focus{opacity:.9}.xl\:focus\:opacity-95:focus{opacity:.95}.xl\:focus\:opacity-100:focus{opacity:1}.xl\:bg-blend-normal{background-blend-mode:normal}.xl\:bg-blend-multiply{background-blend-mode:multiply}.xl\:bg-blend-screen{background-blend-mode:screen}.xl\:bg-blend-overlay{background-blend-mode:overlay}.xl\:bg-blend-darken{background-blend-mode:darken}.xl\:bg-blend-lighten{background-blend-mode:lighten}.xl\:bg-blend-color-dodge{background-blend-mode:color-dodge}.xl\:bg-blend-color-burn{background-blend-mode:color-burn}.xl\:bg-blend-hard-light{background-blend-mode:hard-light}.xl\:bg-blend-soft-light{background-blend-mode:soft-light}.xl\:bg-blend-difference{background-blend-mode:difference}.xl\:bg-blend-exclusion{background-blend-mode:exclusion}.xl\:bg-blend-hue{background-blend-mode:hue}.xl\:bg-blend-saturation{background-blend-mode:saturation}.xl\:bg-blend-color{background-blend-mode:color}.xl\:bg-blend-luminosity{background-blend-mode:luminosity}.xl\:mix-blend-normal{mix-blend-mode:normal}.xl\:mix-blend-multiply{mix-blend-mode:multiply}.xl\:mix-blend-screen{mix-blend-mode:screen}.xl\:mix-blend-overlay{mix-blend-mode:overlay}.xl\:mix-blend-darken{mix-blend-mode:darken}.xl\:mix-blend-lighten{mix-blend-mode:lighten}.xl\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.xl\:mix-blend-color-burn{mix-blend-mode:color-burn}.xl\:mix-blend-hard-light{mix-blend-mode:hard-light}.xl\:mix-blend-soft-light{mix-blend-mode:soft-light}.xl\:mix-blend-difference{mix-blend-mode:difference}.xl\:mix-blend-exclusion{mix-blend-mode:exclusion}.xl\:mix-blend-hue{mix-blend-mode:hue}.xl\:mix-blend-saturation{mix-blend-mode:saturation}.xl\:mix-blend-color{mix-blend-mode:color}.xl\:mix-blend-luminosity{mix-blend-mode:luminosity}.xl\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.xl\:shadow,.xl\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.xl\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.xl\:shadow-lg,.xl\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.xl\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.xl\:shadow-2xl,.xl\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.xl\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.xl\:shadow-inner,.xl\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .xl\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .xl\:group-hover\:shadow,.group:hover .xl\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .xl\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .xl\:group-hover\:shadow-lg,.group:hover .xl\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .xl\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .xl\:group-hover\:shadow-2xl,.group:hover .xl\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .xl\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .xl\:group-hover\:shadow-inner,.group:hover .xl\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.xl\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.xl\:hover\:shadow-sm:hover,.xl\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.xl\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.xl\:hover\:shadow-lg:hover,.xl\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.xl\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.xl\:hover\:shadow-2xl:hover,.xl\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.xl\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.xl\:hover\:shadow-inner:hover,.xl\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.xl\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.xl\:focus\:shadow-sm:focus,.xl\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.xl\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.xl\:focus\:shadow-lg:focus,.xl\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.xl\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.xl\:focus\:shadow-2xl:focus,.xl\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.xl\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.xl\:focus\:shadow-inner:focus,.xl\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.xl\:outline-none{outline:2px solid transparent;outline-offset:2px}.xl\:outline-white{outline:2px dotted #fff;outline-offset:2px}.xl\:outline-black{outline:2px dotted #000;outline-offset:2px}.xl\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.xl\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.xl\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.xl\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.xl\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.xl\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.xl\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-0,.xl\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-2,.xl\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring,.xl\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-0:focus,.xl\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-2:focus,.xl\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-8:focus,.xl\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-inset{--tw-ring-inset:inset}.xl\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.xl\:focus\:ring-inset:focus{--tw-ring-inset:inset}.xl\:ring-transparent{--tw-ring-color:transparent}.xl\:ring-current{--tw-ring-color:currentColor}.xl\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.xl\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.xl\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.xl\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.xl\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.xl\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.xl\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.xl\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.xl\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.xl\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.xl\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.xl\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.xl\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.xl\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.xl\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.xl\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.xl\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.xl\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.xl\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.xl\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.xl\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.xl\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.xl\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.xl\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.xl\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.xl\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.xl\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.xl\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.xl\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.xl\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.xl\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.xl\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.xl\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.xl\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.xl\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.xl\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.xl\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.xl\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.xl\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.xl\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.xl\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.xl\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.xl\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.xl\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.xl\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.xl\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.xl\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.xl\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.xl\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.xl\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.xl\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.xl\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.xl\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.xl\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.xl\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.xl\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.xl\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.xl\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.xl\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.xl\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.xl\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.xl\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.xl\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.xl\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.xl\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.xl\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.xl\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.xl\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.xl\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.xl\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.xl\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.xl\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.xl\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.xl\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.xl\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.xl\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.xl\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.xl\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.xl\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.xl\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.xl\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.xl\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.xl\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.xl\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.xl\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.xl\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.xl\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.xl\:focus\:ring-current:focus{--tw-ring-color:currentColor}.xl\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.xl\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.xl\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.xl\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.xl\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.xl\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.xl\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.xl\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.xl\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.xl\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.xl\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.xl\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.xl\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.xl\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.xl\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.xl\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.xl\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.xl\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.xl\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.xl\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.xl\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.xl\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.xl\:ring-opacity-0{--tw-ring-opacity:0}.xl\:ring-opacity-5{--tw-ring-opacity:0.05}.xl\:ring-opacity-10{--tw-ring-opacity:0.1}.xl\:ring-opacity-20{--tw-ring-opacity:0.2}.xl\:ring-opacity-25{--tw-ring-opacity:0.25}.xl\:ring-opacity-30{--tw-ring-opacity:0.3}.xl\:ring-opacity-40{--tw-ring-opacity:0.4}.xl\:ring-opacity-50{--tw-ring-opacity:0.5}.xl\:ring-opacity-60{--tw-ring-opacity:0.6}.xl\:ring-opacity-70{--tw-ring-opacity:0.7}.xl\:ring-opacity-75{--tw-ring-opacity:0.75}.xl\:ring-opacity-80{--tw-ring-opacity:0.8}.xl\:ring-opacity-90{--tw-ring-opacity:0.9}.xl\:ring-opacity-95{--tw-ring-opacity:0.95}.xl\:ring-opacity-100{--tw-ring-opacity:1}.xl\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.xl\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.xl\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.xl\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.xl\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.xl\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.xl\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.xl\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.xl\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.xl\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.xl\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.xl\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.xl\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.xl\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.xl\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.xl\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.xl\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.xl\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.xl\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.xl\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.xl\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.xl\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.xl\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.xl\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.xl\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.xl\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.xl\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.xl\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.xl\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.xl\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.xl\:ring-offset-0{--tw-ring-offset-width:0px}.xl\:ring-offset-1{--tw-ring-offset-width:1px}.xl\:ring-offset-2{--tw-ring-offset-width:2px}.xl\:ring-offset-4{--tw-ring-offset-width:4px}.xl\:ring-offset-8{--tw-ring-offset-width:8px}.xl\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.xl\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.xl\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.xl\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.xl\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.xl\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.xl\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.xl\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.xl\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.xl\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.xl\:ring-offset-transparent{--tw-ring-offset-color:transparent}.xl\:ring-offset-current{--tw-ring-offset-color:currentColor}.xl\:ring-offset-black{--tw-ring-offset-color:#000}.xl\:ring-offset-white{--tw-ring-offset-color:#fff}.xl\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.xl\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.xl\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.xl\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.xl\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.xl\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.xl\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.xl\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.xl\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.xl\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.xl\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.xl\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.xl\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.xl\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.xl\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.xl\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.xl\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.xl\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.xl\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.xl\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.xl\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.xl\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.xl\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.xl\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.xl\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.xl\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.xl\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.xl\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.xl\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.xl\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.xl\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.xl\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.xl\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.xl\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.xl\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.xl\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.xl\:ring-offset-green-600{--tw-ring-offset-color:#059669}.xl\:ring-offset-green-700{--tw-ring-offset-color:#047857}.xl\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.xl\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.xl\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.xl\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.xl\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.xl\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.xl\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.xl\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.xl\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.xl\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.xl\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.xl\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.xl\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.xl\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.xl\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.xl\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.xl\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.xl\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.xl\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.xl\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.xl\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.xl\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.xl\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.xl\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.xl\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.xl\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.xl\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.xl\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.xl\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.xl\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.xl\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.xl\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.xl\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.xl\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.xl\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.xl\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.xl\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.xl\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.xl\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.xl\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.xl\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.xl\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.xl\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.xl\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.xl\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.xl\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.xl\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.xl\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.xl\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.xl\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.xl\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.xl\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.xl\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.xl\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.xl\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.xl\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.xl\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.xl\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.xl\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.xl\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.xl\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.xl\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.xl\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.xl\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.xl\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.xl\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.xl\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.xl\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.xl\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.xl\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.xl\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.xl\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.xl\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.xl\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.xl\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.xl\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.xl\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.xl\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.xl\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.xl\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.xl\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.xl\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.xl\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.xl\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.xl\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.xl\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.xl\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.xl\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.xl\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.xl\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.xl\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.xl\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.xl\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.xl\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.xl\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.xl\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.xl\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.xl\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.xl\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.xl\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.xl\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.xl\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.xl\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.xl\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.xl\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.xl\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.xl\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.xl\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.xl\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.xl\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.xl\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.xl\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.xl\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.xl\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.xl\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.xl\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.xl\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.xl\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.xl\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.xl\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.xl\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.xl\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.xl\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.xl\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.xl\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.xl\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.xl\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.xl\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.xl\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.xl\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.xl\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.xl\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.xl\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.xl\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.xl\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.xl\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.xl\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.xl\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.xl\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.xl\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.xl\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.xl\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.xl\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.xl\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.xl\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.xl\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.xl\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.xl\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.xl\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.xl\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.xl\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.xl\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.xl\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.xl\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.xl\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.xl\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.xl\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.xl\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.xl\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.xl\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.xl\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.xl\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.xl\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.xl\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.xl\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.xl\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.xl\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.xl\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.xl\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.xl\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.xl\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.xl\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.xl\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.xl\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.xl\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.xl\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.xl\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.xl\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.xl\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.xl\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.xl\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.xl\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.xl\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.xl\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.xl\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.xl\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.xl\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.xl\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.xl\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.xl\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.xl\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.xl\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.xl\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.xl\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.xl\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.xl\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.xl\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.xl\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.xl\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.xl\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.xl\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.xl\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.xl\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.xl\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.xl\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.xl\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.xl\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.xl\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.xl\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.xl\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.xl\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.xl\:filter-none{filter:none}.xl\:blur-0,.xl\:blur-none{--tw-blur:blur(0)}.xl\:blur-sm{--tw-blur:blur(4px)}.xl\:blur{--tw-blur:blur(8px)}.xl\:blur-md{--tw-blur:blur(12px)}.xl\:blur-lg{--tw-blur:blur(16px)}.xl\:blur-xl{--tw-blur:blur(24px)}.xl\:blur-2xl{--tw-blur:blur(40px)}.xl\:blur-3xl{--tw-blur:blur(64px)}.xl\:brightness-0{--tw-brightness:brightness(0)}.xl\:brightness-50{--tw-brightness:brightness(.5)}.xl\:brightness-75{--tw-brightness:brightness(.75)}.xl\:brightness-90{--tw-brightness:brightness(.9)}.xl\:brightness-95{--tw-brightness:brightness(.95)}.xl\:brightness-100{--tw-brightness:brightness(1)}.xl\:brightness-105{--tw-brightness:brightness(1.05)}.xl\:brightness-110{--tw-brightness:brightness(1.1)}.xl\:brightness-125{--tw-brightness:brightness(1.25)}.xl\:brightness-150{--tw-brightness:brightness(1.5)}.xl\:brightness-200{--tw-brightness:brightness(2)}.xl\:contrast-0{--tw-contrast:contrast(0)}.xl\:contrast-50{--tw-contrast:contrast(.5)}.xl\:contrast-75{--tw-contrast:contrast(.75)}.xl\:contrast-100{--tw-contrast:contrast(1)}.xl\:contrast-125{--tw-contrast:contrast(1.25)}.xl\:contrast-150{--tw-contrast:contrast(1.5)}.xl\:contrast-200{--tw-contrast:contrast(2)}.xl\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.xl\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.xl\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.xl\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.xl\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.xl\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.xl\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.xl\:grayscale-0{--tw-grayscale:grayscale(0)}.xl\:grayscale{--tw-grayscale:grayscale(100%)}.xl\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.xl\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.xl\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.xl\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.xl\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.xl\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.xl\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.xl\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.xl\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.xl\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.xl\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.xl\:invert-0{--tw-invert:invert(0)}.xl\:invert{--tw-invert:invert(100%)}.xl\:saturate-0{--tw-saturate:saturate(0)}.xl\:saturate-50{--tw-saturate:saturate(.5)}.xl\:saturate-100{--tw-saturate:saturate(1)}.xl\:saturate-150{--tw-saturate:saturate(1.5)}.xl\:saturate-200{--tw-saturate:saturate(2)}.xl\:sepia-0{--tw-sepia:sepia(0)}.xl\:sepia{--tw-sepia:sepia(100%)}.xl\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.xl\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.xl\:backdrop-blur-0,.xl\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.xl\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.xl\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.xl\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.xl\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.xl\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.xl\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.xl\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.xl\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.xl\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.xl\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.xl\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.xl\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.xl\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.xl\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.xl\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.xl\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.xl\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.xl\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.xl\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.xl\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.xl\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.xl\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.xl\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.xl\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.xl\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.xl\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.xl\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.xl\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.xl\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.xl\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.xl\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.xl\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.xl\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.xl\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.xl\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.xl\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.xl\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.xl\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.xl\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.xl\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.xl\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.xl\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.xl\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.xl\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.xl\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.xl\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.xl\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.xl\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.xl\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.xl\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.xl\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.xl\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.xl\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.xl\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.xl\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.xl\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.xl\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.xl\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.xl\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.xl\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.xl\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.xl\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.xl\:transition-none{transition-property:none}.xl\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:delay-75{transition-delay:75ms}.xl\:delay-100{transition-delay:.1s}.xl\:delay-150{transition-delay:.15s}.xl\:delay-200{transition-delay:.2s}.xl\:delay-300{transition-delay:.3s}.xl\:delay-500{transition-delay:.5s}.xl\:delay-700{transition-delay:.7s}.xl\:delay-1000{transition-delay:1s}.xl\:duration-75{transition-duration:75ms}.xl\:duration-100{transition-duration:.1s}.xl\:duration-150{transition-duration:.15s}.xl\:duration-200{transition-duration:.2s}.xl\:duration-300{transition-duration:.3s}.xl\:duration-500{transition-duration:.5s}.xl\:duration-700{transition-duration:.7s}.xl\:duration-1000{transition-duration:1s}.xl\:ease-linear{transition-timing-function:linear}.xl\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.xl\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.xl\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:1536px){.\32xl\:container{width:100%}@media (min-width:640px){.\32xl\:container{max-width:640px}}@media (min-width:768px){.\32xl\:container{max-width:768px}}@media (min-width:1024px){.\32xl\:container{max-width:1024px}}@media (min-width:1280px){.\32xl\:container{max-width:1280px}}@media (min-width:1536px){.\32xl\:container{max-width:1536px}}.\32xl\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\32xl\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.\32xl\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\32xl\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.\32xl\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\32xl\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.\32xl\:pointer-events-none{pointer-events:none}.\32xl\:pointer-events-auto{pointer-events:auto}.\32xl\:visible{visibility:visible}.\32xl\:invisible{visibility:hidden}.\32xl\:static{position:static}.\32xl\:fixed{position:fixed}.\32xl\:absolute{position:absolute}.\32xl\:relative{position:relative}.\32xl\:sticky{position:-webkit-sticky;position:sticky}.\32xl\:inset-0{top:0;right:0;bottom:0;left:0}.\32xl\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.\32xl\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.\32xl\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.\32xl\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.\32xl\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.\32xl\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.\32xl\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.\32xl\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.\32xl\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.\32xl\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.\32xl\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.\32xl\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.\32xl\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.\32xl\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.\32xl\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.\32xl\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.\32xl\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.\32xl\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.\32xl\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.\32xl\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.\32xl\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.\32xl\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.\32xl\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.\32xl\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.\32xl\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.\32xl\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.\32xl\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.\32xl\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.\32xl\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.\32xl\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.\32xl\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.\32xl\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.\32xl\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.\32xl\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.\32xl\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.\32xl\:-inset-0{top:0;right:0;bottom:0;left:0}.\32xl\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.\32xl\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.\32xl\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.\32xl\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.\32xl\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.\32xl\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.\32xl\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.\32xl\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.\32xl\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.\32xl\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.\32xl\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.\32xl\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.\32xl\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.\32xl\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.\32xl\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.\32xl\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.\32xl\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.\32xl\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.\32xl\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.\32xl\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.\32xl\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.\32xl\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.\32xl\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.\32xl\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.\32xl\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.\32xl\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.\32xl\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.\32xl\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.\32xl\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.\32xl\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.\32xl\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.\32xl\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.\32xl\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.\32xl\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.\32xl\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.\32xl\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.\32xl\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.\32xl\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.\32xl\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.\32xl\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.\32xl\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.\32xl\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.\32xl\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.\32xl\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.\32xl\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.\32xl\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.\32xl\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.\32xl\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.\32xl\:inset-x-0{left:0;right:0}.\32xl\:inset-x-1{left:.25rem;right:.25rem}.\32xl\:inset-x-2{left:.5rem;right:.5rem}.\32xl\:inset-x-3{left:.75rem;right:.75rem}.\32xl\:inset-x-4{left:1rem;right:1rem}.\32xl\:inset-x-5{left:1.25rem;right:1.25rem}.\32xl\:inset-x-6{left:1.5rem;right:1.5rem}.\32xl\:inset-x-7{left:1.75rem;right:1.75rem}.\32xl\:inset-x-8{left:2rem;right:2rem}.\32xl\:inset-x-9{left:2.25rem;right:2.25rem}.\32xl\:inset-x-10{left:2.5rem;right:2.5rem}.\32xl\:inset-x-11{left:2.75rem;right:2.75rem}.\32xl\:inset-x-12{left:3rem;right:3rem}.\32xl\:inset-x-14{left:3.5rem;right:3.5rem}.\32xl\:inset-x-16{left:4rem;right:4rem}.\32xl\:inset-x-20{left:5rem;right:5rem}.\32xl\:inset-x-24{left:6rem;right:6rem}.\32xl\:inset-x-28{left:7rem;right:7rem}.\32xl\:inset-x-32{left:8rem;right:8rem}.\32xl\:inset-x-36{left:9rem;right:9rem}.\32xl\:inset-x-40{left:10rem;right:10rem}.\32xl\:inset-x-44{left:11rem;right:11rem}.\32xl\:inset-x-48{left:12rem;right:12rem}.\32xl\:inset-x-52{left:13rem;right:13rem}.\32xl\:inset-x-56{left:14rem;right:14rem}.\32xl\:inset-x-60{left:15rem;right:15rem}.\32xl\:inset-x-64{left:16rem;right:16rem}.\32xl\:inset-x-72{left:18rem;right:18rem}.\32xl\:inset-x-80{left:20rem;right:20rem}.\32xl\:inset-x-96{left:24rem;right:24rem}.\32xl\:inset-x-auto{left:auto;right:auto}.\32xl\:inset-x-px{left:1px;right:1px}.\32xl\:inset-x-0\.5{left:.125rem;right:.125rem}.\32xl\:inset-x-1\.5{left:.375rem;right:.375rem}.\32xl\:inset-x-2\.5{left:.625rem;right:.625rem}.\32xl\:inset-x-3\.5{left:.875rem;right:.875rem}.\32xl\:-inset-x-0{left:0;right:0}.\32xl\:-inset-x-1{left:-.25rem;right:-.25rem}.\32xl\:-inset-x-2{left:-.5rem;right:-.5rem}.\32xl\:-inset-x-3{left:-.75rem;right:-.75rem}.\32xl\:-inset-x-4{left:-1rem;right:-1rem}.\32xl\:-inset-x-5{left:-1.25rem;right:-1.25rem}.\32xl\:-inset-x-6{left:-1.5rem;right:-1.5rem}.\32xl\:-inset-x-7{left:-1.75rem;right:-1.75rem}.\32xl\:-inset-x-8{left:-2rem;right:-2rem}.\32xl\:-inset-x-9{left:-2.25rem;right:-2.25rem}.\32xl\:-inset-x-10{left:-2.5rem;right:-2.5rem}.\32xl\:-inset-x-11{left:-2.75rem;right:-2.75rem}.\32xl\:-inset-x-12{left:-3rem;right:-3rem}.\32xl\:-inset-x-14{left:-3.5rem;right:-3.5rem}.\32xl\:-inset-x-16{left:-4rem;right:-4rem}.\32xl\:-inset-x-20{left:-5rem;right:-5rem}.\32xl\:-inset-x-24{left:-6rem;right:-6rem}.\32xl\:-inset-x-28{left:-7rem;right:-7rem}.\32xl\:-inset-x-32{left:-8rem;right:-8rem}.\32xl\:-inset-x-36{left:-9rem;right:-9rem}.\32xl\:-inset-x-40{left:-10rem;right:-10rem}.\32xl\:-inset-x-44{left:-11rem;right:-11rem}.\32xl\:-inset-x-48{left:-12rem;right:-12rem}.\32xl\:-inset-x-52{left:-13rem;right:-13rem}.\32xl\:-inset-x-56{left:-14rem;right:-14rem}.\32xl\:-inset-x-60{left:-15rem;right:-15rem}.\32xl\:-inset-x-64{left:-16rem;right:-16rem}.\32xl\:-inset-x-72{left:-18rem;right:-18rem}.\32xl\:-inset-x-80{left:-20rem;right:-20rem}.\32xl\:-inset-x-96{left:-24rem;right:-24rem}.\32xl\:-inset-x-px{left:-1px;right:-1px}.\32xl\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.\32xl\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.\32xl\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.\32xl\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.\32xl\:inset-x-1\/2{left:50%;right:50%}.\32xl\:inset-x-1\/3{left:33.333333%;right:33.333333%}.\32xl\:inset-x-2\/3{left:66.666667%;right:66.666667%}.\32xl\:inset-x-1\/4{left:25%;right:25%}.\32xl\:inset-x-2\/4{left:50%;right:50%}.\32xl\:inset-x-3\/4{left:75%;right:75%}.\32xl\:inset-x-full{left:100%;right:100%}.\32xl\:-inset-x-1\/2{left:-50%;right:-50%}.\32xl\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.\32xl\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.\32xl\:-inset-x-1\/4{left:-25%;right:-25%}.\32xl\:-inset-x-2\/4{left:-50%;right:-50%}.\32xl\:-inset-x-3\/4{left:-75%;right:-75%}.\32xl\:-inset-x-full{left:-100%;right:-100%}.\32xl\:inset-y-0{top:0;bottom:0}.\32xl\:inset-y-1{top:.25rem;bottom:.25rem}.\32xl\:inset-y-2{top:.5rem;bottom:.5rem}.\32xl\:inset-y-3{top:.75rem;bottom:.75rem}.\32xl\:inset-y-4{top:1rem;bottom:1rem}.\32xl\:inset-y-5{top:1.25rem;bottom:1.25rem}.\32xl\:inset-y-6{top:1.5rem;bottom:1.5rem}.\32xl\:inset-y-7{top:1.75rem;bottom:1.75rem}.\32xl\:inset-y-8{top:2rem;bottom:2rem}.\32xl\:inset-y-9{top:2.25rem;bottom:2.25rem}.\32xl\:inset-y-10{top:2.5rem;bottom:2.5rem}.\32xl\:inset-y-11{top:2.75rem;bottom:2.75rem}.\32xl\:inset-y-12{top:3rem;bottom:3rem}.\32xl\:inset-y-14{top:3.5rem;bottom:3.5rem}.\32xl\:inset-y-16{top:4rem;bottom:4rem}.\32xl\:inset-y-20{top:5rem;bottom:5rem}.\32xl\:inset-y-24{top:6rem;bottom:6rem}.\32xl\:inset-y-28{top:7rem;bottom:7rem}.\32xl\:inset-y-32{top:8rem;bottom:8rem}.\32xl\:inset-y-36{top:9rem;bottom:9rem}.\32xl\:inset-y-40{top:10rem;bottom:10rem}.\32xl\:inset-y-44{top:11rem;bottom:11rem}.\32xl\:inset-y-48{top:12rem;bottom:12rem}.\32xl\:inset-y-52{top:13rem;bottom:13rem}.\32xl\:inset-y-56{top:14rem;bottom:14rem}.\32xl\:inset-y-60{top:15rem;bottom:15rem}.\32xl\:inset-y-64{top:16rem;bottom:16rem}.\32xl\:inset-y-72{top:18rem;bottom:18rem}.\32xl\:inset-y-80{top:20rem;bottom:20rem}.\32xl\:inset-y-96{top:24rem;bottom:24rem}.\32xl\:inset-y-auto{top:auto;bottom:auto}.\32xl\:inset-y-px{top:1px;bottom:1px}.\32xl\:inset-y-0\.5{top:.125rem;bottom:.125rem}.\32xl\:inset-y-1\.5{top:.375rem;bottom:.375rem}.\32xl\:inset-y-2\.5{top:.625rem;bottom:.625rem}.\32xl\:inset-y-3\.5{top:.875rem;bottom:.875rem}.\32xl\:-inset-y-0{top:0;bottom:0}.\32xl\:-inset-y-1{top:-.25rem;bottom:-.25rem}.\32xl\:-inset-y-2{top:-.5rem;bottom:-.5rem}.\32xl\:-inset-y-3{top:-.75rem;bottom:-.75rem}.\32xl\:-inset-y-4{top:-1rem;bottom:-1rem}.\32xl\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.\32xl\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.\32xl\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.\32xl\:-inset-y-8{top:-2rem;bottom:-2rem}.\32xl\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.\32xl\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.\32xl\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.\32xl\:-inset-y-12{top:-3rem;bottom:-3rem}.\32xl\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.\32xl\:-inset-y-16{top:-4rem;bottom:-4rem}.\32xl\:-inset-y-20{top:-5rem;bottom:-5rem}.\32xl\:-inset-y-24{top:-6rem;bottom:-6rem}.\32xl\:-inset-y-28{top:-7rem;bottom:-7rem}.\32xl\:-inset-y-32{top:-8rem;bottom:-8rem}.\32xl\:-inset-y-36{top:-9rem;bottom:-9rem}.\32xl\:-inset-y-40{top:-10rem;bottom:-10rem}.\32xl\:-inset-y-44{top:-11rem;bottom:-11rem}.\32xl\:-inset-y-48{top:-12rem;bottom:-12rem}.\32xl\:-inset-y-52{top:-13rem;bottom:-13rem}.\32xl\:-inset-y-56{top:-14rem;bottom:-14rem}.\32xl\:-inset-y-60{top:-15rem;bottom:-15rem}.\32xl\:-inset-y-64{top:-16rem;bottom:-16rem}.\32xl\:-inset-y-72{top:-18rem;bottom:-18rem}.\32xl\:-inset-y-80{top:-20rem;bottom:-20rem}.\32xl\:-inset-y-96{top:-24rem;bottom:-24rem}.\32xl\:-inset-y-px{top:-1px;bottom:-1px}.\32xl\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.\32xl\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.\32xl\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.\32xl\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.\32xl\:inset-y-1\/2{top:50%;bottom:50%}.\32xl\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.\32xl\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.\32xl\:inset-y-1\/4{top:25%;bottom:25%}.\32xl\:inset-y-2\/4{top:50%;bottom:50%}.\32xl\:inset-y-3\/4{top:75%;bottom:75%}.\32xl\:inset-y-full{top:100%;bottom:100%}.\32xl\:-inset-y-1\/2{top:-50%;bottom:-50%}.\32xl\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.\32xl\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.\32xl\:-inset-y-1\/4{top:-25%;bottom:-25%}.\32xl\:-inset-y-2\/4{top:-50%;bottom:-50%}.\32xl\:-inset-y-3\/4{top:-75%;bottom:-75%}.\32xl\:-inset-y-full{top:-100%;bottom:-100%}.\32xl\:top-0{top:0}.\32xl\:top-1{top:.25rem}.\32xl\:top-2{top:.5rem}.\32xl\:top-3{top:.75rem}.\32xl\:top-4{top:1rem}.\32xl\:top-5{top:1.25rem}.\32xl\:top-6{top:1.5rem}.\32xl\:top-7{top:1.75rem}.\32xl\:top-8{top:2rem}.\32xl\:top-9{top:2.25rem}.\32xl\:top-10{top:2.5rem}.\32xl\:top-11{top:2.75rem}.\32xl\:top-12{top:3rem}.\32xl\:top-14{top:3.5rem}.\32xl\:top-16{top:4rem}.\32xl\:top-20{top:5rem}.\32xl\:top-24{top:6rem}.\32xl\:top-28{top:7rem}.\32xl\:top-32{top:8rem}.\32xl\:top-36{top:9rem}.\32xl\:top-40{top:10rem}.\32xl\:top-44{top:11rem}.\32xl\:top-48{top:12rem}.\32xl\:top-52{top:13rem}.\32xl\:top-56{top:14rem}.\32xl\:top-60{top:15rem}.\32xl\:top-64{top:16rem}.\32xl\:top-72{top:18rem}.\32xl\:top-80{top:20rem}.\32xl\:top-96{top:24rem}.\32xl\:top-auto{top:auto}.\32xl\:top-px{top:1px}.\32xl\:top-0\.5{top:.125rem}.\32xl\:top-1\.5{top:.375rem}.\32xl\:top-2\.5{top:.625rem}.\32xl\:top-3\.5{top:.875rem}.\32xl\:-top-0{top:0}.\32xl\:-top-1{top:-.25rem}.\32xl\:-top-2{top:-.5rem}.\32xl\:-top-3{top:-.75rem}.\32xl\:-top-4{top:-1rem}.\32xl\:-top-5{top:-1.25rem}.\32xl\:-top-6{top:-1.5rem}.\32xl\:-top-7{top:-1.75rem}.\32xl\:-top-8{top:-2rem}.\32xl\:-top-9{top:-2.25rem}.\32xl\:-top-10{top:-2.5rem}.\32xl\:-top-11{top:-2.75rem}.\32xl\:-top-12{top:-3rem}.\32xl\:-top-14{top:-3.5rem}.\32xl\:-top-16{top:-4rem}.\32xl\:-top-20{top:-5rem}.\32xl\:-top-24{top:-6rem}.\32xl\:-top-28{top:-7rem}.\32xl\:-top-32{top:-8rem}.\32xl\:-top-36{top:-9rem}.\32xl\:-top-40{top:-10rem}.\32xl\:-top-44{top:-11rem}.\32xl\:-top-48{top:-12rem}.\32xl\:-top-52{top:-13rem}.\32xl\:-top-56{top:-14rem}.\32xl\:-top-60{top:-15rem}.\32xl\:-top-64{top:-16rem}.\32xl\:-top-72{top:-18rem}.\32xl\:-top-80{top:-20rem}.\32xl\:-top-96{top:-24rem}.\32xl\:-top-px{top:-1px}.\32xl\:-top-0\.5{top:-.125rem}.\32xl\:-top-1\.5{top:-.375rem}.\32xl\:-top-2\.5{top:-.625rem}.\32xl\:-top-3\.5{top:-.875rem}.\32xl\:top-1\/2{top:50%}.\32xl\:top-1\/3{top:33.333333%}.\32xl\:top-2\/3{top:66.666667%}.\32xl\:top-1\/4{top:25%}.\32xl\:top-2\/4{top:50%}.\32xl\:top-3\/4{top:75%}.\32xl\:top-full{top:100%}.\32xl\:-top-1\/2{top:-50%}.\32xl\:-top-1\/3{top:-33.333333%}.\32xl\:-top-2\/3{top:-66.666667%}.\32xl\:-top-1\/4{top:-25%}.\32xl\:-top-2\/4{top:-50%}.\32xl\:-top-3\/4{top:-75%}.\32xl\:-top-full{top:-100%}.\32xl\:right-0{right:0}.\32xl\:right-1{right:.25rem}.\32xl\:right-2{right:.5rem}.\32xl\:right-3{right:.75rem}.\32xl\:right-4{right:1rem}.\32xl\:right-5{right:1.25rem}.\32xl\:right-6{right:1.5rem}.\32xl\:right-7{right:1.75rem}.\32xl\:right-8{right:2rem}.\32xl\:right-9{right:2.25rem}.\32xl\:right-10{right:2.5rem}.\32xl\:right-11{right:2.75rem}.\32xl\:right-12{right:3rem}.\32xl\:right-14{right:3.5rem}.\32xl\:right-16{right:4rem}.\32xl\:right-20{right:5rem}.\32xl\:right-24{right:6rem}.\32xl\:right-28{right:7rem}.\32xl\:right-32{right:8rem}.\32xl\:right-36{right:9rem}.\32xl\:right-40{right:10rem}.\32xl\:right-44{right:11rem}.\32xl\:right-48{right:12rem}.\32xl\:right-52{right:13rem}.\32xl\:right-56{right:14rem}.\32xl\:right-60{right:15rem}.\32xl\:right-64{right:16rem}.\32xl\:right-72{right:18rem}.\32xl\:right-80{right:20rem}.\32xl\:right-96{right:24rem}.\32xl\:right-auto{right:auto}.\32xl\:right-px{right:1px}.\32xl\:right-0\.5{right:.125rem}.\32xl\:right-1\.5{right:.375rem}.\32xl\:right-2\.5{right:.625rem}.\32xl\:right-3\.5{right:.875rem}.\32xl\:-right-0{right:0}.\32xl\:-right-1{right:-.25rem}.\32xl\:-right-2{right:-.5rem}.\32xl\:-right-3{right:-.75rem}.\32xl\:-right-4{right:-1rem}.\32xl\:-right-5{right:-1.25rem}.\32xl\:-right-6{right:-1.5rem}.\32xl\:-right-7{right:-1.75rem}.\32xl\:-right-8{right:-2rem}.\32xl\:-right-9{right:-2.25rem}.\32xl\:-right-10{right:-2.5rem}.\32xl\:-right-11{right:-2.75rem}.\32xl\:-right-12{right:-3rem}.\32xl\:-right-14{right:-3.5rem}.\32xl\:-right-16{right:-4rem}.\32xl\:-right-20{right:-5rem}.\32xl\:-right-24{right:-6rem}.\32xl\:-right-28{right:-7rem}.\32xl\:-right-32{right:-8rem}.\32xl\:-right-36{right:-9rem}.\32xl\:-right-40{right:-10rem}.\32xl\:-right-44{right:-11rem}.\32xl\:-right-48{right:-12rem}.\32xl\:-right-52{right:-13rem}.\32xl\:-right-56{right:-14rem}.\32xl\:-right-60{right:-15rem}.\32xl\:-right-64{right:-16rem}.\32xl\:-right-72{right:-18rem}.\32xl\:-right-80{right:-20rem}.\32xl\:-right-96{right:-24rem}.\32xl\:-right-px{right:-1px}.\32xl\:-right-0\.5{right:-.125rem}.\32xl\:-right-1\.5{right:-.375rem}.\32xl\:-right-2\.5{right:-.625rem}.\32xl\:-right-3\.5{right:-.875rem}.\32xl\:right-1\/2{right:50%}.\32xl\:right-1\/3{right:33.333333%}.\32xl\:right-2\/3{right:66.666667%}.\32xl\:right-1\/4{right:25%}.\32xl\:right-2\/4{right:50%}.\32xl\:right-3\/4{right:75%}.\32xl\:right-full{right:100%}.\32xl\:-right-1\/2{right:-50%}.\32xl\:-right-1\/3{right:-33.333333%}.\32xl\:-right-2\/3{right:-66.666667%}.\32xl\:-right-1\/4{right:-25%}.\32xl\:-right-2\/4{right:-50%}.\32xl\:-right-3\/4{right:-75%}.\32xl\:-right-full{right:-100%}.\32xl\:bottom-0{bottom:0}.\32xl\:bottom-1{bottom:.25rem}.\32xl\:bottom-2{bottom:.5rem}.\32xl\:bottom-3{bottom:.75rem}.\32xl\:bottom-4{bottom:1rem}.\32xl\:bottom-5{bottom:1.25rem}.\32xl\:bottom-6{bottom:1.5rem}.\32xl\:bottom-7{bottom:1.75rem}.\32xl\:bottom-8{bottom:2rem}.\32xl\:bottom-9{bottom:2.25rem}.\32xl\:bottom-10{bottom:2.5rem}.\32xl\:bottom-11{bottom:2.75rem}.\32xl\:bottom-12{bottom:3rem}.\32xl\:bottom-14{bottom:3.5rem}.\32xl\:bottom-16{bottom:4rem}.\32xl\:bottom-20{bottom:5rem}.\32xl\:bottom-24{bottom:6rem}.\32xl\:bottom-28{bottom:7rem}.\32xl\:bottom-32{bottom:8rem}.\32xl\:bottom-36{bottom:9rem}.\32xl\:bottom-40{bottom:10rem}.\32xl\:bottom-44{bottom:11rem}.\32xl\:bottom-48{bottom:12rem}.\32xl\:bottom-52{bottom:13rem}.\32xl\:bottom-56{bottom:14rem}.\32xl\:bottom-60{bottom:15rem}.\32xl\:bottom-64{bottom:16rem}.\32xl\:bottom-72{bottom:18rem}.\32xl\:bottom-80{bottom:20rem}.\32xl\:bottom-96{bottom:24rem}.\32xl\:bottom-auto{bottom:auto}.\32xl\:bottom-px{bottom:1px}.\32xl\:bottom-0\.5{bottom:.125rem}.\32xl\:bottom-1\.5{bottom:.375rem}.\32xl\:bottom-2\.5{bottom:.625rem}.\32xl\:bottom-3\.5{bottom:.875rem}.\32xl\:-bottom-0{bottom:0}.\32xl\:-bottom-1{bottom:-.25rem}.\32xl\:-bottom-2{bottom:-.5rem}.\32xl\:-bottom-3{bottom:-.75rem}.\32xl\:-bottom-4{bottom:-1rem}.\32xl\:-bottom-5{bottom:-1.25rem}.\32xl\:-bottom-6{bottom:-1.5rem}.\32xl\:-bottom-7{bottom:-1.75rem}.\32xl\:-bottom-8{bottom:-2rem}.\32xl\:-bottom-9{bottom:-2.25rem}.\32xl\:-bottom-10{bottom:-2.5rem}.\32xl\:-bottom-11{bottom:-2.75rem}.\32xl\:-bottom-12{bottom:-3rem}.\32xl\:-bottom-14{bottom:-3.5rem}.\32xl\:-bottom-16{bottom:-4rem}.\32xl\:-bottom-20{bottom:-5rem}.\32xl\:-bottom-24{bottom:-6rem}.\32xl\:-bottom-28{bottom:-7rem}.\32xl\:-bottom-32{bottom:-8rem}.\32xl\:-bottom-36{bottom:-9rem}.\32xl\:-bottom-40{bottom:-10rem}.\32xl\:-bottom-44{bottom:-11rem}.\32xl\:-bottom-48{bottom:-12rem}.\32xl\:-bottom-52{bottom:-13rem}.\32xl\:-bottom-56{bottom:-14rem}.\32xl\:-bottom-60{bottom:-15rem}.\32xl\:-bottom-64{bottom:-16rem}.\32xl\:-bottom-72{bottom:-18rem}.\32xl\:-bottom-80{bottom:-20rem}.\32xl\:-bottom-96{bottom:-24rem}.\32xl\:-bottom-px{bottom:-1px}.\32xl\:-bottom-0\.5{bottom:-.125rem}.\32xl\:-bottom-1\.5{bottom:-.375rem}.\32xl\:-bottom-2\.5{bottom:-.625rem}.\32xl\:-bottom-3\.5{bottom:-.875rem}.\32xl\:bottom-1\/2{bottom:50%}.\32xl\:bottom-1\/3{bottom:33.333333%}.\32xl\:bottom-2\/3{bottom:66.666667%}.\32xl\:bottom-1\/4{bottom:25%}.\32xl\:bottom-2\/4{bottom:50%}.\32xl\:bottom-3\/4{bottom:75%}.\32xl\:bottom-full{bottom:100%}.\32xl\:-bottom-1\/2{bottom:-50%}.\32xl\:-bottom-1\/3{bottom:-33.333333%}.\32xl\:-bottom-2\/3{bottom:-66.666667%}.\32xl\:-bottom-1\/4{bottom:-25%}.\32xl\:-bottom-2\/4{bottom:-50%}.\32xl\:-bottom-3\/4{bottom:-75%}.\32xl\:-bottom-full{bottom:-100%}.\32xl\:left-0{left:0}.\32xl\:left-1{left:.25rem}.\32xl\:left-2{left:.5rem}.\32xl\:left-3{left:.75rem}.\32xl\:left-4{left:1rem}.\32xl\:left-5{left:1.25rem}.\32xl\:left-6{left:1.5rem}.\32xl\:left-7{left:1.75rem}.\32xl\:left-8{left:2rem}.\32xl\:left-9{left:2.25rem}.\32xl\:left-10{left:2.5rem}.\32xl\:left-11{left:2.75rem}.\32xl\:left-12{left:3rem}.\32xl\:left-14{left:3.5rem}.\32xl\:left-16{left:4rem}.\32xl\:left-20{left:5rem}.\32xl\:left-24{left:6rem}.\32xl\:left-28{left:7rem}.\32xl\:left-32{left:8rem}.\32xl\:left-36{left:9rem}.\32xl\:left-40{left:10rem}.\32xl\:left-44{left:11rem}.\32xl\:left-48{left:12rem}.\32xl\:left-52{left:13rem}.\32xl\:left-56{left:14rem}.\32xl\:left-60{left:15rem}.\32xl\:left-64{left:16rem}.\32xl\:left-72{left:18rem}.\32xl\:left-80{left:20rem}.\32xl\:left-96{left:24rem}.\32xl\:left-auto{left:auto}.\32xl\:left-px{left:1px}.\32xl\:left-0\.5{left:.125rem}.\32xl\:left-1\.5{left:.375rem}.\32xl\:left-2\.5{left:.625rem}.\32xl\:left-3\.5{left:.875rem}.\32xl\:-left-0{left:0}.\32xl\:-left-1{left:-.25rem}.\32xl\:-left-2{left:-.5rem}.\32xl\:-left-3{left:-.75rem}.\32xl\:-left-4{left:-1rem}.\32xl\:-left-5{left:-1.25rem}.\32xl\:-left-6{left:-1.5rem}.\32xl\:-left-7{left:-1.75rem}.\32xl\:-left-8{left:-2rem}.\32xl\:-left-9{left:-2.25rem}.\32xl\:-left-10{left:-2.5rem}.\32xl\:-left-11{left:-2.75rem}.\32xl\:-left-12{left:-3rem}.\32xl\:-left-14{left:-3.5rem}.\32xl\:-left-16{left:-4rem}.\32xl\:-left-20{left:-5rem}.\32xl\:-left-24{left:-6rem}.\32xl\:-left-28{left:-7rem}.\32xl\:-left-32{left:-8rem}.\32xl\:-left-36{left:-9rem}.\32xl\:-left-40{left:-10rem}.\32xl\:-left-44{left:-11rem}.\32xl\:-left-48{left:-12rem}.\32xl\:-left-52{left:-13rem}.\32xl\:-left-56{left:-14rem}.\32xl\:-left-60{left:-15rem}.\32xl\:-left-64{left:-16rem}.\32xl\:-left-72{left:-18rem}.\32xl\:-left-80{left:-20rem}.\32xl\:-left-96{left:-24rem}.\32xl\:-left-px{left:-1px}.\32xl\:-left-0\.5{left:-.125rem}.\32xl\:-left-1\.5{left:-.375rem}.\32xl\:-left-2\.5{left:-.625rem}.\32xl\:-left-3\.5{left:-.875rem}.\32xl\:left-1\/2{left:50%}.\32xl\:left-1\/3{left:33.333333%}.\32xl\:left-2\/3{left:66.666667%}.\32xl\:left-1\/4{left:25%}.\32xl\:left-2\/4{left:50%}.\32xl\:left-3\/4{left:75%}.\32xl\:left-full{left:100%}.\32xl\:-left-1\/2{left:-50%}.\32xl\:-left-1\/3{left:-33.333333%}.\32xl\:-left-2\/3{left:-66.666667%}.\32xl\:-left-1\/4{left:-25%}.\32xl\:-left-2\/4{left:-50%}.\32xl\:-left-3\/4{left:-75%}.\32xl\:-left-full{left:-100%}.\32xl\:isolate{isolation:isolate}.\32xl\:isolation-auto{isolation:auto}.\32xl\:z-0{z-index:0}.\32xl\:z-10{z-index:10}.\32xl\:z-20{z-index:20}.\32xl\:z-30{z-index:30}.\32xl\:z-40{z-index:40}.\32xl\:z-50{z-index:50}.\32xl\:z-auto{z-index:auto}.\32xl\:focus-within\:z-0:focus-within{z-index:0}.\32xl\:focus-within\:z-10:focus-within{z-index:10}.\32xl\:focus-within\:z-20:focus-within{z-index:20}.\32xl\:focus-within\:z-30:focus-within{z-index:30}.\32xl\:focus-within\:z-40:focus-within{z-index:40}.\32xl\:focus-within\:z-50:focus-within{z-index:50}.\32xl\:focus-within\:z-auto:focus-within{z-index:auto}.\32xl\:focus\:z-0:focus{z-index:0}.\32xl\:focus\:z-10:focus{z-index:10}.\32xl\:focus\:z-20:focus{z-index:20}.\32xl\:focus\:z-30:focus{z-index:30}.\32xl\:focus\:z-40:focus{z-index:40}.\32xl\:focus\:z-50:focus{z-index:50}.\32xl\:focus\:z-auto:focus{z-index:auto}.\32xl\:order-1{order:1}.\32xl\:order-2{order:2}.\32xl\:order-3{order:3}.\32xl\:order-4{order:4}.\32xl\:order-5{order:5}.\32xl\:order-6{order:6}.\32xl\:order-7{order:7}.\32xl\:order-8{order:8}.\32xl\:order-9{order:9}.\32xl\:order-10{order:10}.\32xl\:order-11{order:11}.\32xl\:order-12{order:12}.\32xl\:order-first{order:-9999}.\32xl\:order-last{order:9999}.\32xl\:order-none{order:0}.\32xl\:col-auto{grid-column:auto}.\32xl\:col-span-1{grid-column:span 1/span 1}.\32xl\:col-span-2{grid-column:span 2/span 2}.\32xl\:col-span-3{grid-column:span 3/span 3}.\32xl\:col-span-4{grid-column:span 4/span 4}.\32xl\:col-span-5{grid-column:span 5/span 5}.\32xl\:col-span-6{grid-column:span 6/span 6}.\32xl\:col-span-7{grid-column:span 7/span 7}.\32xl\:col-span-8{grid-column:span 8/span 8}.\32xl\:col-span-9{grid-column:span 9/span 9}.\32xl\:col-span-10{grid-column:span 10/span 10}.\32xl\:col-span-11{grid-column:span 11/span 11}.\32xl\:col-span-12{grid-column:span 12/span 12}.\32xl\:col-span-full{grid-column:1/-1}.\32xl\:col-start-1{grid-column-start:1}.\32xl\:col-start-2{grid-column-start:2}.\32xl\:col-start-3{grid-column-start:3}.\32xl\:col-start-4{grid-column-start:4}.\32xl\:col-start-5{grid-column-start:5}.\32xl\:col-start-6{grid-column-start:6}.\32xl\:col-start-7{grid-column-start:7}.\32xl\:col-start-8{grid-column-start:8}.\32xl\:col-start-9{grid-column-start:9}.\32xl\:col-start-10{grid-column-start:10}.\32xl\:col-start-11{grid-column-start:11}.\32xl\:col-start-12{grid-column-start:12}.\32xl\:col-start-13{grid-column-start:13}.\32xl\:col-start-auto{grid-column-start:auto}.\32xl\:col-end-1{grid-column-end:1}.\32xl\:col-end-2{grid-column-end:2}.\32xl\:col-end-3{grid-column-end:3}.\32xl\:col-end-4{grid-column-end:4}.\32xl\:col-end-5{grid-column-end:5}.\32xl\:col-end-6{grid-column-end:6}.\32xl\:col-end-7{grid-column-end:7}.\32xl\:col-end-8{grid-column-end:8}.\32xl\:col-end-9{grid-column-end:9}.\32xl\:col-end-10{grid-column-end:10}.\32xl\:col-end-11{grid-column-end:11}.\32xl\:col-end-12{grid-column-end:12}.\32xl\:col-end-13{grid-column-end:13}.\32xl\:col-end-auto{grid-column-end:auto}.\32xl\:row-auto{grid-row:auto}.\32xl\:row-span-1{grid-row:span 1/span 1}.\32xl\:row-span-2{grid-row:span 2/span 2}.\32xl\:row-span-3{grid-row:span 3/span 3}.\32xl\:row-span-4{grid-row:span 4/span 4}.\32xl\:row-span-5{grid-row:span 5/span 5}.\32xl\:row-span-6{grid-row:span 6/span 6}.\32xl\:row-span-full{grid-row:1/-1}.\32xl\:row-start-1{grid-row-start:1}.\32xl\:row-start-2{grid-row-start:2}.\32xl\:row-start-3{grid-row-start:3}.\32xl\:row-start-4{grid-row-start:4}.\32xl\:row-start-5{grid-row-start:5}.\32xl\:row-start-6{grid-row-start:6}.\32xl\:row-start-7{grid-row-start:7}.\32xl\:row-start-auto{grid-row-start:auto}.\32xl\:row-end-1{grid-row-end:1}.\32xl\:row-end-2{grid-row-end:2}.\32xl\:row-end-3{grid-row-end:3}.\32xl\:row-end-4{grid-row-end:4}.\32xl\:row-end-5{grid-row-end:5}.\32xl\:row-end-6{grid-row-end:6}.\32xl\:row-end-7{grid-row-end:7}.\32xl\:row-end-auto{grid-row-end:auto}.\32xl\:float-right{float:right}.\32xl\:float-left{float:left}.\32xl\:float-none{float:none}.\32xl\:clear-left{clear:left}.\32xl\:clear-right{clear:right}.\32xl\:clear-both{clear:both}.\32xl\:clear-none{clear:none}.\32xl\:m-0{margin:0}.\32xl\:m-1{margin:.25rem}.\32xl\:m-2{margin:.5rem}.\32xl\:m-3{margin:.75rem}.\32xl\:m-4{margin:1rem}.\32xl\:m-5{margin:1.25rem}.\32xl\:m-6{margin:1.5rem}.\32xl\:m-7{margin:1.75rem}.\32xl\:m-8{margin:2rem}.\32xl\:m-9{margin:2.25rem}.\32xl\:m-10{margin:2.5rem}.\32xl\:m-11{margin:2.75rem}.\32xl\:m-12{margin:3rem}.\32xl\:m-14{margin:3.5rem}.\32xl\:m-16{margin:4rem}.\32xl\:m-20{margin:5rem}.\32xl\:m-24{margin:6rem}.\32xl\:m-28{margin:7rem}.\32xl\:m-32{margin:8rem}.\32xl\:m-36{margin:9rem}.\32xl\:m-40{margin:10rem}.\32xl\:m-44{margin:11rem}.\32xl\:m-48{margin:12rem}.\32xl\:m-52{margin:13rem}.\32xl\:m-56{margin:14rem}.\32xl\:m-60{margin:15rem}.\32xl\:m-64{margin:16rem}.\32xl\:m-72{margin:18rem}.\32xl\:m-80{margin:20rem}.\32xl\:m-96{margin:24rem}.\32xl\:m-auto{margin:auto}.\32xl\:m-px{margin:1px}.\32xl\:m-0\.5{margin:.125rem}.\32xl\:m-1\.5{margin:.375rem}.\32xl\:m-2\.5{margin:.625rem}.\32xl\:m-3\.5{margin:.875rem}.\32xl\:-m-0{margin:0}.\32xl\:-m-1{margin:-.25rem}.\32xl\:-m-2{margin:-.5rem}.\32xl\:-m-3{margin:-.75rem}.\32xl\:-m-4{margin:-1rem}.\32xl\:-m-5{margin:-1.25rem}.\32xl\:-m-6{margin:-1.5rem}.\32xl\:-m-7{margin:-1.75rem}.\32xl\:-m-8{margin:-2rem}.\32xl\:-m-9{margin:-2.25rem}.\32xl\:-m-10{margin:-2.5rem}.\32xl\:-m-11{margin:-2.75rem}.\32xl\:-m-12{margin:-3rem}.\32xl\:-m-14{margin:-3.5rem}.\32xl\:-m-16{margin:-4rem}.\32xl\:-m-20{margin:-5rem}.\32xl\:-m-24{margin:-6rem}.\32xl\:-m-28{margin:-7rem}.\32xl\:-m-32{margin:-8rem}.\32xl\:-m-36{margin:-9rem}.\32xl\:-m-40{margin:-10rem}.\32xl\:-m-44{margin:-11rem}.\32xl\:-m-48{margin:-12rem}.\32xl\:-m-52{margin:-13rem}.\32xl\:-m-56{margin:-14rem}.\32xl\:-m-60{margin:-15rem}.\32xl\:-m-64{margin:-16rem}.\32xl\:-m-72{margin:-18rem}.\32xl\:-m-80{margin:-20rem}.\32xl\:-m-96{margin:-24rem}.\32xl\:-m-px{margin:-1px}.\32xl\:-m-0\.5{margin:-.125rem}.\32xl\:-m-1\.5{margin:-.375rem}.\32xl\:-m-2\.5{margin:-.625rem}.\32xl\:-m-3\.5{margin:-.875rem}.\32xl\:mx-0{margin-left:0;margin-right:0}.\32xl\:mx-1{margin-left:.25rem;margin-right:.25rem}.\32xl\:mx-2{margin-left:.5rem;margin-right:.5rem}.\32xl\:mx-3{margin-left:.75rem;margin-right:.75rem}.\32xl\:mx-4{margin-left:1rem;margin-right:1rem}.\32xl\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.\32xl\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.\32xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.\32xl\:mx-8{margin-left:2rem;margin-right:2rem}.\32xl\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.\32xl\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.\32xl\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.\32xl\:mx-12{margin-left:3rem;margin-right:3rem}.\32xl\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.\32xl\:mx-16{margin-left:4rem;margin-right:4rem}.\32xl\:mx-20{margin-left:5rem;margin-right:5rem}.\32xl\:mx-24{margin-left:6rem;margin-right:6rem}.\32xl\:mx-28{margin-left:7rem;margin-right:7rem}.\32xl\:mx-32{margin-left:8rem;margin-right:8rem}.\32xl\:mx-36{margin-left:9rem;margin-right:9rem}.\32xl\:mx-40{margin-left:10rem;margin-right:10rem}.\32xl\:mx-44{margin-left:11rem;margin-right:11rem}.\32xl\:mx-48{margin-left:12rem;margin-right:12rem}.\32xl\:mx-52{margin-left:13rem;margin-right:13rem}.\32xl\:mx-56{margin-left:14rem;margin-right:14rem}.\32xl\:mx-60{margin-left:15rem;margin-right:15rem}.\32xl\:mx-64{margin-left:16rem;margin-right:16rem}.\32xl\:mx-72{margin-left:18rem;margin-right:18rem}.\32xl\:mx-80{margin-left:20rem;margin-right:20rem}.\32xl\:mx-96{margin-left:24rem;margin-right:24rem}.\32xl\:mx-auto{margin-left:auto;margin-right:auto}.\32xl\:mx-px{margin-left:1px;margin-right:1px}.\32xl\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.\32xl\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.\32xl\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.\32xl\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.\32xl\:-mx-0{margin-left:0;margin-right:0}.\32xl\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.\32xl\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.\32xl\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.\32xl\:-mx-4{margin-left:-1rem;margin-right:-1rem}.\32xl\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.\32xl\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.\32xl\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.\32xl\:-mx-8{margin-left:-2rem;margin-right:-2rem}.\32xl\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.\32xl\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.\32xl\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.\32xl\:-mx-12{margin-left:-3rem;margin-right:-3rem}.\32xl\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.\32xl\:-mx-16{margin-left:-4rem;margin-right:-4rem}.\32xl\:-mx-20{margin-left:-5rem;margin-right:-5rem}.\32xl\:-mx-24{margin-left:-6rem;margin-right:-6rem}.\32xl\:-mx-28{margin-left:-7rem;margin-right:-7rem}.\32xl\:-mx-32{margin-left:-8rem;margin-right:-8rem}.\32xl\:-mx-36{margin-left:-9rem;margin-right:-9rem}.\32xl\:-mx-40{margin-left:-10rem;margin-right:-10rem}.\32xl\:-mx-44{margin-left:-11rem;margin-right:-11rem}.\32xl\:-mx-48{margin-left:-12rem;margin-right:-12rem}.\32xl\:-mx-52{margin-left:-13rem;margin-right:-13rem}.\32xl\:-mx-56{margin-left:-14rem;margin-right:-14rem}.\32xl\:-mx-60{margin-left:-15rem;margin-right:-15rem}.\32xl\:-mx-64{margin-left:-16rem;margin-right:-16rem}.\32xl\:-mx-72{margin-left:-18rem;margin-right:-18rem}.\32xl\:-mx-80{margin-left:-20rem;margin-right:-20rem}.\32xl\:-mx-96{margin-left:-24rem;margin-right:-24rem}.\32xl\:-mx-px{margin-left:-1px;margin-right:-1px}.\32xl\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.\32xl\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.\32xl\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.\32xl\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.\32xl\:my-0{margin-top:0;margin-bottom:0}.\32xl\:my-1{margin-top:.25rem;margin-bottom:.25rem}.\32xl\:my-2{margin-top:.5rem;margin-bottom:.5rem}.\32xl\:my-3{margin-top:.75rem;margin-bottom:.75rem}.\32xl\:my-4{margin-top:1rem;margin-bottom:1rem}.\32xl\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.\32xl\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.\32xl\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.\32xl\:my-8{margin-top:2rem;margin-bottom:2rem}.\32xl\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.\32xl\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.\32xl\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.\32xl\:my-12{margin-top:3rem;margin-bottom:3rem}.\32xl\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.\32xl\:my-16{margin-top:4rem;margin-bottom:4rem}.\32xl\:my-20{margin-top:5rem;margin-bottom:5rem}.\32xl\:my-24{margin-top:6rem;margin-bottom:6rem}.\32xl\:my-28{margin-top:7rem;margin-bottom:7rem}.\32xl\:my-32{margin-top:8rem;margin-bottom:8rem}.\32xl\:my-36{margin-top:9rem;margin-bottom:9rem}.\32xl\:my-40{margin-top:10rem;margin-bottom:10rem}.\32xl\:my-44{margin-top:11rem;margin-bottom:11rem}.\32xl\:my-48{margin-top:12rem;margin-bottom:12rem}.\32xl\:my-52{margin-top:13rem;margin-bottom:13rem}.\32xl\:my-56{margin-top:14rem;margin-bottom:14rem}.\32xl\:my-60{margin-top:15rem;margin-bottom:15rem}.\32xl\:my-64{margin-top:16rem;margin-bottom:16rem}.\32xl\:my-72{margin-top:18rem;margin-bottom:18rem}.\32xl\:my-80{margin-top:20rem;margin-bottom:20rem}.\32xl\:my-96{margin-top:24rem;margin-bottom:24rem}.\32xl\:my-auto{margin-top:auto;margin-bottom:auto}.\32xl\:my-px{margin-top:1px;margin-bottom:1px}.\32xl\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.\32xl\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.\32xl\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.\32xl\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.\32xl\:-my-0{margin-top:0;margin-bottom:0}.\32xl\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.\32xl\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.\32xl\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.\32xl\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.\32xl\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.\32xl\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.\32xl\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.\32xl\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.\32xl\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.\32xl\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.\32xl\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.\32xl\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.\32xl\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.\32xl\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.\32xl\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.\32xl\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.\32xl\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.\32xl\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.\32xl\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.\32xl\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.\32xl\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.\32xl\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.\32xl\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.\32xl\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.\32xl\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.\32xl\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.\32xl\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.\32xl\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.\32xl\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.\32xl\:-my-px{margin-top:-1px;margin-bottom:-1px}.\32xl\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.\32xl\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.\32xl\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.\32xl\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.\32xl\:mt-0{margin-top:0}.\32xl\:mt-1{margin-top:.25rem}.\32xl\:mt-2{margin-top:.5rem}.\32xl\:mt-3{margin-top:.75rem}.\32xl\:mt-4{margin-top:1rem}.\32xl\:mt-5{margin-top:1.25rem}.\32xl\:mt-6{margin-top:1.5rem}.\32xl\:mt-7{margin-top:1.75rem}.\32xl\:mt-8{margin-top:2rem}.\32xl\:mt-9{margin-top:2.25rem}.\32xl\:mt-10{margin-top:2.5rem}.\32xl\:mt-11{margin-top:2.75rem}.\32xl\:mt-12{margin-top:3rem}.\32xl\:mt-14{margin-top:3.5rem}.\32xl\:mt-16{margin-top:4rem}.\32xl\:mt-20{margin-top:5rem}.\32xl\:mt-24{margin-top:6rem}.\32xl\:mt-28{margin-top:7rem}.\32xl\:mt-32{margin-top:8rem}.\32xl\:mt-36{margin-top:9rem}.\32xl\:mt-40{margin-top:10rem}.\32xl\:mt-44{margin-top:11rem}.\32xl\:mt-48{margin-top:12rem}.\32xl\:mt-52{margin-top:13rem}.\32xl\:mt-56{margin-top:14rem}.\32xl\:mt-60{margin-top:15rem}.\32xl\:mt-64{margin-top:16rem}.\32xl\:mt-72{margin-top:18rem}.\32xl\:mt-80{margin-top:20rem}.\32xl\:mt-96{margin-top:24rem}.\32xl\:mt-auto{margin-top:auto}.\32xl\:mt-px{margin-top:1px}.\32xl\:mt-0\.5{margin-top:.125rem}.\32xl\:mt-1\.5{margin-top:.375rem}.\32xl\:mt-2\.5{margin-top:.625rem}.\32xl\:mt-3\.5{margin-top:.875rem}.\32xl\:-mt-0{margin-top:0}.\32xl\:-mt-1{margin-top:-.25rem}.\32xl\:-mt-2{margin-top:-.5rem}.\32xl\:-mt-3{margin-top:-.75rem}.\32xl\:-mt-4{margin-top:-1rem}.\32xl\:-mt-5{margin-top:-1.25rem}.\32xl\:-mt-6{margin-top:-1.5rem}.\32xl\:-mt-7{margin-top:-1.75rem}.\32xl\:-mt-8{margin-top:-2rem}.\32xl\:-mt-9{margin-top:-2.25rem}.\32xl\:-mt-10{margin-top:-2.5rem}.\32xl\:-mt-11{margin-top:-2.75rem}.\32xl\:-mt-12{margin-top:-3rem}.\32xl\:-mt-14{margin-top:-3.5rem}.\32xl\:-mt-16{margin-top:-4rem}.\32xl\:-mt-20{margin-top:-5rem}.\32xl\:-mt-24{margin-top:-6rem}.\32xl\:-mt-28{margin-top:-7rem}.\32xl\:-mt-32{margin-top:-8rem}.\32xl\:-mt-36{margin-top:-9rem}.\32xl\:-mt-40{margin-top:-10rem}.\32xl\:-mt-44{margin-top:-11rem}.\32xl\:-mt-48{margin-top:-12rem}.\32xl\:-mt-52{margin-top:-13rem}.\32xl\:-mt-56{margin-top:-14rem}.\32xl\:-mt-60{margin-top:-15rem}.\32xl\:-mt-64{margin-top:-16rem}.\32xl\:-mt-72{margin-top:-18rem}.\32xl\:-mt-80{margin-top:-20rem}.\32xl\:-mt-96{margin-top:-24rem}.\32xl\:-mt-px{margin-top:-1px}.\32xl\:-mt-0\.5{margin-top:-.125rem}.\32xl\:-mt-1\.5{margin-top:-.375rem}.\32xl\:-mt-2\.5{margin-top:-.625rem}.\32xl\:-mt-3\.5{margin-top:-.875rem}.\32xl\:mr-0{margin-right:0}.\32xl\:mr-1{margin-right:.25rem}.\32xl\:mr-2{margin-right:.5rem}.\32xl\:mr-3{margin-right:.75rem}.\32xl\:mr-4{margin-right:1rem}.\32xl\:mr-5{margin-right:1.25rem}.\32xl\:mr-6{margin-right:1.5rem}.\32xl\:mr-7{margin-right:1.75rem}.\32xl\:mr-8{margin-right:2rem}.\32xl\:mr-9{margin-right:2.25rem}.\32xl\:mr-10{margin-right:2.5rem}.\32xl\:mr-11{margin-right:2.75rem}.\32xl\:mr-12{margin-right:3rem}.\32xl\:mr-14{margin-right:3.5rem}.\32xl\:mr-16{margin-right:4rem}.\32xl\:mr-20{margin-right:5rem}.\32xl\:mr-24{margin-right:6rem}.\32xl\:mr-28{margin-right:7rem}.\32xl\:mr-32{margin-right:8rem}.\32xl\:mr-36{margin-right:9rem}.\32xl\:mr-40{margin-right:10rem}.\32xl\:mr-44{margin-right:11rem}.\32xl\:mr-48{margin-right:12rem}.\32xl\:mr-52{margin-right:13rem}.\32xl\:mr-56{margin-right:14rem}.\32xl\:mr-60{margin-right:15rem}.\32xl\:mr-64{margin-right:16rem}.\32xl\:mr-72{margin-right:18rem}.\32xl\:mr-80{margin-right:20rem}.\32xl\:mr-96{margin-right:24rem}.\32xl\:mr-auto{margin-right:auto}.\32xl\:mr-px{margin-right:1px}.\32xl\:mr-0\.5{margin-right:.125rem}.\32xl\:mr-1\.5{margin-right:.375rem}.\32xl\:mr-2\.5{margin-right:.625rem}.\32xl\:mr-3\.5{margin-right:.875rem}.\32xl\:-mr-0{margin-right:0}.\32xl\:-mr-1{margin-right:-.25rem}.\32xl\:-mr-2{margin-right:-.5rem}.\32xl\:-mr-3{margin-right:-.75rem}.\32xl\:-mr-4{margin-right:-1rem}.\32xl\:-mr-5{margin-right:-1.25rem}.\32xl\:-mr-6{margin-right:-1.5rem}.\32xl\:-mr-7{margin-right:-1.75rem}.\32xl\:-mr-8{margin-right:-2rem}.\32xl\:-mr-9{margin-right:-2.25rem}.\32xl\:-mr-10{margin-right:-2.5rem}.\32xl\:-mr-11{margin-right:-2.75rem}.\32xl\:-mr-12{margin-right:-3rem}.\32xl\:-mr-14{margin-right:-3.5rem}.\32xl\:-mr-16{margin-right:-4rem}.\32xl\:-mr-20{margin-right:-5rem}.\32xl\:-mr-24{margin-right:-6rem}.\32xl\:-mr-28{margin-right:-7rem}.\32xl\:-mr-32{margin-right:-8rem}.\32xl\:-mr-36{margin-right:-9rem}.\32xl\:-mr-40{margin-right:-10rem}.\32xl\:-mr-44{margin-right:-11rem}.\32xl\:-mr-48{margin-right:-12rem}.\32xl\:-mr-52{margin-right:-13rem}.\32xl\:-mr-56{margin-right:-14rem}.\32xl\:-mr-60{margin-right:-15rem}.\32xl\:-mr-64{margin-right:-16rem}.\32xl\:-mr-72{margin-right:-18rem}.\32xl\:-mr-80{margin-right:-20rem}.\32xl\:-mr-96{margin-right:-24rem}.\32xl\:-mr-px{margin-right:-1px}.\32xl\:-mr-0\.5{margin-right:-.125rem}.\32xl\:-mr-1\.5{margin-right:-.375rem}.\32xl\:-mr-2\.5{margin-right:-.625rem}.\32xl\:-mr-3\.5{margin-right:-.875rem}.\32xl\:mb-0{margin-bottom:0}.\32xl\:mb-1{margin-bottom:.25rem}.\32xl\:mb-2{margin-bottom:.5rem}.\32xl\:mb-3{margin-bottom:.75rem}.\32xl\:mb-4{margin-bottom:1rem}.\32xl\:mb-5{margin-bottom:1.25rem}.\32xl\:mb-6{margin-bottom:1.5rem}.\32xl\:mb-7{margin-bottom:1.75rem}.\32xl\:mb-8{margin-bottom:2rem}.\32xl\:mb-9{margin-bottom:2.25rem}.\32xl\:mb-10{margin-bottom:2.5rem}.\32xl\:mb-11{margin-bottom:2.75rem}.\32xl\:mb-12{margin-bottom:3rem}.\32xl\:mb-14{margin-bottom:3.5rem}.\32xl\:mb-16{margin-bottom:4rem}.\32xl\:mb-20{margin-bottom:5rem}.\32xl\:mb-24{margin-bottom:6rem}.\32xl\:mb-28{margin-bottom:7rem}.\32xl\:mb-32{margin-bottom:8rem}.\32xl\:mb-36{margin-bottom:9rem}.\32xl\:mb-40{margin-bottom:10rem}.\32xl\:mb-44{margin-bottom:11rem}.\32xl\:mb-48{margin-bottom:12rem}.\32xl\:mb-52{margin-bottom:13rem}.\32xl\:mb-56{margin-bottom:14rem}.\32xl\:mb-60{margin-bottom:15rem}.\32xl\:mb-64{margin-bottom:16rem}.\32xl\:mb-72{margin-bottom:18rem}.\32xl\:mb-80{margin-bottom:20rem}.\32xl\:mb-96{margin-bottom:24rem}.\32xl\:mb-auto{margin-bottom:auto}.\32xl\:mb-px{margin-bottom:1px}.\32xl\:mb-0\.5{margin-bottom:.125rem}.\32xl\:mb-1\.5{margin-bottom:.375rem}.\32xl\:mb-2\.5{margin-bottom:.625rem}.\32xl\:mb-3\.5{margin-bottom:.875rem}.\32xl\:-mb-0{margin-bottom:0}.\32xl\:-mb-1{margin-bottom:-.25rem}.\32xl\:-mb-2{margin-bottom:-.5rem}.\32xl\:-mb-3{margin-bottom:-.75rem}.\32xl\:-mb-4{margin-bottom:-1rem}.\32xl\:-mb-5{margin-bottom:-1.25rem}.\32xl\:-mb-6{margin-bottom:-1.5rem}.\32xl\:-mb-7{margin-bottom:-1.75rem}.\32xl\:-mb-8{margin-bottom:-2rem}.\32xl\:-mb-9{margin-bottom:-2.25rem}.\32xl\:-mb-10{margin-bottom:-2.5rem}.\32xl\:-mb-11{margin-bottom:-2.75rem}.\32xl\:-mb-12{margin-bottom:-3rem}.\32xl\:-mb-14{margin-bottom:-3.5rem}.\32xl\:-mb-16{margin-bottom:-4rem}.\32xl\:-mb-20{margin-bottom:-5rem}.\32xl\:-mb-24{margin-bottom:-6rem}.\32xl\:-mb-28{margin-bottom:-7rem}.\32xl\:-mb-32{margin-bottom:-8rem}.\32xl\:-mb-36{margin-bottom:-9rem}.\32xl\:-mb-40{margin-bottom:-10rem}.\32xl\:-mb-44{margin-bottom:-11rem}.\32xl\:-mb-48{margin-bottom:-12rem}.\32xl\:-mb-52{margin-bottom:-13rem}.\32xl\:-mb-56{margin-bottom:-14rem}.\32xl\:-mb-60{margin-bottom:-15rem}.\32xl\:-mb-64{margin-bottom:-16rem}.\32xl\:-mb-72{margin-bottom:-18rem}.\32xl\:-mb-80{margin-bottom:-20rem}.\32xl\:-mb-96{margin-bottom:-24rem}.\32xl\:-mb-px{margin-bottom:-1px}.\32xl\:-mb-0\.5{margin-bottom:-.125rem}.\32xl\:-mb-1\.5{margin-bottom:-.375rem}.\32xl\:-mb-2\.5{margin-bottom:-.625rem}.\32xl\:-mb-3\.5{margin-bottom:-.875rem}.\32xl\:ml-0{margin-left:0}.\32xl\:ml-1{margin-left:.25rem}.\32xl\:ml-2{margin-left:.5rem}.\32xl\:ml-3{margin-left:.75rem}.\32xl\:ml-4{margin-left:1rem}.\32xl\:ml-5{margin-left:1.25rem}.\32xl\:ml-6{margin-left:1.5rem}.\32xl\:ml-7{margin-left:1.75rem}.\32xl\:ml-8{margin-left:2rem}.\32xl\:ml-9{margin-left:2.25rem}.\32xl\:ml-10{margin-left:2.5rem}.\32xl\:ml-11{margin-left:2.75rem}.\32xl\:ml-12{margin-left:3rem}.\32xl\:ml-14{margin-left:3.5rem}.\32xl\:ml-16{margin-left:4rem}.\32xl\:ml-20{margin-left:5rem}.\32xl\:ml-24{margin-left:6rem}.\32xl\:ml-28{margin-left:7rem}.\32xl\:ml-32{margin-left:8rem}.\32xl\:ml-36{margin-left:9rem}.\32xl\:ml-40{margin-left:10rem}.\32xl\:ml-44{margin-left:11rem}.\32xl\:ml-48{margin-left:12rem}.\32xl\:ml-52{margin-left:13rem}.\32xl\:ml-56{margin-left:14rem}.\32xl\:ml-60{margin-left:15rem}.\32xl\:ml-64{margin-left:16rem}.\32xl\:ml-72{margin-left:18rem}.\32xl\:ml-80{margin-left:20rem}.\32xl\:ml-96{margin-left:24rem}.\32xl\:ml-auto{margin-left:auto}.\32xl\:ml-px{margin-left:1px}.\32xl\:ml-0\.5{margin-left:.125rem}.\32xl\:ml-1\.5{margin-left:.375rem}.\32xl\:ml-2\.5{margin-left:.625rem}.\32xl\:ml-3\.5{margin-left:.875rem}.\32xl\:-ml-0{margin-left:0}.\32xl\:-ml-1{margin-left:-.25rem}.\32xl\:-ml-2{margin-left:-.5rem}.\32xl\:-ml-3{margin-left:-.75rem}.\32xl\:-ml-4{margin-left:-1rem}.\32xl\:-ml-5{margin-left:-1.25rem}.\32xl\:-ml-6{margin-left:-1.5rem}.\32xl\:-ml-7{margin-left:-1.75rem}.\32xl\:-ml-8{margin-left:-2rem}.\32xl\:-ml-9{margin-left:-2.25rem}.\32xl\:-ml-10{margin-left:-2.5rem}.\32xl\:-ml-11{margin-left:-2.75rem}.\32xl\:-ml-12{margin-left:-3rem}.\32xl\:-ml-14{margin-left:-3.5rem}.\32xl\:-ml-16{margin-left:-4rem}.\32xl\:-ml-20{margin-left:-5rem}.\32xl\:-ml-24{margin-left:-6rem}.\32xl\:-ml-28{margin-left:-7rem}.\32xl\:-ml-32{margin-left:-8rem}.\32xl\:-ml-36{margin-left:-9rem}.\32xl\:-ml-40{margin-left:-10rem}.\32xl\:-ml-44{margin-left:-11rem}.\32xl\:-ml-48{margin-left:-12rem}.\32xl\:-ml-52{margin-left:-13rem}.\32xl\:-ml-56{margin-left:-14rem}.\32xl\:-ml-60{margin-left:-15rem}.\32xl\:-ml-64{margin-left:-16rem}.\32xl\:-ml-72{margin-left:-18rem}.\32xl\:-ml-80{margin-left:-20rem}.\32xl\:-ml-96{margin-left:-24rem}.\32xl\:-ml-px{margin-left:-1px}.\32xl\:-ml-0\.5{margin-left:-.125rem}.\32xl\:-ml-1\.5{margin-left:-.375rem}.\32xl\:-ml-2\.5{margin-left:-.625rem}.\32xl\:-ml-3\.5{margin-left:-.875rem}.\32xl\:box-border{box-sizing:border-box}.\32xl\:box-content{box-sizing:initial}.\32xl\:block{display:block}.\32xl\:inline-block{display:inline-block}.\32xl\:inline{display:inline}.\32xl\:flex{display:flex}.\32xl\:inline-flex{display:inline-flex}.\32xl\:table{display:table}.\32xl\:inline-table{display:inline-table}.\32xl\:table-caption{display:table-caption}.\32xl\:table-cell{display:table-cell}.\32xl\:table-column{display:table-column}.\32xl\:table-column-group{display:table-column-group}.\32xl\:table-footer-group{display:table-footer-group}.\32xl\:table-header-group{display:table-header-group}.\32xl\:table-row-group{display:table-row-group}.\32xl\:table-row{display:table-row}.\32xl\:flow-root{display:flow-root}.\32xl\:grid{display:grid}.\32xl\:inline-grid{display:inline-grid}.\32xl\:contents{display:contents}.\32xl\:list-item{display:list-item}.\32xl\:hidden{display:none}.\32xl\:h-0{height:0}.\32xl\:h-1{height:.25rem}.\32xl\:h-2{height:.5rem}.\32xl\:h-3{height:.75rem}.\32xl\:h-4{height:1rem}.\32xl\:h-5{height:1.25rem}.\32xl\:h-6{height:1.5rem}.\32xl\:h-7{height:1.75rem}.\32xl\:h-8{height:2rem}.\32xl\:h-9{height:2.25rem}.\32xl\:h-10{height:2.5rem}.\32xl\:h-11{height:2.75rem}.\32xl\:h-12{height:3rem}.\32xl\:h-14{height:3.5rem}.\32xl\:h-16{height:4rem}.\32xl\:h-20{height:5rem}.\32xl\:h-24{height:6rem}.\32xl\:h-28{height:7rem}.\32xl\:h-32{height:8rem}.\32xl\:h-36{height:9rem}.\32xl\:h-40{height:10rem}.\32xl\:h-44{height:11rem}.\32xl\:h-48{height:12rem}.\32xl\:h-52{height:13rem}.\32xl\:h-56{height:14rem}.\32xl\:h-60{height:15rem}.\32xl\:h-64{height:16rem}.\32xl\:h-72{height:18rem}.\32xl\:h-80{height:20rem}.\32xl\:h-96{height:24rem}.\32xl\:h-auto{height:auto}.\32xl\:h-px{height:1px}.\32xl\:h-0\.5{height:.125rem}.\32xl\:h-1\.5{height:.375rem}.\32xl\:h-2\.5{height:.625rem}.\32xl\:h-3\.5{height:.875rem}.\32xl\:h-1\/2{height:50%}.\32xl\:h-1\/3{height:33.333333%}.\32xl\:h-2\/3{height:66.666667%}.\32xl\:h-1\/4{height:25%}.\32xl\:h-2\/4{height:50%}.\32xl\:h-3\/4{height:75%}.\32xl\:h-1\/5{height:20%}.\32xl\:h-2\/5{height:40%}.\32xl\:h-3\/5{height:60%}.\32xl\:h-4\/5{height:80%}.\32xl\:h-1\/6{height:16.666667%}.\32xl\:h-2\/6{height:33.333333%}.\32xl\:h-3\/6{height:50%}.\32xl\:h-4\/6{height:66.666667%}.\32xl\:h-5\/6{height:83.333333%}.\32xl\:h-full{height:100%}.\32xl\:h-screen{height:100vh}.\32xl\:max-h-0{max-height:0}.\32xl\:max-h-1{max-height:.25rem}.\32xl\:max-h-2{max-height:.5rem}.\32xl\:max-h-3{max-height:.75rem}.\32xl\:max-h-4{max-height:1rem}.\32xl\:max-h-5{max-height:1.25rem}.\32xl\:max-h-6{max-height:1.5rem}.\32xl\:max-h-7{max-height:1.75rem}.\32xl\:max-h-8{max-height:2rem}.\32xl\:max-h-9{max-height:2.25rem}.\32xl\:max-h-10{max-height:2.5rem}.\32xl\:max-h-11{max-height:2.75rem}.\32xl\:max-h-12{max-height:3rem}.\32xl\:max-h-14{max-height:3.5rem}.\32xl\:max-h-16{max-height:4rem}.\32xl\:max-h-20{max-height:5rem}.\32xl\:max-h-24{max-height:6rem}.\32xl\:max-h-28{max-height:7rem}.\32xl\:max-h-32{max-height:8rem}.\32xl\:max-h-36{max-height:9rem}.\32xl\:max-h-40{max-height:10rem}.\32xl\:max-h-44{max-height:11rem}.\32xl\:max-h-48{max-height:12rem}.\32xl\:max-h-52{max-height:13rem}.\32xl\:max-h-56{max-height:14rem}.\32xl\:max-h-60{max-height:15rem}.\32xl\:max-h-64{max-height:16rem}.\32xl\:max-h-72{max-height:18rem}.\32xl\:max-h-80{max-height:20rem}.\32xl\:max-h-96{max-height:24rem}.\32xl\:max-h-px{max-height:1px}.\32xl\:max-h-0\.5{max-height:.125rem}.\32xl\:max-h-1\.5{max-height:.375rem}.\32xl\:max-h-2\.5{max-height:.625rem}.\32xl\:max-h-3\.5{max-height:.875rem}.\32xl\:max-h-full{max-height:100%}.\32xl\:max-h-screen{max-height:100vh}.\32xl\:min-h-0{min-height:0}.\32xl\:min-h-full{min-height:100%}.\32xl\:min-h-screen{min-height:100vh}.\32xl\:w-0{width:0}.\32xl\:w-1{width:.25rem}.\32xl\:w-2{width:.5rem}.\32xl\:w-3{width:.75rem}.\32xl\:w-4{width:1rem}.\32xl\:w-5{width:1.25rem}.\32xl\:w-6{width:1.5rem}.\32xl\:w-7{width:1.75rem}.\32xl\:w-8{width:2rem}.\32xl\:w-9{width:2.25rem}.\32xl\:w-10{width:2.5rem}.\32xl\:w-11{width:2.75rem}.\32xl\:w-12{width:3rem}.\32xl\:w-14{width:3.5rem}.\32xl\:w-16{width:4rem}.\32xl\:w-20{width:5rem}.\32xl\:w-24{width:6rem}.\32xl\:w-28{width:7rem}.\32xl\:w-32{width:8rem}.\32xl\:w-36{width:9rem}.\32xl\:w-40{width:10rem}.\32xl\:w-44{width:11rem}.\32xl\:w-48{width:12rem}.\32xl\:w-52{width:13rem}.\32xl\:w-56{width:14rem}.\32xl\:w-60{width:15rem}.\32xl\:w-64{width:16rem}.\32xl\:w-72{width:18rem}.\32xl\:w-80{width:20rem}.\32xl\:w-96{width:24rem}.\32xl\:w-auto{width:auto}.\32xl\:w-px{width:1px}.\32xl\:w-0\.5{width:.125rem}.\32xl\:w-1\.5{width:.375rem}.\32xl\:w-2\.5{width:.625rem}.\32xl\:w-3\.5{width:.875rem}.\32xl\:w-1\/2{width:50%}.\32xl\:w-1\/3{width:33.333333%}.\32xl\:w-2\/3{width:66.666667%}.\32xl\:w-1\/4{width:25%}.\32xl\:w-2\/4{width:50%}.\32xl\:w-3\/4{width:75%}.\32xl\:w-1\/5{width:20%}.\32xl\:w-2\/5{width:40%}.\32xl\:w-3\/5{width:60%}.\32xl\:w-4\/5{width:80%}.\32xl\:w-1\/6{width:16.666667%}.\32xl\:w-2\/6{width:33.333333%}.\32xl\:w-3\/6{width:50%}.\32xl\:w-4\/6{width:66.666667%}.\32xl\:w-5\/6{width:83.333333%}.\32xl\:w-1\/12{width:8.333333%}.\32xl\:w-2\/12{width:16.666667%}.\32xl\:w-3\/12{width:25%}.\32xl\:w-4\/12{width:33.333333%}.\32xl\:w-5\/12{width:41.666667%}.\32xl\:w-6\/12{width:50%}.\32xl\:w-7\/12{width:58.333333%}.\32xl\:w-8\/12{width:66.666667%}.\32xl\:w-9\/12{width:75%}.\32xl\:w-10\/12{width:83.333333%}.\32xl\:w-11\/12{width:91.666667%}.\32xl\:w-full{width:100%}.\32xl\:w-screen{width:100vw}.\32xl\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.\32xl\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.\32xl\:min-w-0{min-width:0}.\32xl\:min-w-full{min-width:100%}.\32xl\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.\32xl\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.\32xl\:max-w-0{max-width:0}.\32xl\:max-w-none{max-width:none}.\32xl\:max-w-xs{max-width:20rem}.\32xl\:max-w-sm{max-width:24rem}.\32xl\:max-w-md{max-width:28rem}.\32xl\:max-w-lg{max-width:32rem}.\32xl\:max-w-xl{max-width:36rem}.\32xl\:max-w-2xl{max-width:42rem}.\32xl\:max-w-3xl{max-width:48rem}.\32xl\:max-w-4xl{max-width:56rem}.\32xl\:max-w-5xl{max-width:64rem}.\32xl\:max-w-6xl{max-width:72rem}.\32xl\:max-w-7xl{max-width:80rem}.\32xl\:max-w-full{max-width:100%}.\32xl\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.\32xl\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.\32xl\:max-w-prose{max-width:65ch}.\32xl\:max-w-screen-sm{max-width:640px}.\32xl\:max-w-screen-md{max-width:768px}.\32xl\:max-w-screen-lg{max-width:1024px}.\32xl\:max-w-screen-xl{max-width:1280px}.\32xl\:max-w-screen-2xl{max-width:1536px}.\32xl\:flex-1{flex:1 1 0%}.\32xl\:flex-auto{flex:1 1 auto}.\32xl\:flex-initial{flex:0 1 auto}.\32xl\:flex-none{flex:none}.\32xl\:flex-shrink-0{flex-shrink:0}.\32xl\:flex-shrink{flex-shrink:1}.\32xl\:flex-grow-0{flex-grow:0}.\32xl\:flex-grow{flex-grow:1}.\32xl\:table-auto{table-layout:auto}.\32xl\:table-fixed{table-layout:fixed}.\32xl\:border-collapse{border-collapse:collapse}.\32xl\:border-separate{border-collapse:initial}.\32xl\:origin-center{transform-origin:center}.\32xl\:origin-top{transform-origin:top}.\32xl\:origin-top-right{transform-origin:top right}.\32xl\:origin-right{transform-origin:right}.\32xl\:origin-bottom-right{transform-origin:bottom right}.\32xl\:origin-bottom{transform-origin:bottom}.\32xl\:origin-bottom-left{transform-origin:bottom left}.\32xl\:origin-left{transform-origin:left}.\32xl\:origin-top-left{transform-origin:top left}.\32xl\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\32xl\:transform,.\32xl\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.\32xl\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\32xl\:transform-none{transform:none}.\32xl\:translate-x-0{--tw-translate-x:0px}.\32xl\:translate-x-1{--tw-translate-x:0.25rem}.\32xl\:translate-x-2{--tw-translate-x:0.5rem}.\32xl\:translate-x-3{--tw-translate-x:0.75rem}.\32xl\:translate-x-4{--tw-translate-x:1rem}.\32xl\:translate-x-5{--tw-translate-x:1.25rem}.\32xl\:translate-x-6{--tw-translate-x:1.5rem}.\32xl\:translate-x-7{--tw-translate-x:1.75rem}.\32xl\:translate-x-8{--tw-translate-x:2rem}.\32xl\:translate-x-9{--tw-translate-x:2.25rem}.\32xl\:translate-x-10{--tw-translate-x:2.5rem}.\32xl\:translate-x-11{--tw-translate-x:2.75rem}.\32xl\:translate-x-12{--tw-translate-x:3rem}.\32xl\:translate-x-14{--tw-translate-x:3.5rem}.\32xl\:translate-x-16{--tw-translate-x:4rem}.\32xl\:translate-x-20{--tw-translate-x:5rem}.\32xl\:translate-x-24{--tw-translate-x:6rem}.\32xl\:translate-x-28{--tw-translate-x:7rem}.\32xl\:translate-x-32{--tw-translate-x:8rem}.\32xl\:translate-x-36{--tw-translate-x:9rem}.\32xl\:translate-x-40{--tw-translate-x:10rem}.\32xl\:translate-x-44{--tw-translate-x:11rem}.\32xl\:translate-x-48{--tw-translate-x:12rem}.\32xl\:translate-x-52{--tw-translate-x:13rem}.\32xl\:translate-x-56{--tw-translate-x:14rem}.\32xl\:translate-x-60{--tw-translate-x:15rem}.\32xl\:translate-x-64{--tw-translate-x:16rem}.\32xl\:translate-x-72{--tw-translate-x:18rem}.\32xl\:translate-x-80{--tw-translate-x:20rem}.\32xl\:translate-x-96{--tw-translate-x:24rem}.\32xl\:translate-x-px{--tw-translate-x:1px}.\32xl\:translate-x-0\.5{--tw-translate-x:0.125rem}.\32xl\:translate-x-1\.5{--tw-translate-x:0.375rem}.\32xl\:translate-x-2\.5{--tw-translate-x:0.625rem}.\32xl\:translate-x-3\.5{--tw-translate-x:0.875rem}.\32xl\:-translate-x-0{--tw-translate-x:0px}.\32xl\:-translate-x-1{--tw-translate-x:-0.25rem}.\32xl\:-translate-x-2{--tw-translate-x:-0.5rem}.\32xl\:-translate-x-3{--tw-translate-x:-0.75rem}.\32xl\:-translate-x-4{--tw-translate-x:-1rem}.\32xl\:-translate-x-5{--tw-translate-x:-1.25rem}.\32xl\:-translate-x-6{--tw-translate-x:-1.5rem}.\32xl\:-translate-x-7{--tw-translate-x:-1.75rem}.\32xl\:-translate-x-8{--tw-translate-x:-2rem}.\32xl\:-translate-x-9{--tw-translate-x:-2.25rem}.\32xl\:-translate-x-10{--tw-translate-x:-2.5rem}.\32xl\:-translate-x-11{--tw-translate-x:-2.75rem}.\32xl\:-translate-x-12{--tw-translate-x:-3rem}.\32xl\:-translate-x-14{--tw-translate-x:-3.5rem}.\32xl\:-translate-x-16{--tw-translate-x:-4rem}.\32xl\:-translate-x-20{--tw-translate-x:-5rem}.\32xl\:-translate-x-24{--tw-translate-x:-6rem}.\32xl\:-translate-x-28{--tw-translate-x:-7rem}.\32xl\:-translate-x-32{--tw-translate-x:-8rem}.\32xl\:-translate-x-36{--tw-translate-x:-9rem}.\32xl\:-translate-x-40{--tw-translate-x:-10rem}.\32xl\:-translate-x-44{--tw-translate-x:-11rem}.\32xl\:-translate-x-48{--tw-translate-x:-12rem}.\32xl\:-translate-x-52{--tw-translate-x:-13rem}.\32xl\:-translate-x-56{--tw-translate-x:-14rem}.\32xl\:-translate-x-60{--tw-translate-x:-15rem}.\32xl\:-translate-x-64{--tw-translate-x:-16rem}.\32xl\:-translate-x-72{--tw-translate-x:-18rem}.\32xl\:-translate-x-80{--tw-translate-x:-20rem}.\32xl\:-translate-x-96{--tw-translate-x:-24rem}.\32xl\:-translate-x-px{--tw-translate-x:-1px}.\32xl\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.\32xl\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.\32xl\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.\32xl\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.\32xl\:translate-x-1\/2{--tw-translate-x:50%}.\32xl\:translate-x-1\/3{--tw-translate-x:33.333333%}.\32xl\:translate-x-2\/3{--tw-translate-x:66.666667%}.\32xl\:translate-x-1\/4{--tw-translate-x:25%}.\32xl\:translate-x-2\/4{--tw-translate-x:50%}.\32xl\:translate-x-3\/4{--tw-translate-x:75%}.\32xl\:translate-x-full{--tw-translate-x:100%}.\32xl\:-translate-x-1\/2{--tw-translate-x:-50%}.\32xl\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.\32xl\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.\32xl\:-translate-x-1\/4{--tw-translate-x:-25%}.\32xl\:-translate-x-2\/4{--tw-translate-x:-50%}.\32xl\:-translate-x-3\/4{--tw-translate-x:-75%}.\32xl\:-translate-x-full{--tw-translate-x:-100%}.\32xl\:translate-y-0{--tw-translate-y:0px}.\32xl\:translate-y-1{--tw-translate-y:0.25rem}.\32xl\:translate-y-2{--tw-translate-y:0.5rem}.\32xl\:translate-y-3{--tw-translate-y:0.75rem}.\32xl\:translate-y-4{--tw-translate-y:1rem}.\32xl\:translate-y-5{--tw-translate-y:1.25rem}.\32xl\:translate-y-6{--tw-translate-y:1.5rem}.\32xl\:translate-y-7{--tw-translate-y:1.75rem}.\32xl\:translate-y-8{--tw-translate-y:2rem}.\32xl\:translate-y-9{--tw-translate-y:2.25rem}.\32xl\:translate-y-10{--tw-translate-y:2.5rem}.\32xl\:translate-y-11{--tw-translate-y:2.75rem}.\32xl\:translate-y-12{--tw-translate-y:3rem}.\32xl\:translate-y-14{--tw-translate-y:3.5rem}.\32xl\:translate-y-16{--tw-translate-y:4rem}.\32xl\:translate-y-20{--tw-translate-y:5rem}.\32xl\:translate-y-24{--tw-translate-y:6rem}.\32xl\:translate-y-28{--tw-translate-y:7rem}.\32xl\:translate-y-32{--tw-translate-y:8rem}.\32xl\:translate-y-36{--tw-translate-y:9rem}.\32xl\:translate-y-40{--tw-translate-y:10rem}.\32xl\:translate-y-44{--tw-translate-y:11rem}.\32xl\:translate-y-48{--tw-translate-y:12rem}.\32xl\:translate-y-52{--tw-translate-y:13rem}.\32xl\:translate-y-56{--tw-translate-y:14rem}.\32xl\:translate-y-60{--tw-translate-y:15rem}.\32xl\:translate-y-64{--tw-translate-y:16rem}.\32xl\:translate-y-72{--tw-translate-y:18rem}.\32xl\:translate-y-80{--tw-translate-y:20rem}.\32xl\:translate-y-96{--tw-translate-y:24rem}.\32xl\:translate-y-px{--tw-translate-y:1px}.\32xl\:translate-y-0\.5{--tw-translate-y:0.125rem}.\32xl\:translate-y-1\.5{--tw-translate-y:0.375rem}.\32xl\:translate-y-2\.5{--tw-translate-y:0.625rem}.\32xl\:translate-y-3\.5{--tw-translate-y:0.875rem}.\32xl\:-translate-y-0{--tw-translate-y:0px}.\32xl\:-translate-y-1{--tw-translate-y:-0.25rem}.\32xl\:-translate-y-2{--tw-translate-y:-0.5rem}.\32xl\:-translate-y-3{--tw-translate-y:-0.75rem}.\32xl\:-translate-y-4{--tw-translate-y:-1rem}.\32xl\:-translate-y-5{--tw-translate-y:-1.25rem}.\32xl\:-translate-y-6{--tw-translate-y:-1.5rem}.\32xl\:-translate-y-7{--tw-translate-y:-1.75rem}.\32xl\:-translate-y-8{--tw-translate-y:-2rem}.\32xl\:-translate-y-9{--tw-translate-y:-2.25rem}.\32xl\:-translate-y-10{--tw-translate-y:-2.5rem}.\32xl\:-translate-y-11{--tw-translate-y:-2.75rem}.\32xl\:-translate-y-12{--tw-translate-y:-3rem}.\32xl\:-translate-y-14{--tw-translate-y:-3.5rem}.\32xl\:-translate-y-16{--tw-translate-y:-4rem}.\32xl\:-translate-y-20{--tw-translate-y:-5rem}.\32xl\:-translate-y-24{--tw-translate-y:-6rem}.\32xl\:-translate-y-28{--tw-translate-y:-7rem}.\32xl\:-translate-y-32{--tw-translate-y:-8rem}.\32xl\:-translate-y-36{--tw-translate-y:-9rem}.\32xl\:-translate-y-40{--tw-translate-y:-10rem}.\32xl\:-translate-y-44{--tw-translate-y:-11rem}.\32xl\:-translate-y-48{--tw-translate-y:-12rem}.\32xl\:-translate-y-52{--tw-translate-y:-13rem}.\32xl\:-translate-y-56{--tw-translate-y:-14rem}.\32xl\:-translate-y-60{--tw-translate-y:-15rem}.\32xl\:-translate-y-64{--tw-translate-y:-16rem}.\32xl\:-translate-y-72{--tw-translate-y:-18rem}.\32xl\:-translate-y-80{--tw-translate-y:-20rem}.\32xl\:-translate-y-96{--tw-translate-y:-24rem}.\32xl\:-translate-y-px{--tw-translate-y:-1px}.\32xl\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.\32xl\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.\32xl\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.\32xl\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.\32xl\:translate-y-1\/2{--tw-translate-y:50%}.\32xl\:translate-y-1\/3{--tw-translate-y:33.333333%}.\32xl\:translate-y-2\/3{--tw-translate-y:66.666667%}.\32xl\:translate-y-1\/4{--tw-translate-y:25%}.\32xl\:translate-y-2\/4{--tw-translate-y:50%}.\32xl\:translate-y-3\/4{--tw-translate-y:75%}.\32xl\:translate-y-full{--tw-translate-y:100%}.\32xl\:-translate-y-1\/2{--tw-translate-y:-50%}.\32xl\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.\32xl\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.\32xl\:-translate-y-1\/4{--tw-translate-y:-25%}.\32xl\:-translate-y-2\/4{--tw-translate-y:-50%}.\32xl\:-translate-y-3\/4{--tw-translate-y:-75%}.\32xl\:-translate-y-full{--tw-translate-y:-100%}.\32xl\:hover\:translate-x-0:hover{--tw-translate-x:0px}.\32xl\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.\32xl\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.\32xl\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.\32xl\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.\32xl\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.\32xl\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.\32xl\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.\32xl\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.\32xl\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.\32xl\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.\32xl\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.\32xl\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.\32xl\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.\32xl\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.\32xl\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.\32xl\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.\32xl\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.\32xl\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.\32xl\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.\32xl\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.\32xl\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.\32xl\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.\32xl\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.\32xl\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.\32xl\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.\32xl\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.\32xl\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.\32xl\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.\32xl\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.\32xl\:hover\:translate-x-px:hover{--tw-translate-x:1px}.\32xl\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.\32xl\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.\32xl\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.\32xl\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.\32xl\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.\32xl\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.\32xl\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.\32xl\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.\32xl\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.\32xl\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.\32xl\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.\32xl\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.\32xl\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.\32xl\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.\32xl\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.\32xl\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.\32xl\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.\32xl\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.\32xl\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.\32xl\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.\32xl\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.\32xl\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.\32xl\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.\32xl\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.\32xl\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.\32xl\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.\32xl\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.\32xl\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.\32xl\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.\32xl\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.\32xl\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.\32xl\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.\32xl\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.\32xl\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.\32xl\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.\32xl\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.\32xl\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.\32xl\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.\32xl\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.\32xl\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.\32xl\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.\32xl\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.\32xl\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.\32xl\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.\32xl\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.\32xl\:hover\:translate-x-full:hover{--tw-translate-x:100%}.\32xl\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.\32xl\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.\32xl\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.\32xl\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.\32xl\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.\32xl\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.\32xl\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.\32xl\:hover\:translate-y-0:hover{--tw-translate-y:0px}.\32xl\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.\32xl\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.\32xl\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.\32xl\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.\32xl\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.\32xl\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.\32xl\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.\32xl\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.\32xl\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.\32xl\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.\32xl\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.\32xl\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.\32xl\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.\32xl\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.\32xl\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.\32xl\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.\32xl\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.\32xl\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.\32xl\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.\32xl\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.\32xl\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.\32xl\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.\32xl\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.\32xl\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.\32xl\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.\32xl\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.\32xl\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.\32xl\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.\32xl\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.\32xl\:hover\:translate-y-px:hover{--tw-translate-y:1px}.\32xl\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.\32xl\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.\32xl\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.\32xl\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.\32xl\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.\32xl\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.\32xl\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.\32xl\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.\32xl\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.\32xl\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.\32xl\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.\32xl\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.\32xl\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.\32xl\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.\32xl\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.\32xl\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.\32xl\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.\32xl\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.\32xl\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.\32xl\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.\32xl\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.\32xl\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.\32xl\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.\32xl\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.\32xl\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.\32xl\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.\32xl\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.\32xl\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.\32xl\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.\32xl\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.\32xl\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.\32xl\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.\32xl\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.\32xl\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.\32xl\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.\32xl\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.\32xl\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.\32xl\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.\32xl\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.\32xl\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.\32xl\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.\32xl\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.\32xl\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.\32xl\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.\32xl\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.\32xl\:hover\:translate-y-full:hover{--tw-translate-y:100%}.\32xl\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.\32xl\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.\32xl\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.\32xl\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.\32xl\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.\32xl\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.\32xl\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.\32xl\:focus\:translate-x-0:focus{--tw-translate-x:0px}.\32xl\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.\32xl\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.\32xl\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.\32xl\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.\32xl\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.\32xl\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.\32xl\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.\32xl\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.\32xl\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.\32xl\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.\32xl\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.\32xl\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.\32xl\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.\32xl\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.\32xl\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.\32xl\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.\32xl\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.\32xl\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.\32xl\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.\32xl\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.\32xl\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.\32xl\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.\32xl\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.\32xl\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.\32xl\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.\32xl\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.\32xl\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.\32xl\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.\32xl\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.\32xl\:focus\:translate-x-px:focus{--tw-translate-x:1px}.\32xl\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.\32xl\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.\32xl\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.\32xl\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.\32xl\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.\32xl\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.\32xl\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.\32xl\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.\32xl\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.\32xl\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.\32xl\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.\32xl\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.\32xl\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.\32xl\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.\32xl\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.\32xl\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.\32xl\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.\32xl\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.\32xl\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.\32xl\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.\32xl\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.\32xl\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.\32xl\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.\32xl\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.\32xl\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.\32xl\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.\32xl\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.\32xl\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.\32xl\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.\32xl\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.\32xl\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.\32xl\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.\32xl\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.\32xl\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.\32xl\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.\32xl\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.\32xl\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.\32xl\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.\32xl\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.\32xl\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.\32xl\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.\32xl\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.\32xl\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.\32xl\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.\32xl\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.\32xl\:focus\:translate-x-full:focus{--tw-translate-x:100%}.\32xl\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.\32xl\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.\32xl\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.\32xl\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.\32xl\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.\32xl\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.\32xl\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.\32xl\:focus\:translate-y-0:focus{--tw-translate-y:0px}.\32xl\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.\32xl\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.\32xl\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.\32xl\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.\32xl\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.\32xl\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.\32xl\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.\32xl\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.\32xl\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.\32xl\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.\32xl\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.\32xl\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.\32xl\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.\32xl\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.\32xl\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.\32xl\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.\32xl\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.\32xl\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.\32xl\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.\32xl\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.\32xl\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.\32xl\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.\32xl\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.\32xl\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.\32xl\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.\32xl\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.\32xl\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.\32xl\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.\32xl\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.\32xl\:focus\:translate-y-px:focus{--tw-translate-y:1px}.\32xl\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.\32xl\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.\32xl\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.\32xl\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.\32xl\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.\32xl\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.\32xl\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.\32xl\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.\32xl\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.\32xl\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.\32xl\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.\32xl\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.\32xl\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.\32xl\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.\32xl\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.\32xl\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.\32xl\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.\32xl\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.\32xl\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.\32xl\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.\32xl\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.\32xl\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.\32xl\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.\32xl\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.\32xl\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.\32xl\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.\32xl\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.\32xl\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.\32xl\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.\32xl\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.\32xl\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.\32xl\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.\32xl\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.\32xl\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.\32xl\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.\32xl\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.\32xl\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.\32xl\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.\32xl\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.\32xl\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.\32xl\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.\32xl\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.\32xl\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.\32xl\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.\32xl\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.\32xl\:focus\:translate-y-full:focus{--tw-translate-y:100%}.\32xl\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.\32xl\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.\32xl\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.\32xl\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.\32xl\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.\32xl\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.\32xl\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.\32xl\:rotate-0{--tw-rotate:0deg}.\32xl\:rotate-1{--tw-rotate:1deg}.\32xl\:rotate-2{--tw-rotate:2deg}.\32xl\:rotate-3{--tw-rotate:3deg}.\32xl\:rotate-6{--tw-rotate:6deg}.\32xl\:rotate-12{--tw-rotate:12deg}.\32xl\:rotate-45{--tw-rotate:45deg}.\32xl\:rotate-90{--tw-rotate:90deg}.\32xl\:rotate-180{--tw-rotate:180deg}.\32xl\:-rotate-180{--tw-rotate:-180deg}.\32xl\:-rotate-90{--tw-rotate:-90deg}.\32xl\:-rotate-45{--tw-rotate:-45deg}.\32xl\:-rotate-12{--tw-rotate:-12deg}.\32xl\:-rotate-6{--tw-rotate:-6deg}.\32xl\:-rotate-3{--tw-rotate:-3deg}.\32xl\:-rotate-2{--tw-rotate:-2deg}.\32xl\:-rotate-1{--tw-rotate:-1deg}.\32xl\:hover\:rotate-0:hover{--tw-rotate:0deg}.\32xl\:hover\:rotate-1:hover{--tw-rotate:1deg}.\32xl\:hover\:rotate-2:hover{--tw-rotate:2deg}.\32xl\:hover\:rotate-3:hover{--tw-rotate:3deg}.\32xl\:hover\:rotate-6:hover{--tw-rotate:6deg}.\32xl\:hover\:rotate-12:hover{--tw-rotate:12deg}.\32xl\:hover\:rotate-45:hover{--tw-rotate:45deg}.\32xl\:hover\:rotate-90:hover{--tw-rotate:90deg}.\32xl\:hover\:rotate-180:hover{--tw-rotate:180deg}.\32xl\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.\32xl\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.\32xl\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.\32xl\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.\32xl\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.\32xl\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.\32xl\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.\32xl\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.\32xl\:focus\:rotate-0:focus{--tw-rotate:0deg}.\32xl\:focus\:rotate-1:focus{--tw-rotate:1deg}.\32xl\:focus\:rotate-2:focus{--tw-rotate:2deg}.\32xl\:focus\:rotate-3:focus{--tw-rotate:3deg}.\32xl\:focus\:rotate-6:focus{--tw-rotate:6deg}.\32xl\:focus\:rotate-12:focus{--tw-rotate:12deg}.\32xl\:focus\:rotate-45:focus{--tw-rotate:45deg}.\32xl\:focus\:rotate-90:focus{--tw-rotate:90deg}.\32xl\:focus\:rotate-180:focus{--tw-rotate:180deg}.\32xl\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.\32xl\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.\32xl\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.\32xl\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.\32xl\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.\32xl\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.\32xl\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.\32xl\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.\32xl\:skew-x-0{--tw-skew-x:0deg}.\32xl\:skew-x-1{--tw-skew-x:1deg}.\32xl\:skew-x-2{--tw-skew-x:2deg}.\32xl\:skew-x-3{--tw-skew-x:3deg}.\32xl\:skew-x-6{--tw-skew-x:6deg}.\32xl\:skew-x-12{--tw-skew-x:12deg}.\32xl\:-skew-x-12{--tw-skew-x:-12deg}.\32xl\:-skew-x-6{--tw-skew-x:-6deg}.\32xl\:-skew-x-3{--tw-skew-x:-3deg}.\32xl\:-skew-x-2{--tw-skew-x:-2deg}.\32xl\:-skew-x-1{--tw-skew-x:-1deg}.\32xl\:skew-y-0{--tw-skew-y:0deg}.\32xl\:skew-y-1{--tw-skew-y:1deg}.\32xl\:skew-y-2{--tw-skew-y:2deg}.\32xl\:skew-y-3{--tw-skew-y:3deg}.\32xl\:skew-y-6{--tw-skew-y:6deg}.\32xl\:skew-y-12{--tw-skew-y:12deg}.\32xl\:-skew-y-12{--tw-skew-y:-12deg}.\32xl\:-skew-y-6{--tw-skew-y:-6deg}.\32xl\:-skew-y-3{--tw-skew-y:-3deg}.\32xl\:-skew-y-2{--tw-skew-y:-2deg}.\32xl\:-skew-y-1{--tw-skew-y:-1deg}.\32xl\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.\32xl\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.\32xl\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.\32xl\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.\32xl\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.\32xl\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.\32xl\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.\32xl\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.\32xl\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.\32xl\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.\32xl\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.\32xl\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.\32xl\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.\32xl\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.\32xl\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.\32xl\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.\32xl\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.\32xl\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.\32xl\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.\32xl\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.\32xl\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.\32xl\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.\32xl\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.\32xl\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.\32xl\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.\32xl\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.\32xl\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.\32xl\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.\32xl\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.\32xl\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.\32xl\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.\32xl\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.\32xl\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.\32xl\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.\32xl\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.\32xl\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.\32xl\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.\32xl\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.\32xl\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.\32xl\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.\32xl\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.\32xl\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.\32xl\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.\32xl\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.\32xl\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.\32xl\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.\32xl\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.\32xl\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.\32xl\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.\32xl\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.\32xl\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.\32xl\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.\32xl\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.\32xl\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.\32xl\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.\32xl\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.\32xl\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.\32xl\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.\32xl\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.\32xl\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.\32xl\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.\32xl\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.\32xl\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.\32xl\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.\32xl\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.\32xl\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.\32xl\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.\32xl\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.\32xl\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.\32xl\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.\32xl\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.\32xl\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.\32xl\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.\32xl\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.\32xl\:scale-x-0{--tw-scale-x:0}.\32xl\:scale-x-50{--tw-scale-x:.5}.\32xl\:scale-x-75{--tw-scale-x:.75}.\32xl\:scale-x-90{--tw-scale-x:.9}.\32xl\:scale-x-95{--tw-scale-x:.95}.\32xl\:scale-x-100{--tw-scale-x:1}.\32xl\:scale-x-105{--tw-scale-x:1.05}.\32xl\:scale-x-110{--tw-scale-x:1.1}.\32xl\:scale-x-125{--tw-scale-x:1.25}.\32xl\:scale-x-150{--tw-scale-x:1.5}.\32xl\:scale-y-0{--tw-scale-y:0}.\32xl\:scale-y-50{--tw-scale-y:.5}.\32xl\:scale-y-75{--tw-scale-y:.75}.\32xl\:scale-y-90{--tw-scale-y:.9}.\32xl\:scale-y-95{--tw-scale-y:.95}.\32xl\:scale-y-100{--tw-scale-y:1}.\32xl\:scale-y-105{--tw-scale-y:1.05}.\32xl\:scale-y-110{--tw-scale-y:1.1}.\32xl\:scale-y-125{--tw-scale-y:1.25}.\32xl\:scale-y-150{--tw-scale-y:1.5}.\32xl\:hover\:scale-x-0:hover{--tw-scale-x:0}.\32xl\:hover\:scale-x-50:hover{--tw-scale-x:.5}.\32xl\:hover\:scale-x-75:hover{--tw-scale-x:.75}.\32xl\:hover\:scale-x-90:hover{--tw-scale-x:.9}.\32xl\:hover\:scale-x-95:hover{--tw-scale-x:.95}.\32xl\:hover\:scale-x-100:hover{--tw-scale-x:1}.\32xl\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.\32xl\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.\32xl\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.\32xl\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.\32xl\:hover\:scale-y-0:hover{--tw-scale-y:0}.\32xl\:hover\:scale-y-50:hover{--tw-scale-y:.5}.\32xl\:hover\:scale-y-75:hover{--tw-scale-y:.75}.\32xl\:hover\:scale-y-90:hover{--tw-scale-y:.9}.\32xl\:hover\:scale-y-95:hover{--tw-scale-y:.95}.\32xl\:hover\:scale-y-100:hover{--tw-scale-y:1}.\32xl\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.\32xl\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.\32xl\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.\32xl\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.\32xl\:focus\:scale-x-0:focus{--tw-scale-x:0}.\32xl\:focus\:scale-x-50:focus{--tw-scale-x:.5}.\32xl\:focus\:scale-x-75:focus{--tw-scale-x:.75}.\32xl\:focus\:scale-x-90:focus{--tw-scale-x:.9}.\32xl\:focus\:scale-x-95:focus{--tw-scale-x:.95}.\32xl\:focus\:scale-x-100:focus{--tw-scale-x:1}.\32xl\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.\32xl\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.\32xl\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.\32xl\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.\32xl\:focus\:scale-y-0:focus{--tw-scale-y:0}.\32xl\:focus\:scale-y-50:focus{--tw-scale-y:.5}.\32xl\:focus\:scale-y-75:focus{--tw-scale-y:.75}.\32xl\:focus\:scale-y-90:focus{--tw-scale-y:.9}.\32xl\:focus\:scale-y-95:focus{--tw-scale-y:.95}.\32xl\:focus\:scale-y-100:focus{--tw-scale-y:1}.\32xl\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.\32xl\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.\32xl\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.\32xl\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.\32xl\:animate-none{-webkit-animation:none;animation:none}.\32xl\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.\32xl\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.\32xl\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.\32xl\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.\32xl\:cursor-auto{cursor:auto}.\32xl\:cursor-default{cursor:default}.\32xl\:cursor-pointer{cursor:pointer}.\32xl\:cursor-wait{cursor:wait}.\32xl\:cursor-text{cursor:text}.\32xl\:cursor-move{cursor:move}.\32xl\:cursor-help{cursor:help}.\32xl\:cursor-not-allowed{cursor:not-allowed}.\32xl\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.\32xl\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.\32xl\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.\32xl\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.\32xl\:resize-none{resize:none}.\32xl\:resize-y{resize:vertical}.\32xl\:resize-x{resize:horizontal}.\32xl\:resize{resize:both}.\32xl\:list-inside{list-style-position:inside}.\32xl\:list-outside{list-style-position:outside}.\32xl\:list-none{list-style-type:none}.\32xl\:list-disc{list-style-type:disc}.\32xl\:list-decimal{list-style-type:decimal}.\32xl\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\32xl\:auto-cols-auto{grid-auto-columns:auto}.\32xl\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.\32xl\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.\32xl\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.\32xl\:grid-flow-row{grid-auto-flow:row}.\32xl\:grid-flow-col{grid-auto-flow:column}.\32xl\:grid-flow-row-dense{grid-auto-flow:row dense}.\32xl\:grid-flow-col-dense{grid-auto-flow:column dense}.\32xl\:auto-rows-auto{grid-auto-rows:auto}.\32xl\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.\32xl\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.\32xl\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.\32xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\32xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\32xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\32xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.\32xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.\32xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.\32xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.\32xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.\32xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.\32xl\:grid-cols-none{grid-template-columns:none}.\32xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.\32xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.\32xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.\32xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.\32xl\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.\32xl\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.\32xl\:grid-rows-none{grid-template-rows:none}.\32xl\:flex-row{flex-direction:row}.\32xl\:flex-row-reverse{flex-direction:row-reverse}.\32xl\:flex-col{flex-direction:column}.\32xl\:flex-col-reverse{flex-direction:column-reverse}.\32xl\:flex-wrap{flex-wrap:wrap}.\32xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}.\32xl\:flex-nowrap{flex-wrap:nowrap}.\32xl\:place-content-center{place-content:center}.\32xl\:place-content-start{place-content:start}.\32xl\:place-content-end{place-content:end}.\32xl\:place-content-between{place-content:space-between}.\32xl\:place-content-around{place-content:space-around}.\32xl\:place-content-evenly{place-content:space-evenly}.\32xl\:place-content-stretch{place-content:stretch}.\32xl\:place-items-start{place-items:start}.\32xl\:place-items-end{place-items:end}.\32xl\:place-items-center{place-items:center}.\32xl\:place-items-stretch{place-items:stretch}.\32xl\:content-center{align-content:center}.\32xl\:content-start{align-content:flex-start}.\32xl\:content-end{align-content:flex-end}.\32xl\:content-between{align-content:space-between}.\32xl\:content-around{align-content:space-around}.\32xl\:content-evenly{align-content:space-evenly}.\32xl\:items-start{align-items:flex-start}.\32xl\:items-end{align-items:flex-end}.\32xl\:items-center{align-items:center}.\32xl\:items-baseline{align-items:baseline}.\32xl\:items-stretch{align-items:stretch}.\32xl\:justify-start{justify-content:flex-start}.\32xl\:justify-end{justify-content:flex-end}.\32xl\:justify-center{justify-content:center}.\32xl\:justify-between{justify-content:space-between}.\32xl\:justify-around{justify-content:space-around}.\32xl\:justify-evenly{justify-content:space-evenly}.\32xl\:justify-items-start{justify-items:start}.\32xl\:justify-items-end{justify-items:end}.\32xl\:justify-items-center{justify-items:center}.\32xl\:justify-items-stretch{justify-items:stretch}.\32xl\:gap-0{gap:0}.\32xl\:gap-1{gap:.25rem}.\32xl\:gap-2{gap:.5rem}.\32xl\:gap-3{gap:.75rem}.\32xl\:gap-4{gap:1rem}.\32xl\:gap-5{gap:1.25rem}.\32xl\:gap-6{gap:1.5rem}.\32xl\:gap-7{gap:1.75rem}.\32xl\:gap-8{gap:2rem}.\32xl\:gap-9{gap:2.25rem}.\32xl\:gap-10{gap:2.5rem}.\32xl\:gap-11{gap:2.75rem}.\32xl\:gap-12{gap:3rem}.\32xl\:gap-14{gap:3.5rem}.\32xl\:gap-16{gap:4rem}.\32xl\:gap-20{gap:5rem}.\32xl\:gap-24{gap:6rem}.\32xl\:gap-28{gap:7rem}.\32xl\:gap-32{gap:8rem}.\32xl\:gap-36{gap:9rem}.\32xl\:gap-40{gap:10rem}.\32xl\:gap-44{gap:11rem}.\32xl\:gap-48{gap:12rem}.\32xl\:gap-52{gap:13rem}.\32xl\:gap-56{gap:14rem}.\32xl\:gap-60{gap:15rem}.\32xl\:gap-64{gap:16rem}.\32xl\:gap-72{gap:18rem}.\32xl\:gap-80{gap:20rem}.\32xl\:gap-96{gap:24rem}.\32xl\:gap-px{gap:1px}.\32xl\:gap-0\.5{gap:.125rem}.\32xl\:gap-1\.5{gap:.375rem}.\32xl\:gap-2\.5{gap:.625rem}.\32xl\:gap-3\.5{gap:.875rem}.\32xl\:gap-x-0{-moz-column-gap:0;column-gap:0}.\32xl\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.\32xl\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.\32xl\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.\32xl\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.\32xl\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.\32xl\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.\32xl\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.\32xl\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.\32xl\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.\32xl\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.\32xl\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.\32xl\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.\32xl\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.\32xl\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.\32xl\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.\32xl\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.\32xl\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.\32xl\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.\32xl\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.\32xl\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.\32xl\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.\32xl\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.\32xl\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.\32xl\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.\32xl\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.\32xl\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.\32xl\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.\32xl\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.\32xl\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.\32xl\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.\32xl\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.\32xl\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.\32xl\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.\32xl\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.\32xl\:gap-y-0{row-gap:0}.\32xl\:gap-y-1{row-gap:.25rem}.\32xl\:gap-y-2{row-gap:.5rem}.\32xl\:gap-y-3{row-gap:.75rem}.\32xl\:gap-y-4{row-gap:1rem}.\32xl\:gap-y-5{row-gap:1.25rem}.\32xl\:gap-y-6{row-gap:1.5rem}.\32xl\:gap-y-7{row-gap:1.75rem}.\32xl\:gap-y-8{row-gap:2rem}.\32xl\:gap-y-9{row-gap:2.25rem}.\32xl\:gap-y-10{row-gap:2.5rem}.\32xl\:gap-y-11{row-gap:2.75rem}.\32xl\:gap-y-12{row-gap:3rem}.\32xl\:gap-y-14{row-gap:3.5rem}.\32xl\:gap-y-16{row-gap:4rem}.\32xl\:gap-y-20{row-gap:5rem}.\32xl\:gap-y-24{row-gap:6rem}.\32xl\:gap-y-28{row-gap:7rem}.\32xl\:gap-y-32{row-gap:8rem}.\32xl\:gap-y-36{row-gap:9rem}.\32xl\:gap-y-40{row-gap:10rem}.\32xl\:gap-y-44{row-gap:11rem}.\32xl\:gap-y-48{row-gap:12rem}.\32xl\:gap-y-52{row-gap:13rem}.\32xl\:gap-y-56{row-gap:14rem}.\32xl\:gap-y-60{row-gap:15rem}.\32xl\:gap-y-64{row-gap:16rem}.\32xl\:gap-y-72{row-gap:18rem}.\32xl\:gap-y-80{row-gap:20rem}.\32xl\:gap-y-96{row-gap:24rem}.\32xl\:gap-y-px{row-gap:1px}.\32xl\:gap-y-0\.5{row-gap:.125rem}.\32xl\:gap-y-1\.5{row-gap:.375rem}.\32xl\:gap-y-2\.5{row-gap:.625rem}.\32xl\:gap-y-3\.5{row-gap:.875rem}.\32xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.\32xl\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.\32xl\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.\32xl\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.\32xl\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.\32xl\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.\32xl\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.\32xl\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.\32xl\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.\32xl\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.\32xl\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.\32xl\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.\32xl\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.\32xl\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.\32xl\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.\32xl\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.\32xl\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.\32xl\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.\32xl\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.\32xl\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.\32xl\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.\32xl\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.\32xl\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.\32xl\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.\32xl\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.\32xl\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.\32xl\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.\32xl\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.\32xl\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.\32xl\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.\32xl\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.\32xl\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.\32xl\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.\32xl\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.\32xl\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.\32xl\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.\32xl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.\32xl\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.\32xl\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.\32xl\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.\32xl\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.\32xl\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.\32xl\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.\32xl\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.\32xl\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.\32xl\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.\32xl\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.\32xl\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.\32xl\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.\32xl\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.\32xl\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.\32xl\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.\32xl\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.\32xl\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.\32xl\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.\32xl\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.\32xl\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.\32xl\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.\32xl\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.\32xl\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.\32xl\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.\32xl\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.\32xl\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.\32xl\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.\32xl\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.\32xl\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.\32xl\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.\32xl\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.\32xl\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.\32xl\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.\32xl\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.\32xl\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.\32xl\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.\32xl\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.\32xl\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.\32xl\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.\32xl\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.\32xl\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.\32xl\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.\32xl\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.\32xl\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.\32xl\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.\32xl\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.\32xl\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.\32xl\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.\32xl\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.\32xl\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.\32xl\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.\32xl\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.\32xl\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.\32xl\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.\32xl\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.\32xl\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.\32xl\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.\32xl\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.\32xl\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.\32xl\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.\32xl\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.\32xl\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.\32xl\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.\32xl\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.\32xl\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.\32xl\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.\32xl\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.\32xl\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.\32xl\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.\32xl\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.\32xl\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.\32xl\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.\32xl\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.\32xl\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.\32xl\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.\32xl\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.\32xl\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.\32xl\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.\32xl\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.\32xl\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.\32xl\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.\32xl\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.\32xl\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.\32xl\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.\32xl\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.\32xl\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.\32xl\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.\32xl\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.\32xl\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.\32xl\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.\32xl\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.\32xl\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.\32xl\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.\32xl\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.\32xl\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.\32xl\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.\32xl\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.\32xl\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.\32xl\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.\32xl\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.\32xl\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.\32xl\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.\32xl\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.\32xl\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.\32xl\:place-self-auto{place-self:auto}.\32xl\:place-self-start{place-self:start}.\32xl\:place-self-end{place-self:end}.\32xl\:place-self-center{place-self:center}.\32xl\:place-self-stretch{place-self:stretch}.\32xl\:self-auto{align-self:auto}.\32xl\:self-start{align-self:flex-start}.\32xl\:self-end{align-self:flex-end}.\32xl\:self-center{align-self:center}.\32xl\:self-stretch{align-self:stretch}.\32xl\:self-baseline{align-self:baseline}.\32xl\:justify-self-auto{justify-self:auto}.\32xl\:justify-self-start{justify-self:start}.\32xl\:justify-self-end{justify-self:end}.\32xl\:justify-self-center{justify-self:center}.\32xl\:justify-self-stretch{justify-self:stretch}.\32xl\:overflow-auto{overflow:auto}.\32xl\:overflow-hidden{overflow:hidden}.\32xl\:overflow-visible{overflow:visible}.\32xl\:overflow-scroll{overflow:scroll}.\32xl\:overflow-x-auto{overflow-x:auto}.\32xl\:overflow-y-auto{overflow-y:auto}.\32xl\:overflow-x-hidden{overflow-x:hidden}.\32xl\:overflow-y-hidden{overflow-y:hidden}.\32xl\:overflow-x-visible{overflow-x:visible}.\32xl\:overflow-y-visible{overflow-y:visible}.\32xl\:overflow-x-scroll{overflow-x:scroll}.\32xl\:overflow-y-scroll{overflow-y:scroll}.\32xl\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.\32xl\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.\32xl\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.\32xl\:overscroll-y-auto{overscroll-behavior-y:auto}.\32xl\:overscroll-y-contain{overscroll-behavior-y:contain}.\32xl\:overscroll-y-none{overscroll-behavior-y:none}.\32xl\:overscroll-x-auto{overscroll-behavior-x:auto}.\32xl\:overscroll-x-contain{overscroll-behavior-x:contain}.\32xl\:overscroll-x-none{overscroll-behavior-x:none}.\32xl\:truncate{overflow:hidden;white-space:nowrap}.\32xl\:overflow-ellipsis,.\32xl\:truncate{text-overflow:ellipsis}.\32xl\:overflow-clip{text-overflow:clip}.\32xl\:whitespace-normal{white-space:normal}.\32xl\:whitespace-nowrap{white-space:nowrap}.\32xl\:whitespace-pre{white-space:pre}.\32xl\:whitespace-pre-line{white-space:pre-line}.\32xl\:whitespace-pre-wrap{white-space:pre-wrap}.\32xl\:break-normal{overflow-wrap:normal;word-break:normal}.\32xl\:break-words{overflow-wrap:break-word}.\32xl\:break-all{word-break:break-all}.\32xl\:rounded-none{border-radius:0}.\32xl\:rounded-sm{border-radius:.125rem}.\32xl\:rounded{border-radius:.25rem}.\32xl\:rounded-md{border-radius:.375rem}.\32xl\:rounded-lg{border-radius:.5rem}.\32xl\:rounded-xl{border-radius:.75rem}.\32xl\:rounded-2xl{border-radius:1rem}.\32xl\:rounded-3xl{border-radius:1.5rem}.\32xl\:rounded-full{border-radius:9999px}.\32xl\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.\32xl\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.\32xl\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.\32xl\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.\32xl\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.\32xl\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.\32xl\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.\32xl\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.\32xl\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.\32xl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.\32xl\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.\32xl\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.\32xl\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.\32xl\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.\32xl\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.\32xl\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.\32xl\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.\32xl\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.\32xl\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.\32xl\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.\32xl\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.\32xl\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.\32xl\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.\32xl\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.\32xl\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.\32xl\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.\32xl\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.\32xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.\32xl\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.\32xl\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.\32xl\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.\32xl\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.\32xl\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.\32xl\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.\32xl\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.\32xl\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.\32xl\:rounded-tl-none{border-top-left-radius:0}.\32xl\:rounded-tl-sm{border-top-left-radius:.125rem}.\32xl\:rounded-tl{border-top-left-radius:.25rem}.\32xl\:rounded-tl-md{border-top-left-radius:.375rem}.\32xl\:rounded-tl-lg{border-top-left-radius:.5rem}.\32xl\:rounded-tl-xl{border-top-left-radius:.75rem}.\32xl\:rounded-tl-2xl{border-top-left-radius:1rem}.\32xl\:rounded-tl-3xl{border-top-left-radius:1.5rem}.\32xl\:rounded-tl-full{border-top-left-radius:9999px}.\32xl\:rounded-tr-none{border-top-right-radius:0}.\32xl\:rounded-tr-sm{border-top-right-radius:.125rem}.\32xl\:rounded-tr{border-top-right-radius:.25rem}.\32xl\:rounded-tr-md{border-top-right-radius:.375rem}.\32xl\:rounded-tr-lg{border-top-right-radius:.5rem}.\32xl\:rounded-tr-xl{border-top-right-radius:.75rem}.\32xl\:rounded-tr-2xl{border-top-right-radius:1rem}.\32xl\:rounded-tr-3xl{border-top-right-radius:1.5rem}.\32xl\:rounded-tr-full{border-top-right-radius:9999px}.\32xl\:rounded-br-none{border-bottom-right-radius:0}.\32xl\:rounded-br-sm{border-bottom-right-radius:.125rem}.\32xl\:rounded-br{border-bottom-right-radius:.25rem}.\32xl\:rounded-br-md{border-bottom-right-radius:.375rem}.\32xl\:rounded-br-lg{border-bottom-right-radius:.5rem}.\32xl\:rounded-br-xl{border-bottom-right-radius:.75rem}.\32xl\:rounded-br-2xl{border-bottom-right-radius:1rem}.\32xl\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.\32xl\:rounded-br-full{border-bottom-right-radius:9999px}.\32xl\:rounded-bl-none{border-bottom-left-radius:0}.\32xl\:rounded-bl-sm{border-bottom-left-radius:.125rem}.\32xl\:rounded-bl{border-bottom-left-radius:.25rem}.\32xl\:rounded-bl-md{border-bottom-left-radius:.375rem}.\32xl\:rounded-bl-lg{border-bottom-left-radius:.5rem}.\32xl\:rounded-bl-xl{border-bottom-left-radius:.75rem}.\32xl\:rounded-bl-2xl{border-bottom-left-radius:1rem}.\32xl\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.\32xl\:rounded-bl-full{border-bottom-left-radius:9999px}.\32xl\:border-0{border-width:0}.\32xl\:border-2{border-width:2px}.\32xl\:border-4{border-width:4px}.\32xl\:border-8{border-width:8px}.\32xl\:border{border-width:1px}.\32xl\:border-t-0{border-top-width:0}.\32xl\:border-t-2{border-top-width:2px}.\32xl\:border-t-4{border-top-width:4px}.\32xl\:border-t-8{border-top-width:8px}.\32xl\:border-t{border-top-width:1px}.\32xl\:border-r-0{border-right-width:0}.\32xl\:border-r-2{border-right-width:2px}.\32xl\:border-r-4{border-right-width:4px}.\32xl\:border-r-8{border-right-width:8px}.\32xl\:border-r{border-right-width:1px}.\32xl\:border-b-0{border-bottom-width:0}.\32xl\:border-b-2{border-bottom-width:2px}.\32xl\:border-b-4{border-bottom-width:4px}.\32xl\:border-b-8{border-bottom-width:8px}.\32xl\:border-b{border-bottom-width:1px}.\32xl\:border-l-0{border-left-width:0}.\32xl\:border-l-2{border-left-width:2px}.\32xl\:border-l-4{border-left-width:4px}.\32xl\:border-l-8{border-left-width:8px}.\32xl\:border-l{border-left-width:1px}.\32xl\:border-solid{border-style:solid}.\32xl\:border-dashed{border-style:dashed}.\32xl\:border-dotted{border-style:dotted}.\32xl\:border-double{border-style:double}.\32xl\:border-none{border-style:none}.\32xl\:border-transparent{border-color:transparent}.\32xl\:border-current{border-color:currentColor}.\32xl\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-transparent{border-color:transparent}.group:hover .\32xl\:group-hover\:border-current{border-color:currentColor}.group:hover .\32xl\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:focus-within\:border-transparent:focus-within{border-color:transparent}.\32xl\:focus-within\:border-current:focus-within{border-color:currentColor}.\32xl\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:hover\:border-transparent:hover{border-color:transparent}.\32xl\:hover\:border-current:hover{border-color:currentColor}.\32xl\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:focus\:border-transparent:focus{border-color:transparent}.\32xl\:focus\:border-current:focus{border-color:currentColor}.\32xl\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:border-opacity-0{--tw-border-opacity:0}.\32xl\:border-opacity-5{--tw-border-opacity:0.05}.\32xl\:border-opacity-10{--tw-border-opacity:0.1}.\32xl\:border-opacity-20{--tw-border-opacity:0.2}.\32xl\:border-opacity-25{--tw-border-opacity:0.25}.\32xl\:border-opacity-30{--tw-border-opacity:0.3}.\32xl\:border-opacity-40{--tw-border-opacity:0.4}.\32xl\:border-opacity-50{--tw-border-opacity:0.5}.\32xl\:border-opacity-60{--tw-border-opacity:0.6}.\32xl\:border-opacity-70{--tw-border-opacity:0.7}.\32xl\:border-opacity-75{--tw-border-opacity:0.75}.\32xl\:border-opacity-80{--tw-border-opacity:0.8}.\32xl\:border-opacity-90{--tw-border-opacity:0.9}.\32xl\:border-opacity-95{--tw-border-opacity:0.95}.\32xl\:border-opacity-100{--tw-border-opacity:1}.group:hover .\32xl\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .\32xl\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .\32xl\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .\32xl\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .\32xl\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .\32xl\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .\32xl\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .\32xl\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .\32xl\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .\32xl\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .\32xl\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .\32xl\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .\32xl\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .\32xl\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .\32xl\:group-hover\:border-opacity-100{--tw-border-opacity:1}.\32xl\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.\32xl\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.\32xl\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.\32xl\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.\32xl\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.\32xl\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.\32xl\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.\32xl\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.\32xl\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.\32xl\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.\32xl\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.\32xl\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.\32xl\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.\32xl\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.\32xl\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.\32xl\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.\32xl\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.\32xl\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.\32xl\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.\32xl\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.\32xl\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.\32xl\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.\32xl\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.\32xl\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.\32xl\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.\32xl\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.\32xl\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.\32xl\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.\32xl\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.\32xl\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.\32xl\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.\32xl\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.\32xl\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.\32xl\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.\32xl\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.\32xl\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.\32xl\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.\32xl\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.\32xl\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.\32xl\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.\32xl\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.\32xl\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.\32xl\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.\32xl\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.\32xl\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.\32xl\:bg-transparent{background-color:initial}.\32xl\:bg-current{background-color:currentColor}.\32xl\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-transparent{background-color:initial}.group:hover .\32xl\:group-hover\:bg-current{background-color:currentColor}.group:hover .\32xl\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-transparent:focus-within{background-color:initial}.\32xl\:focus-within\:bg-current:focus-within{background-color:currentColor}.\32xl\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:hover\:bg-transparent:hover{background-color:initial}.\32xl\:hover\:bg-current:hover{background-color:currentColor}.\32xl\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:focus\:bg-transparent:focus{background-color:initial}.\32xl\:focus\:bg-current:focus{background-color:currentColor}.\32xl\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:bg-opacity-0{--tw-bg-opacity:0}.\32xl\:bg-opacity-5{--tw-bg-opacity:0.05}.\32xl\:bg-opacity-10{--tw-bg-opacity:0.1}.\32xl\:bg-opacity-20{--tw-bg-opacity:0.2}.\32xl\:bg-opacity-25{--tw-bg-opacity:0.25}.\32xl\:bg-opacity-30{--tw-bg-opacity:0.3}.\32xl\:bg-opacity-40{--tw-bg-opacity:0.4}.\32xl\:bg-opacity-50{--tw-bg-opacity:0.5}.\32xl\:bg-opacity-60{--tw-bg-opacity:0.6}.\32xl\:bg-opacity-70{--tw-bg-opacity:0.7}.\32xl\:bg-opacity-75{--tw-bg-opacity:0.75}.\32xl\:bg-opacity-80{--tw-bg-opacity:0.8}.\32xl\:bg-opacity-90{--tw-bg-opacity:0.9}.\32xl\:bg-opacity-95{--tw-bg-opacity:0.95}.\32xl\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .\32xl\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .\32xl\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .\32xl\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .\32xl\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .\32xl\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .\32xl\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .\32xl\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .\32xl\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .\32xl\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .\32xl\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .\32xl\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .\32xl\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .\32xl\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .\32xl\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .\32xl\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.\32xl\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.\32xl\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.\32xl\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.\32xl\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.\32xl\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.\32xl\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.\32xl\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.\32xl\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.\32xl\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.\32xl\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.\32xl\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.\32xl\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.\32xl\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.\32xl\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.\32xl\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.\32xl\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.\32xl\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.\32xl\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.\32xl\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.\32xl\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.\32xl\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.\32xl\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.\32xl\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.\32xl\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.\32xl\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.\32xl\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.\32xl\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.\32xl\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.\32xl\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.\32xl\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.\32xl\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.\32xl\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.\32xl\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.\32xl\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.\32xl\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.\32xl\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.\32xl\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.\32xl\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.\32xl\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.\32xl\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.\32xl\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.\32xl\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.\32xl\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.\32xl\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.\32xl\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.\32xl\:bg-none{background-image:none}.\32xl\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.\32xl\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.\32xl\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.\32xl\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.\32xl\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.\32xl\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.\32xl\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.\32xl\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:to-transparent{--tw-gradient-to:transparent}.\32xl\:to-current{--tw-gradient-to:currentColor}.\32xl\:to-black{--tw-gradient-to:#000}.\32xl\:to-white{--tw-gradient-to:#fff}.\32xl\:to-gray-50{--tw-gradient-to:#f9fafb}.\32xl\:to-gray-100{--tw-gradient-to:#f3f4f6}.\32xl\:to-gray-200{--tw-gradient-to:#e5e7eb}.\32xl\:to-gray-300{--tw-gradient-to:#d1d5db}.\32xl\:to-gray-400{--tw-gradient-to:#9ca3af}.\32xl\:to-gray-500{--tw-gradient-to:#6b7280}.\32xl\:to-gray-600{--tw-gradient-to:#4b5563}.\32xl\:to-gray-700{--tw-gradient-to:#374151}.\32xl\:to-gray-800{--tw-gradient-to:#1f2937}.\32xl\:to-gray-900{--tw-gradient-to:#111827}.\32xl\:to-red-50{--tw-gradient-to:#fef2f2}.\32xl\:to-red-100{--tw-gradient-to:#fee2e2}.\32xl\:to-red-200{--tw-gradient-to:#fecaca}.\32xl\:to-red-300{--tw-gradient-to:#fca5a5}.\32xl\:to-red-400{--tw-gradient-to:#f87171}.\32xl\:to-red-500{--tw-gradient-to:#ef4444}.\32xl\:to-red-600{--tw-gradient-to:#dc2626}.\32xl\:to-red-700{--tw-gradient-to:#b91c1c}.\32xl\:to-red-800{--tw-gradient-to:#991b1b}.\32xl\:to-red-900{--tw-gradient-to:#7f1d1d}.\32xl\:to-yellow-50{--tw-gradient-to:#fffbeb}.\32xl\:to-yellow-100{--tw-gradient-to:#fef3c7}.\32xl\:to-yellow-200{--tw-gradient-to:#fde68a}.\32xl\:to-yellow-300{--tw-gradient-to:#fcd34d}.\32xl\:to-yellow-400{--tw-gradient-to:#fbbf24}.\32xl\:to-yellow-500{--tw-gradient-to:#f59e0b}.\32xl\:to-yellow-600{--tw-gradient-to:#d97706}.\32xl\:to-yellow-700{--tw-gradient-to:#b45309}.\32xl\:to-yellow-800{--tw-gradient-to:#92400e}.\32xl\:to-yellow-900{--tw-gradient-to:#78350f}.\32xl\:to-green-50{--tw-gradient-to:#ecfdf5}.\32xl\:to-green-100{--tw-gradient-to:#d1fae5}.\32xl\:to-green-200{--tw-gradient-to:#a7f3d0}.\32xl\:to-green-300{--tw-gradient-to:#6ee7b7}.\32xl\:to-green-400{--tw-gradient-to:#34d399}.\32xl\:to-green-500{--tw-gradient-to:#10b981}.\32xl\:to-green-600{--tw-gradient-to:#059669}.\32xl\:to-green-700{--tw-gradient-to:#047857}.\32xl\:to-green-800{--tw-gradient-to:#065f46}.\32xl\:to-green-900{--tw-gradient-to:#064e3b}.\32xl\:to-blue-50{--tw-gradient-to:#eff6ff}.\32xl\:to-blue-100{--tw-gradient-to:#dbeafe}.\32xl\:to-blue-200{--tw-gradient-to:#bfdbfe}.\32xl\:to-blue-300{--tw-gradient-to:#93c5fd}.\32xl\:to-blue-400{--tw-gradient-to:#60a5fa}.\32xl\:to-blue-500{--tw-gradient-to:#3b82f6}.\32xl\:to-blue-600{--tw-gradient-to:#2563eb}.\32xl\:to-blue-700{--tw-gradient-to:#1d4ed8}.\32xl\:to-blue-800{--tw-gradient-to:#1e40af}.\32xl\:to-blue-900{--tw-gradient-to:#1e3a8a}.\32xl\:to-indigo-50{--tw-gradient-to:#eef2ff}.\32xl\:to-indigo-100{--tw-gradient-to:#e0e7ff}.\32xl\:to-indigo-200{--tw-gradient-to:#c7d2fe}.\32xl\:to-indigo-300{--tw-gradient-to:#a5b4fc}.\32xl\:to-indigo-400{--tw-gradient-to:#818cf8}.\32xl\:to-indigo-500{--tw-gradient-to:#6366f1}.\32xl\:to-indigo-600{--tw-gradient-to:#4f46e5}.\32xl\:to-indigo-700{--tw-gradient-to:#4338ca}.\32xl\:to-indigo-800{--tw-gradient-to:#3730a3}.\32xl\:to-indigo-900{--tw-gradient-to:#312e81}.\32xl\:to-purple-50{--tw-gradient-to:#f5f3ff}.\32xl\:to-purple-100{--tw-gradient-to:#ede9fe}.\32xl\:to-purple-200{--tw-gradient-to:#ddd6fe}.\32xl\:to-purple-300{--tw-gradient-to:#c4b5fd}.\32xl\:to-purple-400{--tw-gradient-to:#a78bfa}.\32xl\:to-purple-500{--tw-gradient-to:#8b5cf6}.\32xl\:to-purple-600{--tw-gradient-to:#7c3aed}.\32xl\:to-purple-700{--tw-gradient-to:#6d28d9}.\32xl\:to-purple-800{--tw-gradient-to:#5b21b6}.\32xl\:to-purple-900{--tw-gradient-to:#4c1d95}.\32xl\:to-pink-50{--tw-gradient-to:#fdf2f8}.\32xl\:to-pink-100{--tw-gradient-to:#fce7f3}.\32xl\:to-pink-200{--tw-gradient-to:#fbcfe8}.\32xl\:to-pink-300{--tw-gradient-to:#f9a8d4}.\32xl\:to-pink-400{--tw-gradient-to:#f472b6}.\32xl\:to-pink-500{--tw-gradient-to:#ec4899}.\32xl\:to-pink-600{--tw-gradient-to:#db2777}.\32xl\:to-pink-700{--tw-gradient-to:#be185d}.\32xl\:to-pink-800{--tw-gradient-to:#9d174d}.\32xl\:to-pink-900{--tw-gradient-to:#831843}.\32xl\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.\32xl\:hover\:to-current:hover{--tw-gradient-to:currentColor}.\32xl\:hover\:to-black:hover{--tw-gradient-to:#000}.\32xl\:hover\:to-white:hover{--tw-gradient-to:#fff}.\32xl\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.\32xl\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.\32xl\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.\32xl\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.\32xl\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.\32xl\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.\32xl\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.\32xl\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.\32xl\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.\32xl\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.\32xl\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.\32xl\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.\32xl\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.\32xl\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.\32xl\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.\32xl\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.\32xl\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.\32xl\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.\32xl\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.\32xl\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.\32xl\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.\32xl\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.\32xl\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.\32xl\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.\32xl\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.\32xl\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.\32xl\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.\32xl\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.\32xl\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.\32xl\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.\32xl\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.\32xl\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.\32xl\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.\32xl\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.\32xl\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.\32xl\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.\32xl\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.\32xl\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.\32xl\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.\32xl\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.\32xl\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.\32xl\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.\32xl\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.\32xl\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.\32xl\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.\32xl\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.\32xl\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.\32xl\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.\32xl\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.\32xl\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.\32xl\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.\32xl\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.\32xl\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.\32xl\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.\32xl\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.\32xl\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.\32xl\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.\32xl\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.\32xl\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.\32xl\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.\32xl\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.\32xl\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.\32xl\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.\32xl\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.\32xl\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.\32xl\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.\32xl\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.\32xl\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.\32xl\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.\32xl\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.\32xl\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.\32xl\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.\32xl\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.\32xl\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.\32xl\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.\32xl\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.\32xl\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.\32xl\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.\32xl\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.\32xl\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.\32xl\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.\32xl\:focus\:to-current:focus{--tw-gradient-to:currentColor}.\32xl\:focus\:to-black:focus{--tw-gradient-to:#000}.\32xl\:focus\:to-white:focus{--tw-gradient-to:#fff}.\32xl\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.\32xl\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.\32xl\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.\32xl\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.\32xl\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.\32xl\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.\32xl\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.\32xl\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.\32xl\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.\32xl\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.\32xl\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.\32xl\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.\32xl\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.\32xl\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.\32xl\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.\32xl\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.\32xl\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.\32xl\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.\32xl\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.\32xl\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.\32xl\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.\32xl\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.\32xl\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.\32xl\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.\32xl\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.\32xl\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.\32xl\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.\32xl\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.\32xl\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.\32xl\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.\32xl\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.\32xl\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.\32xl\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.\32xl\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.\32xl\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.\32xl\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.\32xl\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.\32xl\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.\32xl\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.\32xl\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.\32xl\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.\32xl\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.\32xl\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.\32xl\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.\32xl\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.\32xl\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.\32xl\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.\32xl\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.\32xl\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.\32xl\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.\32xl\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.\32xl\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.\32xl\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.\32xl\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.\32xl\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.\32xl\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.\32xl\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.\32xl\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.\32xl\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.\32xl\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.\32xl\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.\32xl\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.\32xl\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.\32xl\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.\32xl\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.\32xl\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.\32xl\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.\32xl\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.\32xl\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.\32xl\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.\32xl\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.\32xl\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.\32xl\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.\32xl\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.\32xl\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.\32xl\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.\32xl\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.\32xl\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.\32xl\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.\32xl\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.\32xl\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.\32xl\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.\32xl\:bg-auto{background-size:auto}.\32xl\:bg-cover{background-size:cover}.\32xl\:bg-contain{background-size:contain}.\32xl\:bg-fixed{background-attachment:fixed}.\32xl\:bg-local{background-attachment:local}.\32xl\:bg-scroll{background-attachment:scroll}.\32xl\:bg-clip-border{background-clip:initial}.\32xl\:bg-clip-padding{background-clip:padding-box}.\32xl\:bg-clip-content{background-clip:content-box}.\32xl\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.\32xl\:bg-bottom{background-position:bottom}.\32xl\:bg-center{background-position:50%}.\32xl\:bg-left{background-position:0}.\32xl\:bg-left-bottom{background-position:0 100%}.\32xl\:bg-left-top{background-position:0 0}.\32xl\:bg-right{background-position:100%}.\32xl\:bg-right-bottom{background-position:100% 100%}.\32xl\:bg-right-top{background-position:100% 0}.\32xl\:bg-top{background-position:top}.\32xl\:bg-repeat{background-repeat:repeat}.\32xl\:bg-no-repeat{background-repeat:no-repeat}.\32xl\:bg-repeat-x{background-repeat:repeat-x}.\32xl\:bg-repeat-y{background-repeat:repeat-y}.\32xl\:bg-repeat-round{background-repeat:round}.\32xl\:bg-repeat-space{background-repeat:space}.\32xl\:bg-origin-border{background-origin:border-box}.\32xl\:bg-origin-padding{background-origin:initial}.\32xl\:bg-origin-content{background-origin:content-box}.\32xl\:fill-current{fill:currentColor}.\32xl\:stroke-current{stroke:currentColor}.\32xl\:stroke-0{stroke-width:0}.\32xl\:stroke-1{stroke-width:1}.\32xl\:stroke-2{stroke-width:2}.\32xl\:object-contain{-o-object-fit:contain;object-fit:contain}.\32xl\:object-cover{-o-object-fit:cover;object-fit:cover}.\32xl\:object-fill{-o-object-fit:fill;object-fit:fill}.\32xl\:object-none{-o-object-fit:none;object-fit:none}.\32xl\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.\32xl\:object-bottom{-o-object-position:bottom;object-position:bottom}.\32xl\:object-center{-o-object-position:center;object-position:center}.\32xl\:object-left{-o-object-position:left;object-position:left}.\32xl\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.\32xl\:object-left-top{-o-object-position:left top;object-position:left top}.\32xl\:object-right{-o-object-position:right;object-position:right}.\32xl\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.\32xl\:object-right-top{-o-object-position:right top;object-position:right top}.\32xl\:object-top{-o-object-position:top;object-position:top}.\32xl\:p-0{padding:0}.\32xl\:p-1{padding:.25rem}.\32xl\:p-2{padding:.5rem}.\32xl\:p-3{padding:.75rem}.\32xl\:p-4{padding:1rem}.\32xl\:p-5{padding:1.25rem}.\32xl\:p-6{padding:1.5rem}.\32xl\:p-7{padding:1.75rem}.\32xl\:p-8{padding:2rem}.\32xl\:p-9{padding:2.25rem}.\32xl\:p-10{padding:2.5rem}.\32xl\:p-11{padding:2.75rem}.\32xl\:p-12{padding:3rem}.\32xl\:p-14{padding:3.5rem}.\32xl\:p-16{padding:4rem}.\32xl\:p-20{padding:5rem}.\32xl\:p-24{padding:6rem}.\32xl\:p-28{padding:7rem}.\32xl\:p-32{padding:8rem}.\32xl\:p-36{padding:9rem}.\32xl\:p-40{padding:10rem}.\32xl\:p-44{padding:11rem}.\32xl\:p-48{padding:12rem}.\32xl\:p-52{padding:13rem}.\32xl\:p-56{padding:14rem}.\32xl\:p-60{padding:15rem}.\32xl\:p-64{padding:16rem}.\32xl\:p-72{padding:18rem}.\32xl\:p-80{padding:20rem}.\32xl\:p-96{padding:24rem}.\32xl\:p-px{padding:1px}.\32xl\:p-0\.5{padding:.125rem}.\32xl\:p-1\.5{padding:.375rem}.\32xl\:p-2\.5{padding:.625rem}.\32xl\:p-3\.5{padding:.875rem}.\32xl\:px-0{padding-left:0;padding-right:0}.\32xl\:px-1{padding-left:.25rem;padding-right:.25rem}.\32xl\:px-2{padding-left:.5rem;padding-right:.5rem}.\32xl\:px-3{padding-left:.75rem;padding-right:.75rem}.\32xl\:px-4{padding-left:1rem;padding-right:1rem}.\32xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.\32xl\:px-6{padding-left:1.5rem;padding-right:1.5rem}.\32xl\:px-7{padding-left:1.75rem;padding-right:1.75rem}.\32xl\:px-8{padding-left:2rem;padding-right:2rem}.\32xl\:px-9{padding-left:2.25rem;padding-right:2.25rem}.\32xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.\32xl\:px-11{padding-left:2.75rem;padding-right:2.75rem}.\32xl\:px-12{padding-left:3rem;padding-right:3rem}.\32xl\:px-14{padding-left:3.5rem;padding-right:3.5rem}.\32xl\:px-16{padding-left:4rem;padding-right:4rem}.\32xl\:px-20{padding-left:5rem;padding-right:5rem}.\32xl\:px-24{padding-left:6rem;padding-right:6rem}.\32xl\:px-28{padding-left:7rem;padding-right:7rem}.\32xl\:px-32{padding-left:8rem;padding-right:8rem}.\32xl\:px-36{padding-left:9rem;padding-right:9rem}.\32xl\:px-40{padding-left:10rem;padding-right:10rem}.\32xl\:px-44{padding-left:11rem;padding-right:11rem}.\32xl\:px-48{padding-left:12rem;padding-right:12rem}.\32xl\:px-52{padding-left:13rem;padding-right:13rem}.\32xl\:px-56{padding-left:14rem;padding-right:14rem}.\32xl\:px-60{padding-left:15rem;padding-right:15rem}.\32xl\:px-64{padding-left:16rem;padding-right:16rem}.\32xl\:px-72{padding-left:18rem;padding-right:18rem}.\32xl\:px-80{padding-left:20rem;padding-right:20rem}.\32xl\:px-96{padding-left:24rem;padding-right:24rem}.\32xl\:px-px{padding-left:1px;padding-right:1px}.\32xl\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.\32xl\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.\32xl\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.\32xl\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.\32xl\:py-0{padding-top:0;padding-bottom:0}.\32xl\:py-1{padding-top:.25rem;padding-bottom:.25rem}.\32xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.\32xl\:py-3{padding-top:.75rem;padding-bottom:.75rem}.\32xl\:py-4{padding-top:1rem;padding-bottom:1rem}.\32xl\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.\32xl\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.\32xl\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.\32xl\:py-8{padding-top:2rem;padding-bottom:2rem}.\32xl\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.\32xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.\32xl\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.\32xl\:py-12{padding-top:3rem;padding-bottom:3rem}.\32xl\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.\32xl\:py-16{padding-top:4rem;padding-bottom:4rem}.\32xl\:py-20{padding-top:5rem;padding-bottom:5rem}.\32xl\:py-24{padding-top:6rem;padding-bottom:6rem}.\32xl\:py-28{padding-top:7rem;padding-bottom:7rem}.\32xl\:py-32{padding-top:8rem;padding-bottom:8rem}.\32xl\:py-36{padding-top:9rem;padding-bottom:9rem}.\32xl\:py-40{padding-top:10rem;padding-bottom:10rem}.\32xl\:py-44{padding-top:11rem;padding-bottom:11rem}.\32xl\:py-48{padding-top:12rem;padding-bottom:12rem}.\32xl\:py-52{padding-top:13rem;padding-bottom:13rem}.\32xl\:py-56{padding-top:14rem;padding-bottom:14rem}.\32xl\:py-60{padding-top:15rem;padding-bottom:15rem}.\32xl\:py-64{padding-top:16rem;padding-bottom:16rem}.\32xl\:py-72{padding-top:18rem;padding-bottom:18rem}.\32xl\:py-80{padding-top:20rem;padding-bottom:20rem}.\32xl\:py-96{padding-top:24rem;padding-bottom:24rem}.\32xl\:py-px{padding-top:1px;padding-bottom:1px}.\32xl\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.\32xl\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.\32xl\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.\32xl\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.\32xl\:pt-0{padding-top:0}.\32xl\:pt-1{padding-top:.25rem}.\32xl\:pt-2{padding-top:.5rem}.\32xl\:pt-3{padding-top:.75rem}.\32xl\:pt-4{padding-top:1rem}.\32xl\:pt-5{padding-top:1.25rem}.\32xl\:pt-6{padding-top:1.5rem}.\32xl\:pt-7{padding-top:1.75rem}.\32xl\:pt-8{padding-top:2rem}.\32xl\:pt-9{padding-top:2.25rem}.\32xl\:pt-10{padding-top:2.5rem}.\32xl\:pt-11{padding-top:2.75rem}.\32xl\:pt-12{padding-top:3rem}.\32xl\:pt-14{padding-top:3.5rem}.\32xl\:pt-16{padding-top:4rem}.\32xl\:pt-20{padding-top:5rem}.\32xl\:pt-24{padding-top:6rem}.\32xl\:pt-28{padding-top:7rem}.\32xl\:pt-32{padding-top:8rem}.\32xl\:pt-36{padding-top:9rem}.\32xl\:pt-40{padding-top:10rem}.\32xl\:pt-44{padding-top:11rem}.\32xl\:pt-48{padding-top:12rem}.\32xl\:pt-52{padding-top:13rem}.\32xl\:pt-56{padding-top:14rem}.\32xl\:pt-60{padding-top:15rem}.\32xl\:pt-64{padding-top:16rem}.\32xl\:pt-72{padding-top:18rem}.\32xl\:pt-80{padding-top:20rem}.\32xl\:pt-96{padding-top:24rem}.\32xl\:pt-px{padding-top:1px}.\32xl\:pt-0\.5{padding-top:.125rem}.\32xl\:pt-1\.5{padding-top:.375rem}.\32xl\:pt-2\.5{padding-top:.625rem}.\32xl\:pt-3\.5{padding-top:.875rem}.\32xl\:pr-0{padding-right:0}.\32xl\:pr-1{padding-right:.25rem}.\32xl\:pr-2{padding-right:.5rem}.\32xl\:pr-3{padding-right:.75rem}.\32xl\:pr-4{padding-right:1rem}.\32xl\:pr-5{padding-right:1.25rem}.\32xl\:pr-6{padding-right:1.5rem}.\32xl\:pr-7{padding-right:1.75rem}.\32xl\:pr-8{padding-right:2rem}.\32xl\:pr-9{padding-right:2.25rem}.\32xl\:pr-10{padding-right:2.5rem}.\32xl\:pr-11{padding-right:2.75rem}.\32xl\:pr-12{padding-right:3rem}.\32xl\:pr-14{padding-right:3.5rem}.\32xl\:pr-16{padding-right:4rem}.\32xl\:pr-20{padding-right:5rem}.\32xl\:pr-24{padding-right:6rem}.\32xl\:pr-28{padding-right:7rem}.\32xl\:pr-32{padding-right:8rem}.\32xl\:pr-36{padding-right:9rem}.\32xl\:pr-40{padding-right:10rem}.\32xl\:pr-44{padding-right:11rem}.\32xl\:pr-48{padding-right:12rem}.\32xl\:pr-52{padding-right:13rem}.\32xl\:pr-56{padding-right:14rem}.\32xl\:pr-60{padding-right:15rem}.\32xl\:pr-64{padding-right:16rem}.\32xl\:pr-72{padding-right:18rem}.\32xl\:pr-80{padding-right:20rem}.\32xl\:pr-96{padding-right:24rem}.\32xl\:pr-px{padding-right:1px}.\32xl\:pr-0\.5{padding-right:.125rem}.\32xl\:pr-1\.5{padding-right:.375rem}.\32xl\:pr-2\.5{padding-right:.625rem}.\32xl\:pr-3\.5{padding-right:.875rem}.\32xl\:pb-0{padding-bottom:0}.\32xl\:pb-1{padding-bottom:.25rem}.\32xl\:pb-2{padding-bottom:.5rem}.\32xl\:pb-3{padding-bottom:.75rem}.\32xl\:pb-4{padding-bottom:1rem}.\32xl\:pb-5{padding-bottom:1.25rem}.\32xl\:pb-6{padding-bottom:1.5rem}.\32xl\:pb-7{padding-bottom:1.75rem}.\32xl\:pb-8{padding-bottom:2rem}.\32xl\:pb-9{padding-bottom:2.25rem}.\32xl\:pb-10{padding-bottom:2.5rem}.\32xl\:pb-11{padding-bottom:2.75rem}.\32xl\:pb-12{padding-bottom:3rem}.\32xl\:pb-14{padding-bottom:3.5rem}.\32xl\:pb-16{padding-bottom:4rem}.\32xl\:pb-20{padding-bottom:5rem}.\32xl\:pb-24{padding-bottom:6rem}.\32xl\:pb-28{padding-bottom:7rem}.\32xl\:pb-32{padding-bottom:8rem}.\32xl\:pb-36{padding-bottom:9rem}.\32xl\:pb-40{padding-bottom:10rem}.\32xl\:pb-44{padding-bottom:11rem}.\32xl\:pb-48{padding-bottom:12rem}.\32xl\:pb-52{padding-bottom:13rem}.\32xl\:pb-56{padding-bottom:14rem}.\32xl\:pb-60{padding-bottom:15rem}.\32xl\:pb-64{padding-bottom:16rem}.\32xl\:pb-72{padding-bottom:18rem}.\32xl\:pb-80{padding-bottom:20rem}.\32xl\:pb-96{padding-bottom:24rem}.\32xl\:pb-px{padding-bottom:1px}.\32xl\:pb-0\.5{padding-bottom:.125rem}.\32xl\:pb-1\.5{padding-bottom:.375rem}.\32xl\:pb-2\.5{padding-bottom:.625rem}.\32xl\:pb-3\.5{padding-bottom:.875rem}.\32xl\:pl-0{padding-left:0}.\32xl\:pl-1{padding-left:.25rem}.\32xl\:pl-2{padding-left:.5rem}.\32xl\:pl-3{padding-left:.75rem}.\32xl\:pl-4{padding-left:1rem}.\32xl\:pl-5{padding-left:1.25rem}.\32xl\:pl-6{padding-left:1.5rem}.\32xl\:pl-7{padding-left:1.75rem}.\32xl\:pl-8{padding-left:2rem}.\32xl\:pl-9{padding-left:2.25rem}.\32xl\:pl-10{padding-left:2.5rem}.\32xl\:pl-11{padding-left:2.75rem}.\32xl\:pl-12{padding-left:3rem}.\32xl\:pl-14{padding-left:3.5rem}.\32xl\:pl-16{padding-left:4rem}.\32xl\:pl-20{padding-left:5rem}.\32xl\:pl-24{padding-left:6rem}.\32xl\:pl-28{padding-left:7rem}.\32xl\:pl-32{padding-left:8rem}.\32xl\:pl-36{padding-left:9rem}.\32xl\:pl-40{padding-left:10rem}.\32xl\:pl-44{padding-left:11rem}.\32xl\:pl-48{padding-left:12rem}.\32xl\:pl-52{padding-left:13rem}.\32xl\:pl-56{padding-left:14rem}.\32xl\:pl-60{padding-left:15rem}.\32xl\:pl-64{padding-left:16rem}.\32xl\:pl-72{padding-left:18rem}.\32xl\:pl-80{padding-left:20rem}.\32xl\:pl-96{padding-left:24rem}.\32xl\:pl-px{padding-left:1px}.\32xl\:pl-0\.5{padding-left:.125rem}.\32xl\:pl-1\.5{padding-left:.375rem}.\32xl\:pl-2\.5{padding-left:.625rem}.\32xl\:pl-3\.5{padding-left:.875rem}.\32xl\:text-left{text-align:left}.\32xl\:text-center{text-align:center}.\32xl\:text-right{text-align:right}.\32xl\:text-justify{text-align:justify}.\32xl\:align-baseline{vertical-align:initial}.\32xl\:align-top{vertical-align:top}.\32xl\:align-middle{vertical-align:middle}.\32xl\:align-bottom{vertical-align:bottom}.\32xl\:align-text-top{vertical-align:text-top}.\32xl\:align-text-bottom{vertical-align:text-bottom}.\32xl\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.\32xl\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.\32xl\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.\32xl\:text-xs{font-size:.75rem;line-height:1rem}.\32xl\:text-sm{font-size:.875rem;line-height:1.25rem}.\32xl\:text-base{font-size:1rem;line-height:1.5rem}.\32xl\:text-lg{font-size:1.125rem;line-height:1.75rem}.\32xl\:text-xl{font-size:1.25rem;line-height:1.75rem}.\32xl\:text-2xl{font-size:1.5rem;line-height:2rem}.\32xl\:text-3xl{font-size:1.875rem;line-height:2.25rem}.\32xl\:text-4xl{font-size:2.25rem;line-height:2.5rem}.\32xl\:text-5xl{font-size:3rem;line-height:1}.\32xl\:text-6xl{font-size:3.75rem;line-height:1}.\32xl\:text-7xl{font-size:4.5rem;line-height:1}.\32xl\:text-8xl{font-size:6rem;line-height:1}.\32xl\:text-9xl{font-size:8rem;line-height:1}.\32xl\:font-thin{font-weight:100}.\32xl\:font-extralight{font-weight:200}.\32xl\:font-light{font-weight:300}.\32xl\:font-normal{font-weight:400}.\32xl\:font-medium{font-weight:500}.\32xl\:font-semibold{font-weight:600}.\32xl\:font-bold{font-weight:700}.\32xl\:font-extrabold{font-weight:800}.\32xl\:font-black{font-weight:900}.\32xl\:uppercase{text-transform:uppercase}.\32xl\:lowercase{text-transform:lowercase}.\32xl\:capitalize{text-transform:capitalize}.\32xl\:normal-case{text-transform:none}.\32xl\:italic{font-style:italic}.\32xl\:not-italic{font-style:normal}.\32xl\:diagonal-fractions,.\32xl\:lining-nums,.\32xl\:oldstyle-nums,.\32xl\:ordinal,.\32xl\:proportional-nums,.\32xl\:slashed-zero,.\32xl\:stacked-fractions,.\32xl\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.\32xl\:normal-nums{font-variant-numeric:normal}.\32xl\:ordinal{--tw-ordinal:ordinal}.\32xl\:slashed-zero{--tw-slashed-zero:slashed-zero}.\32xl\:lining-nums{--tw-numeric-figure:lining-nums}.\32xl\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.\32xl\:proportional-nums{--tw-numeric-spacing:proportional-nums}.\32xl\:tabular-nums{--tw-numeric-spacing:tabular-nums}.\32xl\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.\32xl\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.\32xl\:leading-3{line-height:.75rem}.\32xl\:leading-4{line-height:1rem}.\32xl\:leading-5{line-height:1.25rem}.\32xl\:leading-6{line-height:1.5rem}.\32xl\:leading-7{line-height:1.75rem}.\32xl\:leading-8{line-height:2rem}.\32xl\:leading-9{line-height:2.25rem}.\32xl\:leading-10{line-height:2.5rem}.\32xl\:leading-none{line-height:1}.\32xl\:leading-tight{line-height:1.25}.\32xl\:leading-snug{line-height:1.375}.\32xl\:leading-normal{line-height:1.5}.\32xl\:leading-relaxed{line-height:1.625}.\32xl\:leading-loose{line-height:2}.\32xl\:tracking-tighter{letter-spacing:-.05em}.\32xl\:tracking-tight{letter-spacing:-.025em}.\32xl\:tracking-normal{letter-spacing:0}.\32xl\:tracking-wide{letter-spacing:.025em}.\32xl\:tracking-wider{letter-spacing:.05em}.\32xl\:tracking-widest{letter-spacing:.1em}.\32xl\:text-transparent{color:transparent}.\32xl\:text-current{color:currentColor}.\32xl\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-transparent{color:transparent}.group:hover .\32xl\:group-hover\:text-current{color:currentColor}.group:hover .\32xl\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:focus-within\:text-transparent:focus-within{color:transparent}.\32xl\:focus-within\:text-current:focus-within{color:currentColor}.\32xl\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:hover\:text-transparent:hover{color:transparent}.\32xl\:hover\:text-current:hover{color:currentColor}.\32xl\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:focus\:text-transparent:focus{color:transparent}.\32xl\:focus\:text-current:focus{color:currentColor}.\32xl\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:text-opacity-0{--tw-text-opacity:0}.\32xl\:text-opacity-5{--tw-text-opacity:0.05}.\32xl\:text-opacity-10{--tw-text-opacity:0.1}.\32xl\:text-opacity-20{--tw-text-opacity:0.2}.\32xl\:text-opacity-25{--tw-text-opacity:0.25}.\32xl\:text-opacity-30{--tw-text-opacity:0.3}.\32xl\:text-opacity-40{--tw-text-opacity:0.4}.\32xl\:text-opacity-50{--tw-text-opacity:0.5}.\32xl\:text-opacity-60{--tw-text-opacity:0.6}.\32xl\:text-opacity-70{--tw-text-opacity:0.7}.\32xl\:text-opacity-75{--tw-text-opacity:0.75}.\32xl\:text-opacity-80{--tw-text-opacity:0.8}.\32xl\:text-opacity-90{--tw-text-opacity:0.9}.\32xl\:text-opacity-95{--tw-text-opacity:0.95}.\32xl\:text-opacity-100{--tw-text-opacity:1}.group:hover .\32xl\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .\32xl\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .\32xl\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .\32xl\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .\32xl\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .\32xl\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .\32xl\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .\32xl\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .\32xl\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .\32xl\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .\32xl\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .\32xl\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .\32xl\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .\32xl\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .\32xl\:group-hover\:text-opacity-100{--tw-text-opacity:1}.\32xl\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.\32xl\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.\32xl\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.\32xl\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.\32xl\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.\32xl\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.\32xl\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.\32xl\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.\32xl\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.\32xl\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.\32xl\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.\32xl\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.\32xl\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.\32xl\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.\32xl\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.\32xl\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.\32xl\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.\32xl\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.\32xl\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.\32xl\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.\32xl\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.\32xl\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.\32xl\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.\32xl\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.\32xl\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.\32xl\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.\32xl\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.\32xl\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.\32xl\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.\32xl\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.\32xl\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.\32xl\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.\32xl\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.\32xl\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.\32xl\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.\32xl\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.\32xl\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.\32xl\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.\32xl\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.\32xl\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.\32xl\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.\32xl\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.\32xl\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.\32xl\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.\32xl\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.\32xl\:underline{text-decoration:underline}.\32xl\:line-through{text-decoration:line-through}.\32xl\:no-underline{text-decoration:none}.group:hover .\32xl\:group-hover\:underline{text-decoration:underline}.group:hover .\32xl\:group-hover\:line-through{text-decoration:line-through}.group:hover .\32xl\:group-hover\:no-underline{text-decoration:none}.\32xl\:focus-within\:underline:focus-within{text-decoration:underline}.\32xl\:focus-within\:line-through:focus-within{text-decoration:line-through}.\32xl\:focus-within\:no-underline:focus-within{text-decoration:none}.\32xl\:hover\:underline:hover{text-decoration:underline}.\32xl\:hover\:line-through:hover{text-decoration:line-through}.\32xl\:hover\:no-underline:hover{text-decoration:none}.\32xl\:focus\:underline:focus{text-decoration:underline}.\32xl\:focus\:line-through:focus{text-decoration:line-through}.\32xl\:focus\:no-underline:focus{text-decoration:none}.\32xl\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.\32xl\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.\32xl\:placeholder-transparent::-moz-placeholder{color:transparent}.\32xl\:placeholder-transparent:-ms-input-placeholder{color:transparent}.\32xl\:placeholder-transparent::placeholder{color:transparent}.\32xl\:placeholder-current::-moz-placeholder{color:currentColor}.\32xl\:placeholder-current:-ms-input-placeholder{color:currentColor}.\32xl\:placeholder-current::placeholder{color:currentColor}.\32xl\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.\32xl\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.\32xl\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.\32xl\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.\32xl\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.\32xl\:focus\:placeholder-current:focus::placeholder{color:currentColor}.\32xl\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.\32xl\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.\32xl\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.\32xl\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.\32xl\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.\32xl\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.\32xl\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.\32xl\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.\32xl\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.\32xl\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.\32xl\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.\32xl\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.\32xl\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.\32xl\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.\32xl\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.\32xl\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.\32xl\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.\32xl\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.\32xl\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.\32xl\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.\32xl\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.\32xl\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.\32xl\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.\32xl\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.\32xl\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.\32xl\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.\32xl\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.\32xl\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.\32xl\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.\32xl\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.\32xl\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.\32xl\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.\32xl\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.\32xl\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.\32xl\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.\32xl\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.\32xl\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.\32xl\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.\32xl\:opacity-0{opacity:0}.\32xl\:opacity-5{opacity:.05}.\32xl\:opacity-10{opacity:.1}.\32xl\:opacity-20{opacity:.2}.\32xl\:opacity-25{opacity:.25}.\32xl\:opacity-30{opacity:.3}.\32xl\:opacity-40{opacity:.4}.\32xl\:opacity-50{opacity:.5}.\32xl\:opacity-60{opacity:.6}.\32xl\:opacity-70{opacity:.7}.\32xl\:opacity-75{opacity:.75}.\32xl\:opacity-80{opacity:.8}.\32xl\:opacity-90{opacity:.9}.\32xl\:opacity-95{opacity:.95}.\32xl\:opacity-100{opacity:1}.group:hover .\32xl\:group-hover\:opacity-0{opacity:0}.group:hover .\32xl\:group-hover\:opacity-5{opacity:.05}.group:hover .\32xl\:group-hover\:opacity-10{opacity:.1}.group:hover .\32xl\:group-hover\:opacity-20{opacity:.2}.group:hover .\32xl\:group-hover\:opacity-25{opacity:.25}.group:hover .\32xl\:group-hover\:opacity-30{opacity:.3}.group:hover .\32xl\:group-hover\:opacity-40{opacity:.4}.group:hover .\32xl\:group-hover\:opacity-50{opacity:.5}.group:hover .\32xl\:group-hover\:opacity-60{opacity:.6}.group:hover .\32xl\:group-hover\:opacity-70{opacity:.7}.group:hover .\32xl\:group-hover\:opacity-75{opacity:.75}.group:hover .\32xl\:group-hover\:opacity-80{opacity:.8}.group:hover .\32xl\:group-hover\:opacity-90{opacity:.9}.group:hover .\32xl\:group-hover\:opacity-95{opacity:.95}.group:hover .\32xl\:group-hover\:opacity-100{opacity:1}.\32xl\:focus-within\:opacity-0:focus-within{opacity:0}.\32xl\:focus-within\:opacity-5:focus-within{opacity:.05}.\32xl\:focus-within\:opacity-10:focus-within{opacity:.1}.\32xl\:focus-within\:opacity-20:focus-within{opacity:.2}.\32xl\:focus-within\:opacity-25:focus-within{opacity:.25}.\32xl\:focus-within\:opacity-30:focus-within{opacity:.3}.\32xl\:focus-within\:opacity-40:focus-within{opacity:.4}.\32xl\:focus-within\:opacity-50:focus-within{opacity:.5}.\32xl\:focus-within\:opacity-60:focus-within{opacity:.6}.\32xl\:focus-within\:opacity-70:focus-within{opacity:.7}.\32xl\:focus-within\:opacity-75:focus-within{opacity:.75}.\32xl\:focus-within\:opacity-80:focus-within{opacity:.8}.\32xl\:focus-within\:opacity-90:focus-within{opacity:.9}.\32xl\:focus-within\:opacity-95:focus-within{opacity:.95}.\32xl\:focus-within\:opacity-100:focus-within{opacity:1}.\32xl\:hover\:opacity-0:hover{opacity:0}.\32xl\:hover\:opacity-5:hover{opacity:.05}.\32xl\:hover\:opacity-10:hover{opacity:.1}.\32xl\:hover\:opacity-20:hover{opacity:.2}.\32xl\:hover\:opacity-25:hover{opacity:.25}.\32xl\:hover\:opacity-30:hover{opacity:.3}.\32xl\:hover\:opacity-40:hover{opacity:.4}.\32xl\:hover\:opacity-50:hover{opacity:.5}.\32xl\:hover\:opacity-60:hover{opacity:.6}.\32xl\:hover\:opacity-70:hover{opacity:.7}.\32xl\:hover\:opacity-75:hover{opacity:.75}.\32xl\:hover\:opacity-80:hover{opacity:.8}.\32xl\:hover\:opacity-90:hover{opacity:.9}.\32xl\:hover\:opacity-95:hover{opacity:.95}.\32xl\:hover\:opacity-100:hover{opacity:1}.\32xl\:focus\:opacity-0:focus{opacity:0}.\32xl\:focus\:opacity-5:focus{opacity:.05}.\32xl\:focus\:opacity-10:focus{opacity:.1}.\32xl\:focus\:opacity-20:focus{opacity:.2}.\32xl\:focus\:opacity-25:focus{opacity:.25}.\32xl\:focus\:opacity-30:focus{opacity:.3}.\32xl\:focus\:opacity-40:focus{opacity:.4}.\32xl\:focus\:opacity-50:focus{opacity:.5}.\32xl\:focus\:opacity-60:focus{opacity:.6}.\32xl\:focus\:opacity-70:focus{opacity:.7}.\32xl\:focus\:opacity-75:focus{opacity:.75}.\32xl\:focus\:opacity-80:focus{opacity:.8}.\32xl\:focus\:opacity-90:focus{opacity:.9}.\32xl\:focus\:opacity-95:focus{opacity:.95}.\32xl\:focus\:opacity-100:focus{opacity:1}.\32xl\:bg-blend-normal{background-blend-mode:normal}.\32xl\:bg-blend-multiply{background-blend-mode:multiply}.\32xl\:bg-blend-screen{background-blend-mode:screen}.\32xl\:bg-blend-overlay{background-blend-mode:overlay}.\32xl\:bg-blend-darken{background-blend-mode:darken}.\32xl\:bg-blend-lighten{background-blend-mode:lighten}.\32xl\:bg-blend-color-dodge{background-blend-mode:color-dodge}.\32xl\:bg-blend-color-burn{background-blend-mode:color-burn}.\32xl\:bg-blend-hard-light{background-blend-mode:hard-light}.\32xl\:bg-blend-soft-light{background-blend-mode:soft-light}.\32xl\:bg-blend-difference{background-blend-mode:difference}.\32xl\:bg-blend-exclusion{background-blend-mode:exclusion}.\32xl\:bg-blend-hue{background-blend-mode:hue}.\32xl\:bg-blend-saturation{background-blend-mode:saturation}.\32xl\:bg-blend-color{background-blend-mode:color}.\32xl\:bg-blend-luminosity{background-blend-mode:luminosity}.\32xl\:mix-blend-normal{mix-blend-mode:normal}.\32xl\:mix-blend-multiply{mix-blend-mode:multiply}.\32xl\:mix-blend-screen{mix-blend-mode:screen}.\32xl\:mix-blend-overlay{mix-blend-mode:overlay}.\32xl\:mix-blend-darken{mix-blend-mode:darken}.\32xl\:mix-blend-lighten{mix-blend-mode:lighten}.\32xl\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.\32xl\:mix-blend-color-burn{mix-blend-mode:color-burn}.\32xl\:mix-blend-hard-light{mix-blend-mode:hard-light}.\32xl\:mix-blend-soft-light{mix-blend-mode:soft-light}.\32xl\:mix-blend-difference{mix-blend-mode:difference}.\32xl\:mix-blend-exclusion{mix-blend-mode:exclusion}.\32xl\:mix-blend-hue{mix-blend-mode:hue}.\32xl\:mix-blend-saturation{mix-blend-mode:saturation}.\32xl\:mix-blend-color{mix-blend-mode:color}.\32xl\:mix-blend-luminosity{mix-blend-mode:luminosity}.\32xl\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.\32xl\:shadow,.\32xl\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.\32xl\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.\32xl\:shadow-lg,.\32xl\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.\32xl\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.\32xl\:shadow-2xl,.\32xl\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.\32xl\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.\32xl\:shadow-inner,.\32xl\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .\32xl\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .\32xl\:group-hover\:shadow,.group:hover .\32xl\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .\32xl\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .\32xl\:group-hover\:shadow-lg,.group:hover .\32xl\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .\32xl\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .\32xl\:group-hover\:shadow-2xl,.group:hover .\32xl\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .\32xl\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .\32xl\:group-hover\:shadow-inner,.group:hover .\32xl\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.\32xl\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.\32xl\:hover\:shadow-sm:hover,.\32xl\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.\32xl\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.\32xl\:hover\:shadow-lg:hover,.\32xl\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.\32xl\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.\32xl\:hover\:shadow-2xl:hover,.\32xl\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.\32xl\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.\32xl\:hover\:shadow-inner:hover,.\32xl\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.\32xl\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.\32xl\:focus\:shadow-sm:focus,.\32xl\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.\32xl\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.\32xl\:focus\:shadow-lg:focus,.\32xl\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.\32xl\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.\32xl\:focus\:shadow-2xl:focus,.\32xl\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.\32xl\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.\32xl\:focus\:shadow-inner:focus,.\32xl\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.\32xl\:outline-none{outline:2px solid transparent;outline-offset:2px}.\32xl\:outline-white{outline:2px dotted #fff;outline-offset:2px}.\32xl\:outline-black{outline:2px dotted #000;outline-offset:2px}.\32xl\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.\32xl\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.\32xl\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.\32xl\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.\32xl\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.\32xl\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.\32xl\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-0,.\32xl\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-2,.\32xl\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring,.\32xl\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-0:focus,.\32xl\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-2:focus,.\32xl\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-8:focus,.\32xl\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-inset{--tw-ring-inset:inset}.\32xl\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.\32xl\:focus\:ring-inset:focus{--tw-ring-inset:inset}.\32xl\:ring-transparent{--tw-ring-color:transparent}.\32xl\:ring-current{--tw-ring-color:currentColor}.\32xl\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.\32xl\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.\32xl\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.\32xl\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.\32xl\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.\32xl\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.\32xl\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.\32xl\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.\32xl\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.\32xl\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.\32xl\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.\32xl\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.\32xl\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.\32xl\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.\32xl\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.\32xl\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.\32xl\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.\32xl\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.\32xl\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.\32xl\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.\32xl\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.\32xl\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.\32xl\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.\32xl\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.\32xl\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.\32xl\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.\32xl\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.\32xl\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.\32xl\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.\32xl\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.\32xl\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.\32xl\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.\32xl\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.\32xl\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.\32xl\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.\32xl\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.\32xl\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.\32xl\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.\32xl\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.\32xl\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.\32xl\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.\32xl\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.\32xl\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.\32xl\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.\32xl\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.\32xl\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.\32xl\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.\32xl\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.\32xl\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.\32xl\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.\32xl\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.\32xl\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.\32xl\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.\32xl\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.\32xl\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.\32xl\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.\32xl\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.\32xl\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.\32xl\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.\32xl\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.\32xl\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.\32xl\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.\32xl\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.\32xl\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.\32xl\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.\32xl\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.\32xl\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.\32xl\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.\32xl\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.\32xl\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.\32xl\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.\32xl\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.\32xl\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.\32xl\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.\32xl\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.\32xl\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.\32xl\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.\32xl\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.\32xl\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.\32xl\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.\32xl\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.\32xl\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.\32xl\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.\32xl\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.\32xl\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.\32xl\:focus\:ring-current:focus{--tw-ring-color:currentColor}.\32xl\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.\32xl\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.\32xl\:ring-opacity-0{--tw-ring-opacity:0}.\32xl\:ring-opacity-5{--tw-ring-opacity:0.05}.\32xl\:ring-opacity-10{--tw-ring-opacity:0.1}.\32xl\:ring-opacity-20{--tw-ring-opacity:0.2}.\32xl\:ring-opacity-25{--tw-ring-opacity:0.25}.\32xl\:ring-opacity-30{--tw-ring-opacity:0.3}.\32xl\:ring-opacity-40{--tw-ring-opacity:0.4}.\32xl\:ring-opacity-50{--tw-ring-opacity:0.5}.\32xl\:ring-opacity-60{--tw-ring-opacity:0.6}.\32xl\:ring-opacity-70{--tw-ring-opacity:0.7}.\32xl\:ring-opacity-75{--tw-ring-opacity:0.75}.\32xl\:ring-opacity-80{--tw-ring-opacity:0.8}.\32xl\:ring-opacity-90{--tw-ring-opacity:0.9}.\32xl\:ring-opacity-95{--tw-ring-opacity:0.95}.\32xl\:ring-opacity-100{--tw-ring-opacity:1}.\32xl\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.\32xl\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.\32xl\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.\32xl\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.\32xl\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.\32xl\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.\32xl\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.\32xl\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.\32xl\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.\32xl\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.\32xl\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.\32xl\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.\32xl\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.\32xl\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.\32xl\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.\32xl\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.\32xl\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.\32xl\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.\32xl\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.\32xl\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.\32xl\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.\32xl\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.\32xl\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.\32xl\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.\32xl\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.\32xl\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.\32xl\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.\32xl\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.\32xl\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.\32xl\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.\32xl\:ring-offset-0{--tw-ring-offset-width:0px}.\32xl\:ring-offset-1{--tw-ring-offset-width:1px}.\32xl\:ring-offset-2{--tw-ring-offset-width:2px}.\32xl\:ring-offset-4{--tw-ring-offset-width:4px}.\32xl\:ring-offset-8{--tw-ring-offset-width:8px}.\32xl\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.\32xl\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.\32xl\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.\32xl\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.\32xl\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.\32xl\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.\32xl\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.\32xl\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.\32xl\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.\32xl\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.\32xl\:ring-offset-transparent{--tw-ring-offset-color:transparent}.\32xl\:ring-offset-current{--tw-ring-offset-color:currentColor}.\32xl\:ring-offset-black{--tw-ring-offset-color:#000}.\32xl\:ring-offset-white{--tw-ring-offset-color:#fff}.\32xl\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.\32xl\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.\32xl\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.\32xl\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.\32xl\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.\32xl\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.\32xl\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.\32xl\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.\32xl\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.\32xl\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.\32xl\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.\32xl\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.\32xl\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.\32xl\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.\32xl\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.\32xl\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.\32xl\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.\32xl\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.\32xl\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.\32xl\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.\32xl\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.\32xl\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.\32xl\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.\32xl\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.\32xl\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.\32xl\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.\32xl\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.\32xl\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.\32xl\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.\32xl\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.\32xl\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.\32xl\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.\32xl\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.\32xl\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.\32xl\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.\32xl\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.\32xl\:ring-offset-green-600{--tw-ring-offset-color:#059669}.\32xl\:ring-offset-green-700{--tw-ring-offset-color:#047857}.\32xl\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.\32xl\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.\32xl\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.\32xl\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.\32xl\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.\32xl\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.\32xl\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.\32xl\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.\32xl\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.\32xl\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.\32xl\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.\32xl\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.\32xl\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.\32xl\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.\32xl\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.\32xl\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.\32xl\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.\32xl\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.\32xl\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.\32xl\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.\32xl\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.\32xl\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.\32xl\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.\32xl\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.\32xl\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.\32xl\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.\32xl\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.\32xl\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.\32xl\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.\32xl\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.\32xl\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.\32xl\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.\32xl\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.\32xl\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.\32xl\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.\32xl\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.\32xl\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.\32xl\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.\32xl\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.\32xl\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.\32xl\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.\32xl\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.\32xl\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.\32xl\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.\32xl\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.\32xl\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.\32xl\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.\32xl\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.\32xl\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.\32xl\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.\32xl\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.\32xl\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.\32xl\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.\32xl\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.\32xl\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.\32xl\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.\32xl\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.\32xl\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.\32xl\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.\32xl\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.\32xl\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.\32xl\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.\32xl\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.\32xl\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.\32xl\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.\32xl\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.\32xl\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.\32xl\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.\32xl\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.\32xl\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.\32xl\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.\32xl\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.\32xl\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.\32xl\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.\32xl\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.\32xl\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.\32xl\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.\32xl\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.\32xl\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.\32xl\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.\32xl\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.\32xl\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.\32xl\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.\32xl\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.\32xl\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.\32xl\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.\32xl\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.\32xl\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.\32xl\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.\32xl\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.\32xl\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.\32xl\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.\32xl\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.\32xl\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.\32xl\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.\32xl\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.\32xl\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.\32xl\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.\32xl\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.\32xl\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.\32xl\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.\32xl\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.\32xl\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.\32xl\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.\32xl\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.\32xl\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.\32xl\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.\32xl\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.\32xl\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.\32xl\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.\32xl\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.\32xl\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.\32xl\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.\32xl\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.\32xl\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.\32xl\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.\32xl\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.\32xl\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.\32xl\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.\32xl\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.\32xl\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.\32xl\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.\32xl\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.\32xl\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.\32xl\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.\32xl\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.\32xl\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.\32xl\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.\32xl\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.\32xl\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.\32xl\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.\32xl\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.\32xl\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.\32xl\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.\32xl\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.\32xl\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.\32xl\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.\32xl\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.\32xl\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.\32xl\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.\32xl\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.\32xl\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.\32xl\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.\32xl\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.\32xl\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.\32xl\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.\32xl\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.\32xl\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.\32xl\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.\32xl\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.\32xl\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.\32xl\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.\32xl\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.\32xl\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.\32xl\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.\32xl\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.\32xl\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.\32xl\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.\32xl\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.\32xl\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.\32xl\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.\32xl\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.\32xl\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.\32xl\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.\32xl\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.\32xl\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.\32xl\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.\32xl\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.\32xl\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.\32xl\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.\32xl\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.\32xl\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.\32xl\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.\32xl\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.\32xl\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.\32xl\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.\32xl\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.\32xl\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.\32xl\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.\32xl\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.\32xl\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.\32xl\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.\32xl\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.\32xl\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.\32xl\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.\32xl\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.\32xl\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.\32xl\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.\32xl\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.\32xl\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.\32xl\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.\32xl\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.\32xl\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.\32xl\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.\32xl\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.\32xl\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.\32xl\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.\32xl\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.\32xl\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.\32xl\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.\32xl\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.\32xl\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.\32xl\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.\32xl\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.\32xl\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.\32xl\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.\32xl\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.\32xl\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.\32xl\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.\32xl\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.\32xl\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\32xl\:filter-none{filter:none}.\32xl\:blur-0,.\32xl\:blur-none{--tw-blur:blur(0)}.\32xl\:blur-sm{--tw-blur:blur(4px)}.\32xl\:blur{--tw-blur:blur(8px)}.\32xl\:blur-md{--tw-blur:blur(12px)}.\32xl\:blur-lg{--tw-blur:blur(16px)}.\32xl\:blur-xl{--tw-blur:blur(24px)}.\32xl\:blur-2xl{--tw-blur:blur(40px)}.\32xl\:blur-3xl{--tw-blur:blur(64px)}.\32xl\:brightness-0{--tw-brightness:brightness(0)}.\32xl\:brightness-50{--tw-brightness:brightness(.5)}.\32xl\:brightness-75{--tw-brightness:brightness(.75)}.\32xl\:brightness-90{--tw-brightness:brightness(.9)}.\32xl\:brightness-95{--tw-brightness:brightness(.95)}.\32xl\:brightness-100{--tw-brightness:brightness(1)}.\32xl\:brightness-105{--tw-brightness:brightness(1.05)}.\32xl\:brightness-110{--tw-brightness:brightness(1.1)}.\32xl\:brightness-125{--tw-brightness:brightness(1.25)}.\32xl\:brightness-150{--tw-brightness:brightness(1.5)}.\32xl\:brightness-200{--tw-brightness:brightness(2)}.\32xl\:contrast-0{--tw-contrast:contrast(0)}.\32xl\:contrast-50{--tw-contrast:contrast(.5)}.\32xl\:contrast-75{--tw-contrast:contrast(.75)}.\32xl\:contrast-100{--tw-contrast:contrast(1)}.\32xl\:contrast-125{--tw-contrast:contrast(1.25)}.\32xl\:contrast-150{--tw-contrast:contrast(1.5)}.\32xl\:contrast-200{--tw-contrast:contrast(2)}.\32xl\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.\32xl\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.\32xl\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.\32xl\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.\32xl\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.\32xl\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.\32xl\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.\32xl\:grayscale-0{--tw-grayscale:grayscale(0)}.\32xl\:grayscale{--tw-grayscale:grayscale(100%)}.\32xl\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.\32xl\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.\32xl\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.\32xl\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.\32xl\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.\32xl\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.\32xl\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.\32xl\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.\32xl\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.\32xl\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.\32xl\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.\32xl\:invert-0{--tw-invert:invert(0)}.\32xl\:invert{--tw-invert:invert(100%)}.\32xl\:saturate-0{--tw-saturate:saturate(0)}.\32xl\:saturate-50{--tw-saturate:saturate(.5)}.\32xl\:saturate-100{--tw-saturate:saturate(1)}.\32xl\:saturate-150{--tw-saturate:saturate(1.5)}.\32xl\:saturate-200{--tw-saturate:saturate(2)}.\32xl\:sepia-0{--tw-sepia:sepia(0)}.\32xl\:sepia{--tw-sepia:sepia(100%)}.\32xl\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.\32xl\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.\32xl\:backdrop-blur-0,.\32xl\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.\32xl\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.\32xl\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.\32xl\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.\32xl\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.\32xl\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.\32xl\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.\32xl\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.\32xl\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.\32xl\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.\32xl\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.\32xl\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.\32xl\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.\32xl\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.\32xl\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.\32xl\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.\32xl\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.\32xl\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.\32xl\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.\32xl\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.\32xl\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.\32xl\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.\32xl\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.\32xl\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.\32xl\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.\32xl\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.\32xl\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.\32xl\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.\32xl\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.\32xl\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.\32xl\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.\32xl\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.\32xl\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.\32xl\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.\32xl\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.\32xl\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.\32xl\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.\32xl\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.\32xl\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.\32xl\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.\32xl\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.\32xl\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.\32xl\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.\32xl\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.\32xl\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.\32xl\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.\32xl\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.\32xl\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.\32xl\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.\32xl\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.\32xl\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.\32xl\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.\32xl\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.\32xl\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.\32xl\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.\32xl\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.\32xl\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.\32xl\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.\32xl\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.\32xl\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.\32xl\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.\32xl\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.\32xl\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.\32xl\:transition-none{transition-property:none}.\32xl\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:delay-75{transition-delay:75ms}.\32xl\:delay-100{transition-delay:.1s}.\32xl\:delay-150{transition-delay:.15s}.\32xl\:delay-200{transition-delay:.2s}.\32xl\:delay-300{transition-delay:.3s}.\32xl\:delay-500{transition-delay:.5s}.\32xl\:delay-700{transition-delay:.7s}.\32xl\:delay-1000{transition-delay:1s}.\32xl\:duration-75{transition-duration:75ms}.\32xl\:duration-100{transition-duration:.1s}.\32xl\:duration-150{transition-duration:.15s}.\32xl\:duration-200{transition-duration:.2s}.\32xl\:duration-300{transition-duration:.3s}.\32xl\:duration-500{transition-duration:.5s}.\32xl\:duration-700{transition-duration:.7s}.\32xl\:duration-1000{transition-duration:1s}.\32xl\:ease-linear{transition-timing-function:linear}.\32xl\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.\32xl\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\32xl\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}} \ No newline at end of file diff --git a/fdroid/.gitignore b/fdroid/.gitignore new file mode 100644 index 0000000000..5b807a9c71 --- /dev/null +++ b/fdroid/.gitignore @@ -0,0 +1,4 @@ +repo +srclibs +tmp +chat.fluffy.fluffychat \ No newline at end of file diff --git a/fdroid/config.nightly.py b/fdroid/config.nightly.py new file mode 100644 index 0000000000..86fe4932c1 --- /dev/null +++ b/fdroid/config.nightly.py @@ -0,0 +1,13 @@ +repo_url = "https://fluffychat.im/repo/nightly/repo" +repo_name = "FluffyChat nightly repo" +repo_icon = "fdroid-icon.png" +repo_description = """ +FluffyChat nightly repo +""" + +archive_older = 0 + +local_copy_dir = "/fdroid" + +keystore = "key.nightly.jks" +repo_keyalias = "vmd66783.contaboserver.net" diff --git a/fdroid/config.stable.py b/fdroid/config.stable.py new file mode 100644 index 0000000000..d0a3e2e824 --- /dev/null +++ b/fdroid/config.stable.py @@ -0,0 +1,13 @@ +repo_url = "https://fluffychat.im/repo/stable/repo" +repo_name = "FluffyChat repo" +repo_icon = "fdroid-icon.png" +repo_description = """ +FluffyChat repo +""" + +archive_older = 0 + +local_copy_dir = "/fdroid" + +keystore = "key.jks" +repo_keyalias = "key" diff --git a/fdroid/fdroid-icon.png b/fdroid/fdroid-icon.png new file mode 100644 index 0000000000..0c0d41738f Binary files /dev/null and b/fdroid/fdroid-icon.png differ diff --git a/fdroid/metadata/chat.fluffy.fluffychat.yml b/fdroid/metadata/chat.fluffy.fluffychat.yml new file mode 100644 index 0000000000..32ffd4a90e --- /dev/null +++ b/fdroid/metadata/chat.fluffy.fluffychat.yml @@ -0,0 +1,53 @@ +Categories: + - Internet + - Phone & SMS +License: AGPL-3.0-only +AuthorName: Famedly +SourceCode: https://github.com/krille-chan/fluffychat +IssueTracker: https://github.com/krille-chan/fluffychat/-/issues +Translation: https://hosted.weblate.org/projects/fluffychat/ +Changelog: https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/CHANGELOG.md + +AutoName: FluffyChat +Summary: "Chat with your friends with FluffyChat.\n" +Description: | + FluffyChat is an open, nonprofit and cute matrix messenger app for Ubuntu Touch, Android and iOS. + + Open + Opensource and open development where everyone can join. + + Nonprofit + FluffyChat is donation funded. + + Cute ♥ + Cute design and many theme settings including a dark mode. + + One-to-one and groupchats + Unlimited groups and direct chats. + + Easy + FluffyChat is made as simple to use as possible. + + Free + Free to use for everyone without ads. + + Decentralized + There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host + your own. + + Compatible + Compatible with Riot, Fractal, Nekho and all matrix messengers. + + + FluffyChat comes with a dream + + Imagine a world where everyone can choose the messenger they like and is still able to chat with + all of their friends. + A world where there are no companies spying on you when you send selfies to friends and lovers. + And a world where apps are made for fluffyness and not for profit. ♥ + +RepoType: git +Repo: https://github.com/krille-chan/fluffychat.git + +AutoUpdateMode: None +UpdateCheckMode: None diff --git a/fonts/NotoEmoji/NotoColorEmoji.ttf b/fonts/NotoEmoji/NotoColorEmoji.ttf index b836e93f27..8ebcc8fde2 100644 Binary files a/fonts/NotoEmoji/NotoColorEmoji.ttf and b/fonts/NotoEmoji/NotoColorEmoji.ttf differ diff --git a/fonts/NotoEmoji/NotoEmoji-Regular.ttf b/fonts/NotoEmoji/NotoEmoji-Regular.ttf deleted file mode 100644 index 19b7badf4a..0000000000 Binary files a/fonts/NotoEmoji/NotoEmoji-Regular.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Black.ttf b/fonts/Roboto/Roboto-Black.ttf index 43a00e0df0..0112e7da62 100644 Binary files a/fonts/Roboto/Roboto-Black.ttf and b/fonts/Roboto/Roboto-Black.ttf differ diff --git a/fonts/Roboto/Roboto-BlackItalic.ttf b/fonts/Roboto/Roboto-BlackItalic.ttf index 5082cdc4e8..b2c6aca57b 100644 Binary files a/fonts/Roboto/Roboto-BlackItalic.ttf and b/fonts/Roboto/Roboto-BlackItalic.ttf differ diff --git a/fonts/Roboto/Roboto-Bold.ttf b/fonts/Roboto/Roboto-Bold.ttf index 3742457900..43da14d84e 100644 Binary files a/fonts/Roboto/Roboto-Bold.ttf and b/fonts/Roboto/Roboto-Bold.ttf differ diff --git a/fonts/Roboto/Roboto-BoldItalic.ttf b/fonts/Roboto/Roboto-BoldItalic.ttf index e85e7fb9e3..bcfdab4311 100644 Binary files a/fonts/Roboto/Roboto-BoldItalic.ttf and b/fonts/Roboto/Roboto-BoldItalic.ttf differ diff --git a/fonts/Roboto/Roboto-Italic.ttf b/fonts/Roboto/Roboto-Italic.ttf index c9df607a4d..1b5eaa361c 100644 Binary files a/fonts/Roboto/Roboto-Italic.ttf and b/fonts/Roboto/Roboto-Italic.ttf differ diff --git a/fonts/Roboto/Roboto-Light.ttf b/fonts/Roboto/Roboto-Light.ttf index 0e977514ff..e7307e72c5 100644 Binary files a/fonts/Roboto/Roboto-Light.ttf and b/fonts/Roboto/Roboto-Light.ttf differ diff --git a/fonts/Roboto/Roboto-LightItalic.ttf b/fonts/Roboto/Roboto-LightItalic.ttf index 3ad14fa7c4..2d277afb23 100644 Binary files a/fonts/Roboto/Roboto-LightItalic.ttf and b/fonts/Roboto/Roboto-LightItalic.ttf differ diff --git a/fonts/Roboto/Roboto-Medium.ttf b/fonts/Roboto/Roboto-Medium.ttf index e89b0b79a2..ac0f908b9c 100644 Binary files a/fonts/Roboto/Roboto-Medium.ttf and b/fonts/Roboto/Roboto-Medium.ttf differ diff --git a/fonts/Roboto/Roboto-MediumItalic.ttf b/fonts/Roboto/Roboto-MediumItalic.ttf index a5a41d3d00..fc36a4785c 100644 Binary files a/fonts/Roboto/Roboto-MediumItalic.ttf and b/fonts/Roboto/Roboto-MediumItalic.ttf differ diff --git a/fonts/Roboto/Roboto-Regular.ttf b/fonts/Roboto/Roboto-Regular.ttf index 3d6861b423..ddf4bfacb3 100644 Binary files a/fonts/Roboto/Roboto-Regular.ttf and b/fonts/Roboto/Roboto-Regular.ttf differ diff --git a/fonts/Roboto/Roboto-Thin.ttf b/fonts/Roboto/Roboto-Thin.ttf index 7d084aed88..2e0dee6a83 100644 Binary files a/fonts/Roboto/Roboto-Thin.ttf and b/fonts/Roboto/Roboto-Thin.ttf differ diff --git a/fonts/Roboto/Roboto-ThinItalic.ttf b/fonts/Roboto/Roboto-ThinItalic.ttf index c17338960c..084f9c0f53 100644 Binary files a/fonts/Roboto/Roboto-ThinItalic.ttf and b/fonts/Roboto/Roboto-ThinItalic.ttf differ diff --git a/fonts/Roboto/RobotoMono-Regular.ttf b/fonts/Roboto/RobotoMono-Regular.ttf new file mode 100644 index 0000000000..d9371a1bd8 Binary files /dev/null and b/fonts/Roboto/RobotoMono-Regular.ttf differ diff --git a/integration_test/.gitignore b/integration_test/.gitignore index 539d882e4a..3284fe008c 100644 --- a/integration_test/.gitignore +++ b/integration_test/.gitignore @@ -1 +1,6 @@ synapse/data/homeserver.db +dendrite/data/server.* +dendrite/data/matrix_key.pem +dendrite/data/logs +dendrite/data/jetstream +dendrite/data/*.db \ No newline at end of file diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index 0ba99b2146..90f4230772 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -1,54 +1,193 @@ -import 'dart:developer'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/pages/chat/chat_view.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_body.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:http/http.dart'; +import 'package:hive_flutter/hive_flutter.dart'; import 'package:integration_test/integration_test.dart'; import 'package:fluffychat/main.dart' as app; +import 'package:shared_preferences/shared_preferences.dart'; +import 'extensions/default_flows.dart'; +import 'extensions/wait_for.dart'; import 'users.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - group('Integration Test', () { - test('Check server availability', () async { - final response = await get(Uri.parse('$homeserver/_matrix/static/')); - expect(response.statusCode, 200); - }, timeout: const Timeout(Duration(seconds: 10))); - testWidgets('Test if the app starts', (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); + group( + 'Integration Test', + () { + setUpAll( + () async { + // this random dialog popping up is super hard to cover in tests + SharedPreferences.setMockInitialValues({ + SettingKeys.showNoGoogle: false, + }); + try { + Hive.deleteFromDisk(); + Hive.initFlutter(); + } catch (_) {} + }, + ); - await Future.delayed(const Duration(seconds: 10)); + testWidgets( + 'Start app, login and logout', + (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + await tester.ensureLoggedOut(); + }, + ); - await tester.pumpAndSettle(); + testWidgets( + 'Login again', + (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + }, + ); - expect(find.text('Connect'), findsOneWidget); + testWidgets( + 'Start chat and send message', + (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + await tester.waitFor(find.byType(TextField)); + await tester.enterText(find.byType(TextField), Users.user2.name); + await tester.pumpAndSettle(); - final input = find.byType(TextField); + await tester.scrollUntilVisible( + find.text('Chats').first, + 500, + scrollable: find + .descendant( + of: find.byType(ChatListViewBody), + matching: find.byType(Scrollable), + ) + .first, + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Chats')); + await tester.pumpAndSettle(); + await tester.waitFor(find.byType(SearchTitle)); + await tester.pumpAndSettle(); - expect(input, findsOneWidget); + await tester.scrollUntilVisible( + find.text(Users.user2.name).first, + 500, + scrollable: find + .descendant( + of: find.byType(ChatListViewBody), + matching: find.byType(Scrollable), + ) + .first, + ); + await tester.pumpAndSettle(); + await tester.tap(find.text(Users.user2.name).first); - await tester.enterText(input, homeserver); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); + try { + await tester.waitFor( + find.byType(ChatView), + timeout: const Duration(seconds: 5), + ); + } catch (_) { + // in case the homeserver sends the username as search result + if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) { + await tester.tap(find.byIcon(Icons.send_outlined)); + await tester.pumpAndSettle(); + } + } - // in case registration is allowed - try { - await tester.tap(find.text('Login')); + await tester.waitFor(find.byType(ChatView)); + await tester.enterText(find.byType(TextField).last, 'Test'); + await tester.pumpAndSettle(); + try { + await tester.waitFor(find.byIcon(Icons.send_outlined)); + await tester.tap(find.byIcon(Icons.send_outlined)); + } catch (_) { + await tester.testTextInput.receiveAction(TextInputAction.done); + } + await tester.pumpAndSettle(); + await tester.waitFor(find.text('Test')); + await tester.pumpAndSettle(); + }, + ); + + testWidgets('Spaces', (tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + + await tester.waitFor(find.byTooltip('Show menu')); + await tester.tap(find.byTooltip('Show menu')); + await tester.pumpAndSettle(); + + await tester.waitFor(find.byIcon(Icons.workspaces_outlined)); + await tester.tap(find.byIcon(Icons.workspaces_outlined)); + await tester.pumpAndSettle(); + + await tester.waitFor(find.byType(TextField)); + await tester.enterText(find.byType(TextField).last, 'Test Space'); + await tester.pumpAndSettle(); + + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Invite contact')); + + await tester.tap(find.text('Invite contact')); await tester.pumpAndSettle(); - } catch (e) { - log('Registration is not allowed. Proceeding with login...'); - } - await tester.pumpAndSettle(); - final inputs = find.byType(TextField); + await tester.waitFor( + find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(TextField), + ), + ); + await tester.enterText( + find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(TextField), + ), + Users.user2.name, + ); + + await Future.delayed(const Duration(milliseconds: 250)); + await tester.testTextInput.receiveAction(TextInputAction.done); + + await Future.delayed(const Duration(milliseconds: 1000)); + await tester.pumpAndSettle(); + + await tester.tap( + find + .descendant( + of: find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(ListTile), + ), + matching: find.text(Users.user2.name), + ) + .last, + ); + await tester.pumpAndSettle(); + + await tester.waitFor(find.maybeUppercaseText('Yes')); + await tester.tap(find.maybeUppercaseText('Yes')); + await tester.pumpAndSettle(); + + await tester.tap(find.byTooltip('Back')); + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Load 2 more participants')); + await tester.tap(find.text('Load 2 more participants')); + await tester.pumpAndSettle(); - await tester.enterText(inputs.first, Users.alice.name); - await tester.enterText(inputs.last, Users.alice.password); - await tester.testTextInput.receiveAction(TextInputAction.done); - }); - }); + expect(find.text(Users.user2.name), findsOneWidget); + }); + }, + ); } diff --git a/integration_test/dendrite/data/dendrite.yaml b/integration_test/dendrite/data/dendrite.yaml new file mode 100644 index 0000000000..f1e95fd4bb --- /dev/null +++ b/integration_test/dendrite/data/dendrite.yaml @@ -0,0 +1,327 @@ +# This is the Dendrite configuration file. +# +# The configuration is split up into sections - each Dendrite component has a +# configuration section, in addition to the "global" section which applies to +# all components. + +# The version of the configuration file. +version: 2 + +# Global Matrix configuration. This configuration applies to all components. +global: + # The domain name of this homeserver. + server_name: localhost + + # The path to the signing private key file, used to sign requests and events. + # Note that this is NOT the same private key as used for TLS! To generate a + # signing key, use "./bin/generate-keys --private-key matrix_key.pem". + private_key: matrix_key.pem + + # The paths and expiry timestamps (as a UNIX timestamp in millisecond precision) + # to old signing private keys that were formerly in use on this domain. These + # keys will not be used for federation request or event signing, but will be + # provided to any other homeserver that asks when trying to verify old events. + old_private_keys: + # - private_key: old_matrix_key.pem + # expired_at: 1601024554498 + + # How long a remote server can cache our server signing key before requesting it + # again. Increasing this number will reduce the number of requests made by other + # servers for our key but increases the period that a compromised key will be + # considered valid by other homeservers. + key_validity_period: 168h0m0s + + # Global database connection pool, for PostgreSQL monolith deployments only. If + # this section is populated then you can omit the "database" blocks in all other + # sections. For polylith deployments, or monolith deployments using SQLite databases, + # you must configure the "database" block for each component instead. + database: + connection_string: + max_open_conns: + max_idle_conns: + conn_max_lifetime: + + # Configuration for in-memory caches. Caches can often improve performance by + # keeping frequently accessed items (like events, identifiers etc.) in memory + # rather than having to read them from the database. + cache: + # The estimated maximum size for the global cache in bytes, or in terabytes, + # gigabytes, megabytes or kilobytes when the appropriate 'tb', 'gb', 'mb' or + # 'kb' suffix is specified. Note that this is not a hard limit, nor is it a + # memory limit for the entire process. A cache that is too small may ultimately + # provide little or no benefit. + max_size_estimated: 1gb + + # The maximum amount of time that a cache entry can live for in memory before + # it will be evicted and/or refreshed from the database. Lower values result in + # easier admission of new cache entries but may also increase database load in + # comparison to higher values, so adjust conservatively. Higher values may make + # it harder for new items to make it into the cache, e.g. if new rooms suddenly + # become popular. + max_age: 1h + + # The server name to delegate server-server communications to, with optional port + # e.g. localhost:443 + well_known_server_name: "" + + # Lists of domains that the server will trust as identity servers to verify third + # party identifiers such as phone numbers and email addresses. + trusted_third_party_id_servers: + - matrix.org + - vector.im + + # Disables federation. Dendrite will not be able to communicate with other servers + # in the Matrix federation and the federation API will not be exposed. + disable_federation: false + + # Configures the handling of presence events. Inbound controls whether we receive + # presence events from other servers, outbound controls whether we send presence + # events for our local users to other servers. + presence: + enable_inbound: false + enable_outbound: false + + # Configures phone-home statistics reporting. These statistics contain the server + # name, number of active users and some information on your deployment config. + # We use this information to understand how Dendrite is being used in the wild. + report_stats: + enabled: false + endpoint: https://matrix.org/report-usage-stats/push + + # Server notices allows server admins to send messages to all users on the server. + server_notices: + enabled: false + # The local part, display name and avatar URL (as a mxc:// URL) for the user that + # will send the server notices. These are visible to all users on the deployment. + local_part: "_server" + display_name: "Server Alerts" + avatar_url: "" + # The room name to be used when sending server notices. This room name will + # appear in user clients. + room_name: "Server Alerts" + + # Configuration for NATS JetStream + jetstream: + # A list of NATS Server addresses to connect to. If none are specified, an + # internal NATS server will be started automatically when running Dendrite in + # monolith mode. For polylith deployments, it is required to specify the address + # of at least one NATS Server node. + addresses: + # - localhost:4222 + + # Persistent directory to store JetStream streams in. This directory should be + # preserved across Dendrite restarts. + storage_path: ./ + + # The prefix to use for stream names for this homeserver - really only useful + # if you are running more than one Dendrite server on the same NATS deployment. + topic_prefix: Dendrite + + # Configuration for Prometheus metric collection. + metrics: + enabled: false + basic_auth: + username: metrics + password: metrics + + # Optional DNS cache. The DNS cache may reduce the load on DNS servers if there + # is no local caching resolver available for use. + dns_cache: + enabled: false + cache_size: 256 + cache_lifetime: "5m" # 5 minutes; https://pkg.go.dev/time@master#ParseDuration + +# Configuration for the Appservice API. +app_service_api: + database: + connection_string: file:app_service_api.db + + # Disable the validation of TLS certificates of appservices. This is + # not recommended in production since it may allow appservice traffic + # to be sent to an insecure endpoint. + disable_tls_validation: true + + # Appservice configuration files to load into this homeserver. + config_files: + # - /path/to/appservice_registration.yaml + +# Configuration for the Client API. +client_api: + # Prevents new users from being able to register on this homeserver, except when + # using the registration shared secret below. + registration_disabled: false + + # Prevents new guest accounts from being created. Guest registration is also + # disabled implicitly by setting 'registration_disabled' above. + guests_disabled: true + + # If set, allows registration by anyone who knows the shared secret, regardless + # of whether registration is otherwise disabled. + registration_shared_secret: "" + + # Whether to require reCAPTCHA for registration. If you have enabled registration + # then this is HIGHLY RECOMMENDED to reduce the risk of your homeserver being used + # for coordinated spam attacks. + enable_registration_captcha: false + + # Settings for ReCAPTCHA. + recaptcha_public_key: "" + recaptcha_private_key: "" + recaptcha_bypass_secret: "" + recaptcha_siteverify_api: "" + + # TURN server information that this homeserver should send to clients. + turn: + turn_user_lifetime: "" + turn_uris: + # - turn:turn.server.org?transport=udp + # - turn:turn.server.org?transport=tcp + turn_shared_secret: "" + turn_username: "" + turn_password: "" + + # Settings for rate-limited endpoints. Rate limiting kicks in after the threshold + # number of "slots" have been taken by requests from a specific host. Each "slot" + # will be released after the cooloff time in milliseconds. Server administrators + # and appservice users are exempt from rate limiting by default. + rate_limiting: + enabled: true + threshold: 5 + cooloff_ms: 500 + exempt_user_ids: + # - "@user:domain.com" + +# Configuration for the Federation API. +federation_api: + database: + connection_string: file:federation_api.db + + # How many times we will try to resend a failed transaction to a specific server. The + # backoff is 2**x seconds, so 1 = 2 seconds, 2 = 4 seconds, 3 = 8 seconds etc. Once + # the max retries are exceeded, Dendrite will no longer try to send transactions to + # that server until it comes back to life and connects to us again. + send_max_retries: 16 + + # Disable the validation of TLS certificates of remote federated homeservers. Do not + # enable this option in production as it presents a security risk! + disable_tls_validation: false + + # Perspective keyservers to use as a backup when direct key fetches fail. This may + # be required to satisfy key requests for servers that are no longer online when + # joining some rooms. + key_perspectives: + - server_name: matrix.org + keys: + - key_id: ed25519:auto + public_key: Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw + - key_id: ed25519:a_RXGa + public_key: l8Hft5qXKn1vfHrg3p4+W8gELQVo8N13JkluMfmn2sQ + + # This option will control whether Dendrite will prefer to look up keys directly + # or whether it should try perspective servers first, using direct fetches as a + # last resort. + prefer_direct_fetch: false + +# Configuration for the Media API. +media_api: + database: + connection_string: file:media_api.db + + # Storage path for uploaded media. May be relative or absolute. + base_path: ./media_store + + # The maximum allowed file size (in bytes) for media uploads to this homeserver + # (0 = unlimited). If using a reverse proxy, ensure it allows requests at least + #this large (e.g. the client_max_body_size setting in nginx). + max_file_size_bytes: 10485760 + + # Whether to dynamically generate thumbnails if needed. + dynamic_thumbnails: false + + # The maximum number of simultaneous thumbnail generators to run. + max_thumbnail_generators: 10 + + # A list of thumbnail sizes to be generated for media content. + thumbnail_sizes: + - width: 32 + height: 32 + method: crop + - width: 96 + height: 96 + method: crop + - width: 640 + height: 480 + method: scale + +# Configuration for enabling experimental MSCs on this homeserver. +mscs: + database: + connection_string: file:mscs.db + mscs: + # - msc2836 # (Threading, see https://github.com/matrix-org/matrix-doc/pull/2836) + # - msc2946 # (Spaces Summary, see https://github.com/matrix-org/matrix-doc/pull/2946) + +# Configuration for the Sync API. +sync_api: + # This option controls which HTTP header to inspect to find the real remote IP + # address of the client. This is likely required if Dendrite is running behind + # a reverse proxy server. + # real_ip_header: X-Real-IP + database: + connection_string: file:sync_api.db + +key_server: + database: + connection_string: file:key_server.db + +room_server: + database: + connection_string: file:room_server.db + + +# Configuration for the User API. +user_api: + account_database: + connection_string: file:user_api.db + + # The cost when hashing passwords on registration/login. Default: 10. Min: 4, Max: 31 + # See https://pkg.go.dev/golang.org/x/crypto/bcrypt for more information. + # Setting this lower makes registration/login consume less CPU resources at the cost + # of security should the database be compromised. Setting this higher makes registration/login + # consume more CPU resources but makes it harder to brute force password hashes. This value + # can be lowered if performing tests or on embedded Dendrite instances (e.g WASM builds). + bcrypt_cost: 10 + + # The length of time that a token issued for a relying party from + # /_matrix/client/r0/user/{userId}/openid/request_token endpoint + # is considered to be valid in milliseconds. + # The default lifetime is 3600000ms (60 minutes). + # openid_token_lifetime_ms: 3600000 + +# Configuration for Opentracing. +# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on +# how this works and how to set it up. +tracing: + enabled: false + jaeger: + serviceName: "" + disabled: false + rpc_metrics: false + tags: [] + sampler: null + reporter: null + headers: null + baggage_restrictions: null + throttler: null + +# Logging configuration. The "std" logging type controls the logs being sent to +# stdout. The "file" logging type controls logs being written to a log folder on +# the disk. Supported log levels are "debug", "info", "warn", "error". +logging: + - type: std + level: info + - type: file + level: info + params: + path: ./logs + diff --git a/integration_test/extensions/default_flows.dart b/integration_test/extensions/default_flows.dart new file mode 100644 index 0000000000..6609969004 --- /dev/null +++ b/integration_test/extensions/default_flows.dart @@ -0,0 +1,171 @@ +import 'dart:developer'; + +import 'package:fluffychat/pages/chat_list/chat_list_body.dart'; +import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../users.dart'; +import 'wait_for.dart'; + +extension DefaultFlowExtensions on WidgetTester { + Future login() async { + final tester = this; + + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Let\'s start')); + + expect(find.text('Let\'s start'), findsOneWidget); + + final input = find.byType(TextField); + + expect(input, findsOneWidget); + + // getting the placeholder in place + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + await tester.enterText(input, homeserver); + await tester.pumpAndSettle(); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + // in case registration is allowed + // try { + await Future.delayed(const Duration(milliseconds: 50)); + + await tester.scrollUntilVisible( + find.text('Login'), + 500, + scrollable: find.descendant( + of: find.byKey(const Key('ConnectPageListView')), + matching: find.byType(Scrollable).first, + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Login')); + await tester.pumpAndSettle(); + /*} catch (e) { + log('Registration is not allowed. Proceeding with login...'); + }*/ + await tester.pumpAndSettle(); + + await Future.delayed(const Duration(milliseconds: 50)); + + final inputs = find.byType(TextField); + + await tester.enterText(inputs.first, Users.user1.name); + await tester.enterText(inputs.last, Users.user1.password); + await tester.pumpAndSettle(); + await tester.testTextInput.receiveAction(TextInputAction.done); + + try { + // pumpAndSettle does not work in here as setState is called + // asynchronously + await tester.waitFor( + find.byType(LinearProgressIndicator), + timeout: const Duration(milliseconds: 1500), + skipPumpAndSettle: true, + ); + } catch (_) { + // in case the input action does not work on the desired platform + if (find.text('Login').evaluate().isNotEmpty) { + await tester.tap(find.text('Login')); + } + } + + try { + await tester.pumpAndSettle(); + } catch (_) { + // may fail because of ongoing animation below dialog + } + + await tester.waitFor( + find.byType(ChatListViewBody), + skipPumpAndSettle: true, + ); + } + + /// ensure PushProvider check passes + Future acceptPushWarning() async { + final tester = this; + + final matcher = find.maybeUppercaseText('Do not show again'); + + try { + await tester.waitFor(matcher, timeout: const Duration(seconds: 5)); + + // the FCM push error dialog to be handled... + await tester.tap(matcher); + await tester.pumpAndSettle(); + } catch (_) {} + } + + Future ensureLoggedOut() async { + final tester = this; + await tester.pumpAndSettle(); + if (find.byType(ChatListViewBody).evaluate().isNotEmpty) { + await tester.tap(find.byTooltip('Show menu')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Settings')); + await tester.pumpAndSettle(); + await tester.scrollUntilVisible( + find.text('Account'), + 500, + scrollable: find.descendant( + of: find.byKey(const Key('SettingsListViewContent')), + matching: find.byType(Scrollable), + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Logout')); + await tester.pumpAndSettle(); + await tester.tap(find.maybeUppercaseText('Yes')); + await tester.pumpAndSettle(); + } + } + + Future ensureAppStartedHomescreen({ + Duration timeout = const Duration(seconds: 20), + }) async { + final tester = this; + await tester.pumpAndSettle(); + + final homeserverPickerFinder = find.byType(HomeserverPicker); + final chatListFinder = find.byType(ChatListViewBody); + + final end = DateTime.now().add(timeout); + + log( + 'Waiting for HomeserverPicker or ChatListViewBody...', + name: 'Test Runner', + ); + do { + if (DateTime.now().isAfter(end)) { + throw Exception( + 'Timed out waiting for HomeserverPicker or ChatListViewBody', + ); + } + + await pumpAndSettle(); + await Future.delayed(const Duration(milliseconds: 100)); + } while (homeserverPickerFinder.evaluate().isEmpty && + chatListFinder.evaluate().isEmpty); + + if (homeserverPickerFinder.evaluate().isNotEmpty) { + log( + 'Found HomeserverPicker, performing login.', + name: 'Test Runner', + ); + await tester.login(); + } else { + log( + 'Found ChatListViewBody, skipping login.', + name: 'Test Runner', + ); + } + + await tester.acceptPushWarning(); + } +} diff --git a/integration_test/extensions/wait_for.dart b/integration_test/extensions/wait_for.dart new file mode 100644 index 0000000000..cfd9d649c2 --- /dev/null +++ b/integration_test/extensions/wait_for.dart @@ -0,0 +1,49 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Workaround for https://github.com/flutter/flutter/issues/88765 +extension WaitForExtension on WidgetTester { + Future waitFor( + Finder finder, { + Duration timeout = const Duration(seconds: 20), + bool skipPumpAndSettle = false, + }) async { + final end = DateTime.now().add(timeout); + + do { + if (DateTime.now().isAfter(end)) { + throw Exception('Timed out waiting for $finder'); + } + + if (!skipPumpAndSettle) { + await pumpAndSettle(); + } + await Future.delayed(const Duration(milliseconds: 100)); + } while (finder.evaluate().isEmpty); + } +} + +extension MaybeUppercaseFinder on CommonFinders { + /// On Android some button labels are in uppercase while on iOS they + /// are not. This method tries both. + Finder maybeUppercaseText( + String text, { + bool findRichText = false, + bool skipOffstage = true, + }) { + try { + final finder = find.text( + text.toUpperCase(), + findRichText: findRichText, + skipOffstage: skipOffstage, + ); + expect(finder, findsOneWidget); + return finder; + } catch (_) { + return find.text( + text, + findRichText: findRichText, + skipOffstage: skipOffstage, + ); + } + } +} diff --git a/integration_test/synapse/data/homeserver.yaml b/integration_test/synapse/data/homeserver.yaml index 091aa63d98..b6963fd477 100644 --- a/integration_test/synapse/data/homeserver.yaml +++ b/integration_test/synapse/data/homeserver.yaml @@ -297,7 +297,7 @@ listeners: # If you plan to use a reverse proxy, please see # https://matrix-org.github.io/synapse/latest/reverse_proxy.html. # - - port: 8008 + - port: 80 tls: false type: http x_forwarded: false diff --git a/integration_test/users.dart b/integration_test/users.dart index e3ec06a65d..8af999e998 100644 --- a/integration_test/users.dart +++ b/integration_test/users.dart @@ -1,8 +1,26 @@ abstract class Users { const Users._(); - static const alice = User('alice', 'AliceInWonderland'); - static const bob = User('bob', 'JoWirSchaffenDas'); - static const trudy = User('trudy', 'HaveIBeenPwned'); + + static const user1 = User( + String.fromEnvironment( + 'USER1_NAME', + defaultValue: 'alice', + ), + String.fromEnvironment( + 'USER1_PW', + defaultValue: 'AliceInWonderland', + ), + ); + static const user2 = User( + String.fromEnvironment( + 'USER2_NAME', + defaultValue: 'bob', + ), + String.fromEnvironment( + 'USER2_PW', + defaultValue: 'JoWirSchaffenDas', + ), + ); } class User { @@ -12,5 +30,7 @@ class User { const User(this.name, this.password); } -// https://stackoverflow.com/a/33088657 -const homeserver = 'http://10.0.2.2:8008'; +const homeserver = 'http://${const String.fromEnvironment( + 'HOMESERVER', + defaultValue: 'localhost', +)}'; diff --git a/ios/FluffyChat Share/Info.plist b/ios/FluffyChat Share/Info.plist index d3a136ec52..876e559574 100644 --- a/ios/FluffyChat Share/Info.plist +++ b/ios/FluffyChat Share/Info.plist @@ -27,11 +27,11 @@ NSExtensionActivationRule NSExtensionActivationSupportsFileWithMaxCount - 1 + 10 NSExtensionActivationSupportsImageWithMaxCount - 1 + 10 NSExtensionActivationSupportsMovieWithMaxCount - 1 + 10 NSExtensionActivationSupportsText NSExtensionActivationSupportsWebURLWithMaxCount diff --git a/ios/FluffyChat Share/ShareViewController.swift b/ios/FluffyChat Share/ShareViewController.swift index 96d921432f..4d10e6bd8d 100644 --- a/ios/FluffyChat Share/ShareViewController.swift +++ b/ios/FluffyChat Share/ShareViewController.swift @@ -1,335 +1,14 @@ -import UIKit -import Social -import MobileCoreServices -import Photos - -class ShareViewController: SLComposeServiceViewController { - // TODO: IMPORTANT: This should be your host app bundle identifier - let hostAppBundleIdentifier = "im.fluffychat.app" - let sharedKey = "ShareKey" - var sharedMedia: [SharedMediaFile] = [] - var sharedText: [String] = [] - let imageContentType = kUTTypeImage as String - let videoContentType = kUTTypeMovie as String - let textContentType = kUTTypeText as String - let urlContentType = kUTTypeURL as String - let fileURLType = kUTTypeFileURL as String; - - override func isContentValid() -> Bool { - return true - } - - override func viewDidLoad() { - super.viewDidLoad(); - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. - if let content = extensionContext!.inputItems[0] as? NSExtensionItem { - if let contents = content.attachments { - for (index, attachment) in (contents).enumerated() { - if attachment.hasItemConformingToTypeIdentifier(imageContentType) { - handleImages(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(textContentType) { - handleText(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(fileURLType) { - handleFiles(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(urlContentType) { - handleUrl(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(videoContentType) { - handleVideos(content: content, attachment: attachment, index: index) - } - } - } - } - } - - override func didSelectPost() { - print("didSelectPost"); - } - - override func configurationItems() -> [Any]! { - // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. - return [] - } - - private func handleText (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: textContentType, options: nil) { [weak self] data, error in - - if error == nil, let item = data as? String, let this = self { - - this.sharedText.append(item) - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.sharedText, forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .text) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleUrl (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: urlContentType, options: nil) { [weak self] data, error in - - if error == nil, let item = data as? URL, let this = self { - - this.sharedText.append(item.absoluteString) - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.sharedText, forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .text) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleImages (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: imageContentType, options: nil) { [weak self] data, error in - - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from: url, type: .image) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if(copied) { - this.sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .image)) - } - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .media) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleVideos (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: videoContentType, options: nil) { [weak self] data, error in - - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from: url, type: .video) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if(copied) { - guard let sharedFile = this.getSharedMediaFile(forVideo: newPath) else { - return - } - this.sharedMedia.append(sharedFile) - } - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .media) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleFiles (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: fileURLType, options: nil) { [weak self] data, error in - - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from :url, type: .file) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if (copied) { - this.sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .file)) - } - - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .file) - } - - } else { - self?.dismissWithError() - } - } - } - - private func dismissWithError() { - print("[ERROR] Error loading data!") - let alert = UIAlertController(title: "Error", message: "Error loading data", preferredStyle: .alert) - - let action = UIAlertAction(title: "Error", style: .cancel) { _ in - self.dismiss(animated: true, completion: nil) - } - - alert.addAction(action) - present(alert, animated: true, completion: nil) - extensionContext!.completeRequest(returningItems: [], completionHandler: nil) - } - - private func redirectToHostApp(type: RedirectType) { - let url = URL(string: "ShareMedia://dataUrl=\(sharedKey)#\(type)") - var responder = self as UIResponder? - let selectorOpenURL = sel_registerName("openURL:") - - while (responder != nil) { - if (responder?.responds(to: selectorOpenURL))! { - let _ = responder?.perform(selectorOpenURL, with: url) - } - responder = responder!.next - } - extensionContext!.completeRequest(returningItems: [], completionHandler: nil) - } - - enum RedirectType { - case media - case text - case file - } - - func getExtension(from url: URL, type: SharedMediaType) -> String { - let parts = url.lastPathComponent.components(separatedBy: ".") - var ex: String? = nil - if (parts.count > 1) { - ex = parts.last - } - - if (ex == nil) { - switch type { - case .image: - ex = "PNG" - case .video: - ex = "MP4" - case .file: - ex = "TXT" - } - } - return ex ?? "Unknown" - } - - func getFileName(from url: URL, type: SharedMediaType) -> String { - var name = url.lastPathComponent - - if (name.isEmpty) { - name = UUID().uuidString + "." + getExtension(from: url, type: type) - } - - return name - } - - func copyFile(at srcURL: URL, to dstURL: URL) -> Bool { - do { - if FileManager.default.fileExists(atPath: dstURL.path) { - try FileManager.default.removeItem(at: dstURL) - } - try FileManager.default.copyItem(at: srcURL, to: dstURL) - } catch (let error) { - print("Cannot copy item at \(srcURL) to \(dstURL): \(error)") - return false - } - return true - } - - private func getSharedMediaFile(forVideo: URL) -> SharedMediaFile? { - let asset = AVAsset(url: forVideo) - let duration = (CMTimeGetSeconds(asset.duration) * 1000).rounded() - let thumbnailPath = getThumbnailPath(for: forVideo) - - if FileManager.default.fileExists(atPath: thumbnailPath.path) { - return SharedMediaFile(path: forVideo.absoluteString, thumbnail: thumbnailPath.absoluteString, duration: duration, type: .video) - } - - var saved = false - let assetImgGenerate = AVAssetImageGenerator(asset: asset) - assetImgGenerate.appliesPreferredTrackTransform = true - // let scale = UIScreen.main.scale - assetImgGenerate.maximumSize = CGSize(width: 360, height: 360) - do { - let img = try assetImgGenerate.copyCGImage(at: CMTimeMakeWithSeconds(600, preferredTimescale: Int32(1.0)), actualTime: nil) - try UIImage.pngData(UIImage(cgImage: img))()?.write(to: thumbnailPath) - saved = true - } catch { - saved = false - } - - return saved ? SharedMediaFile(path: forVideo.absoluteString, thumbnail: thumbnailPath.absoluteString, duration: duration, type: .video) : nil - - } - - private func getThumbnailPath(for url: URL) -> URL { - let fileName = Data(url.lastPathComponent.utf8).base64EncodedString().replacingOccurrences(of: "==", with: "") - let path = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(hostAppBundleIdentifier)")! - .appendingPathComponent("\(fileName).jpg") - return path - } - - class SharedMediaFile: Codable { - var path: String; // can be image, video or url path. It can also be text content - var thumbnail: String?; // video thumbnail - var duration: Double?; // video duration in milliseconds - var type: SharedMediaType; - - - init(path: String, thumbnail: String?, duration: Double?, type: SharedMediaType) { - self.path = path - self.thumbnail = thumbnail - self.duration = duration - self.type = type - } - - // Debug method to print out SharedMediaFile details in the console - func toString() { - print("[SharedMediaFile] \n\tpath: \(self.path)\n\tthumbnail: \(self.thumbnail)\n\tduration: \(self.duration)\n\ttype: \(self.type)") - } - } - - enum SharedMediaType: Int, Codable { - case image - case video - case file - } - - func toData(data: [SharedMediaFile]) -> Data { - let encodedData = try? JSONEncoder().encode(data) - return encodedData! - } +// If you get no such module 'receive_sharing_intent' error. +// Go to Build Phases of your Runner target and +// move `Embed Foundation Extension` to the top of `Thin Binary`. +import receive_sharing_intent + +class ShareViewController: RSIShareViewController { + + // Use this method to return false if you don't want to redirect to host app automatically. + // Default is true + override func shouldAutoRedirect() -> Bool { + return false + } + } - -extension Array { - subscript (safe index: UInt) -> Element? { - return Int(index) < count ? self[Int(index)] : nil - } -} \ No newline at end of file diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index f2872cf474..8c6e56146e 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 12.0 diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index e97e9654c8..75fbd4bffe 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -2,8 +2,8 @@ GEM remote: https://rubygems.org/ specs: CFPropertyList (3.0.3) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.1.1) @@ -137,7 +137,7 @@ GEM http-cookie (1.0.4) domain_name (~> 0.5) httpclient (2.8.3) - jmespath (1.4.0) + jmespath (1.6.2) json (2.5.1) jwt (2.2.3) memoist (0.16.2) @@ -149,14 +149,14 @@ GEM naturally (2.2.1) os (1.1.1) plist (3.6.0) - public_suffix (4.0.6) + public_suffix (5.0.3) rake (13.0.3) representable (3.1.1) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.3.9) rouge (2.0.7) ruby2_keywords (0.0.4) rubyzip (2.3.0) @@ -182,7 +182,7 @@ GEM unf_ext unf_ext (0.0.7.7) unicode-display_width (1.7.0) - webrick (1.7.0) + webrick (1.8.2) word_wrap (1.0.0) xcodeproj (1.19.0) CFPropertyList (>= 2.3.3, < 4.0) diff --git a/ios/Podfile b/ios/Podfile index beb55ecd5b..4c88a11417 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '10.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -32,19 +32,35 @@ target 'Runner' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + # From package https://pub.dev/packages/receive_sharing_intent + target 'FluffyChat Share' do + inherit! :search_paths + end end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| + # ensure all dependencies are using SQLCipher instead of SQLite + xcconfig_path = config.base_configuration_reference.real_path + xcconfig = File.read(xcconfig_path) + new_xcconfig = xcconfig.sub(' -l"sqlite3"', '') + File.open(xcconfig_path, "w") { |file| file << new_xcconfig } + config.build_settings['ENABLE_BITCODE'] = 'NO' - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' - # https://github.com/flutter-webrtc/flutter-webrtc/issues/713 - if target.name == "flutter_webrtc" || target.name == "WebRTC-SDK" - config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES' - end + # see https://github.com/flutter-webrtc/flutter-webrtc/issues/1054 + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = 'arm64 i386' + + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + # dart: PermissionGroup.microphone + 'PERMISSION_MICROPHONE=1', + ] end end + flutter_post_install(installer) if defined?(flutter_post_install) end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dfc4598c2a..27e9bef000 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,12 +3,13 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 609046320A2D7D2B0D36583B /* Pods_FluffyChat_Share.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -17,6 +18,7 @@ C1005C45261071B5002F4F32 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1005C44261071B5002F4F32 /* ShareViewController.swift */; }; C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1005C46261071B5002F4F32 /* MainInterface.storyboard */; }; C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C137635E2AD1446100A8F905 /* notification.caf in Resources */ = {isa = PBXBuildFile; fileRef = C137635D2AD1446100A8F905 /* notification.caf */; }; C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C149567B25C7274F00A16396 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ @@ -55,10 +57,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.debug.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.profile.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; @@ -76,9 +80,12 @@ C1005C47261071B5002F4F32 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; C1005C49261071B5002F4F32 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "FluffyChat Share.entitlements"; sourceTree = ""; }; + C137635D2AD1446100A8F905 /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notification.caf; sourceTree = ""; }; C149567B25C7274F00A16396 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; C149567D25C7276200A16396 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FluffyChat_Share.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.release.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -94,6 +101,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 609046320A2D7D2B0D36583B /* Pods_FluffyChat_Share.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -104,6 +112,7 @@ isa = PBXGroup; children = ( 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */, + C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */, ); name = Frameworks; sourceTree = ""; @@ -150,6 +159,7 @@ 97C147021CF9000F007C117D /* Info.plist */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, C149567B25C7274F00A16396 /* GoogleService-Info.plist */, + C137635D2AD1446100A8F905 /* notification.caf */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, @@ -174,6 +184,9 @@ 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */, EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */, 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */, + 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */, + F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */, + 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -190,10 +203,11 @@ 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, + C1005C4D261071B5002F4F32 /* Embed App Extensions */, 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */, - C1005C4D261071B5002F4F32 /* Embed App Extensions */, + 064CBD7CE0D4CD6850C6880A /* [CP] Copy Pods Resources */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ); buildRules = ( ); @@ -209,6 +223,7 @@ isa = PBXNativeTarget; buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */; buildPhases = ( + 67579C1EA0B5C7B918473158 /* [CP] Check Pods Manifest.lock */, C1005C3E261071B5002F4F32 /* Sources */, C1005C3F261071B5002F4F32 /* Frameworks */, C1005C40261071B5002F4F32 /* Resources */, @@ -229,7 +244,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1240; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -268,6 +283,7 @@ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */, + C137635E2AD1446100A8F905 /* notification.caf in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -284,19 +300,60 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 064CBD7CE0D4CD6850C6880A /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; + }; + 67579C1EA0B5C7B918473158 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FluffyChat Share-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -322,6 +379,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -332,7 +390,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -450,7 +508,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -539,7 +597,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -588,7 +646,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -668,6 +726,7 @@ }; C1005C4E261071B5002F4F32 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -702,6 +761,7 @@ }; C1005C4F261071B5002F4F32 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -733,6 +793,7 @@ }; C1005C50261071B5002F4F32 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3db53b6e1f..e67b2808af 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ im.fluffychat.app.uris CFBundleURLSchemes - ShareMedia + ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) im.fluffychat matrix @@ -63,6 +63,8 @@ Share your location with your contacts in FluffyChat. NSLocationWhenInUseUsageDescription Share your location with your contacts in FluffyChat. + NSLocationAlwaysAndWhenInUseUsageDescription + Share your location with your contacts in FluffyChat. NSMicrophoneUsageDescription Record voice message and share them with your contacts on FluffyChat. NSMotionUsageDescription @@ -108,5 +110,7 @@ CADisableMinimumFrameDurationOnPhone + UIApplicationSupportsIndirectInputEvents + diff --git a/ios/Runner/notification.caf b/ios/Runner/notification.caf new file mode 100644 index 0000000000..20fa944a4b Binary files /dev/null and b/ios/Runner/notification.caf differ diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile index 5401ca9f72..86dcebf86a 100644 --- a/ios/fastlane/Appfile +++ b/ios/fastlane/Appfile @@ -1,5 +1,5 @@ app_identifier("im.fluffychat.app") # The bundle identifier of your app -apple_id("christian.pauly@wtal.de") # Your Apple email address +apple_id("christian-kussowski@posteo.de") # Your Apple email address itc_team_id("122628977") # App Store Connect Team ID team_id("4NXF6Z997G") # Developer Portal Team ID diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index c2bac8f3e0..6078ad5dd7 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -27,7 +27,11 @@ platform :ios do version_name = config.match(re).captures[0] increment_version_number(version_number: version_name) build_app(workspace: "Runner.xcworkspace", scheme: "Runner") - upload_to_testflight(distribute_external: true, groups: "FluffyChat Betatest") + upload_to_testflight( + distribute_external: true, + groups: "FluffyChat Betatest", + changelog: "This is a release candidate for FluffyChat. Please test if the app is overall in a good condition before we push this to production.", + ) end end diff --git a/l10n.yaml b/l10n.yaml index a714613ee0..95a4c4eac3 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -3,3 +3,5 @@ template-arb-file: intl_en.arb output-localization-file: l10n.dart output-class: L10n preferred-supported-locales: ["en"] +use-deferred-loading: true +nullable-getter: false \ No newline at end of file diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index de99da9b4b..ae0097edf8 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -9,38 +9,51 @@ abstract class AppConfig { static String? get applicationWelcomeMessage => _applicationWelcomeMessage; static String _defaultHomeserver = 'matrix.org'; static String get defaultHomeserver => _defaultHomeserver; - static double bubbleSizeFactor = 1; static double fontSizeFactor = 1; static const Color chatColor = primaryColor; static Color? colorSchemeSeed = primaryColor; - static const double messageFontSize = 15.75; + static const double messageFontSize = 16.0; static const bool allowOtherHomeservers = true; static const bool enableRegistration = true; static const Color primaryColor = Color(0xFF5625BA); static const Color primaryColorLight = Color(0xFFCCBDEA); static const Color secondaryColor = Color(0xFF41a2bc); static String _privacyUrl = - 'https://gitlab.com/famedly/fluffychat/-/blob/main/PRIVACY.md'; + 'https://github.com/krille-chan/fluffychat/blob/main/PRIVACY.md'; static String get privacyUrl => _privacyUrl; + static const String website = 'https://fluffychat.im'; static const String enablePushTutorial = - 'https://www.reddit.com/r/fluffychat/comments/qn6liu/enable_push_notifications_without_google_services/'; + 'https://github.com/krille-chan/fluffychat/wiki/Push-Notifications-without-Google-Services'; + static const String encryptionTutorial = + 'https://github.com/krille-chan/fluffychat/wiki/How-to-use-end-to-end-encryption-in-FluffyChat'; + static const String startChatTutorial = + 'https://github.com/krille-chan/fluffychat/wiki/How-to-Find-Users-in-FluffyChat'; static const String appId = 'im.fluffychat.FluffyChat'; static const String appOpenUrlScheme = 'im.fluffychat'; static String _webBaseUrl = 'https://fluffychat.im/web'; static String get webBaseUrl => _webBaseUrl; - static const String sourceCodeUrl = 'https://gitlab.com/famedly/fluffychat'; + static const String sourceCodeUrl = + 'https://github.com/krille-chan/fluffychat'; static const String supportUrl = - 'https://gitlab.com/famedly/fluffychat/issues'; - static const bool enableSentry = true; - static const String sentryDns = - 'https://8591d0d863b646feb4f3dda7e5dcab38@o256755.ingest.sentry.io/5243143'; + 'https://github.com/krille-chan/fluffychat/issues'; + static const String changelogUrl = + 'https://github.com/krille-chan/fluffychat/blob/main/CHANGELOG.md'; + static final Uri newIssueUrl = Uri( + scheme: 'https', + host: 'github.com', + path: '/krille-chan/fluffychat/issues/new', + ); static bool renderHtml = true; static bool hideRedactedEvents = false; static bool hideUnknownEvents = true; - static bool showDirectChatsInSpaces = true; + static bool hideUnimportantStateEvents = true; static bool separateChatTypes = false; static bool autoplayImages = true; - static bool sendOnEnter = false; + static bool sendTypingNotifications = true; + static bool sendPublicReadReceipts = true; + static bool swipeRightToLeftToReply = true; + static bool? sendOnEnter; + static bool showPresences = true; static bool experimentalVoip = false; static const bool hideTypingUsernames = false; static const bool hideAllStateEvents = false; @@ -48,9 +61,6 @@ abstract class AppConfig { static const String deepLinkPrefix = 'im.fluffychat://chat/'; static const String schemePrefix = 'matrix:'; static const String pushNotificationsChannelId = 'fluffychat_push'; - static const String pushNotificationsChannelName = 'FluffyChat push channel'; - static const String pushNotificationsChannelDescription = - 'Push notifications for FluffyChat'; static const String pushNotificationsAppId = 'chat.fluffy.fluffychat'; static const String pushNotificationsGatewayUrl = 'https://push.fluffychat.im/_matrix/push/v1/notify'; @@ -58,8 +68,13 @@ abstract class AppConfig { static const String emojiFontName = 'Noto Emoji'; static const String emojiFontUrl = 'https://github.com/googlefonts/noto-emoji/'; - static const double borderRadius = 16.0; + static const double borderRadius = 18.0; static const double columnWidth = 360.0; + static final Uri homeserverList = Uri( + scheme: 'https', + host: 'servers.joinmatrix.org', + path: 'servers.json', + ); static void loadFromJson(Map json) { if (json['chat_color'] != null) { @@ -67,8 +82,9 @@ abstract class AppConfig { colorSchemeSeed = Color(json['chat_color']); } catch (e) { Logs().w( - 'Invalid color in config.json! Please make sure to define the color in this format: "0xffdd0000"', - e); + 'Invalid color in config.json! Please make sure to define the color in this format: "0xffdd0000"', + e, + ); } } if (json['application_name'] is String) { @@ -81,10 +97,10 @@ abstract class AppConfig { _defaultHomeserver = json['default_homeserver']; } if (json['privacy_url'] is String) { - _webBaseUrl = json['privacy_url']; + _privacyUrl = json['privacy_url']; } if (json['web_base_url'] is String) { - _privacyUrl = json['web_base_url']; + _webBaseUrl = json['web_base_url']; } if (json['render_html'] is bool) { renderHtml = json['render_html']; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 6eb061a674..491865f7c5 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,397 +1,480 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; -import 'package:fluffychat/pages/add_story/add_story.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/archive/archive.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/chat_members/chat_members.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; -import 'package:fluffychat/pages/connect/connect_page.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; import 'package:fluffychat/pages/device_settings/device_settings.dart'; import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; import 'package:fluffychat/pages/login/login.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat.dart'; -import 'package:fluffychat/pages/new_space/new_space.dart'; import 'package:fluffychat/pages/settings/settings.dart'; import 'package:fluffychat/pages/settings_3pid/settings_3pid.dart'; -import 'package:fluffychat/pages/settings_account/settings_account.dart'; import 'package:fluffychat/pages/settings_chat/settings_chat.dart'; import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; +import 'package:fluffychat/pages/settings_homeserver/settings_homeserver.dart'; import 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list.dart'; import 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes.dart'; import 'package:fluffychat/pages/settings_notifications/settings_notifications.dart'; +import 'package:fluffychat/pages/settings_password/settings_password.dart'; import 'package:fluffychat/pages/settings_security/settings_security.dart'; -import 'package:fluffychat/pages/settings_stories/settings_stories.dart'; import 'package:fluffychat/pages/settings_style/settings_style.dart'; -import 'package:fluffychat/pages/sign_up/signup.dart'; -import 'package:fluffychat/pages/story/story_page.dart'; import 'package:fluffychat/widgets/layouts/empty_page.dart'; -import 'package:fluffychat/widgets/layouts/loading_view.dart'; -import 'package:fluffychat/widgets/layouts/side_view_layout.dart'; import 'package:fluffychat/widgets/layouts/two_column_layout.dart'; import 'package:fluffychat/widgets/log_view.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; -class AppRoutes { - final bool columnMode; +abstract class AppRoutes { + static FutureOr loggedInRedirect( + BuildContext context, + GoRouterState state, + ) => + Matrix.of(context).client.isLogged() ? '/rooms' : null; - AppRoutes(this.columnMode); + static FutureOr loggedOutRedirect( + BuildContext context, + GoRouterState state, + ) => + Matrix.of(context).client.isLogged() ? null : '/home'; - List get routes => [ - ..._homeRoutes, - if (columnMode) ..._tabletRoutes, - if (!columnMode) ..._mobileRoutes, - ]; + AppRoutes(); - List get _mobileRoutes => [ - VWidget( + static final List routes = [ + GoRoute( + path: '/', + redirect: (context, state) => + Matrix.of(context).client.isLogged() ? '/rooms' : '/home', + ), + GoRoute( + path: '/home', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const HomeserverPicker(addMultiAccount: false), + ), + redirect: loggedInRedirect, + routes: [ + GoRoute( + path: 'login', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Login(), + ), + redirect: loggedInRedirect, + ), + ], + ), + GoRoute( + path: '/logs', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const LogViewer(), + ), + ), + ShellRoute( + pageBuilder: (context, state, child) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) && + state.fullPath?.startsWith('/rooms/settings') == false + ? TwoColumnLayout( + displayNavigationRail: + state.path?.startsWith('/rooms/settings') != true, + mainView: ChatList( + activeChat: state.pathParameters['roomid'], + displayNavigationRail: + state.path?.startsWith('/rooms/settings') != true, + ), + sideView: child, + ) + : child, + ), + routes: [ + GoRoute( path: '/rooms', - widget: const ChatList(), - stackedRoutes: [ - VWidget( - path: '/stories/create', - widget: const AddStoryPage(), - ), - VWidget( - path: '/stories/:roomid', - widget: const StoryPage(), - stackedRoutes: [ - VWidget( - path: 'share', - widget: const AddStoryPage(), + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? const EmptyPage() + : ChatList( + activeChat: state.pathParameters['roomid'], + ), + ), + routes: [ + GoRoute( + path: 'archive', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Archive(), + ), + routes: [ + GoRoute( + path: ':roomid', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatPage( + roomId: state.pathParameters['roomid']!, + eventId: state.uri.queryParameters['event'], + ), + ), + redirect: loggedOutRedirect, ), ], + redirect: loggedOutRedirect, ), - VWidget( - path: '/spaces/:roomid', - widget: const ChatDetails(), - stackedRoutes: _chatDetailsRoutes, - ), - VWidget(path: ':roomid', widget: const Chat(), stackedRoutes: [ - VWidget( - path: 'encryption', - widget: const ChatEncryptionSettings(), + GoRoute( + path: 'newprivatechat', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const NewPrivateChat(), ), - VWidget( - path: 'invite', - widget: const InvitationSelection(), - ), - VWidget( - path: 'details', - widget: const ChatDetails(), - stackedRoutes: _chatDetailsRoutes, - ), - ]), - VWidget( - path: '/settings', - widget: const Settings(), - stackedRoutes: _settingsRoutes, - ), - VWidget( - path: '/archive', - widget: const Archive(), - ), - VWidget( - path: '/newprivatechat', - widget: const NewPrivateChat(), + redirect: loggedOutRedirect, ), - VWidget( - path: '/newgroup', - widget: const NewGroup(), + GoRoute( + path: 'newgroup', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const NewGroup(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: '/newspace', - widget: const NewSpace(), + GoRoute( + path: 'newspace', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const NewGroup(createGroupType: CreateGroupType.space), + ), + redirect: loggedOutRedirect, ), - ], - ), - ]; - List get _tabletRoutes => [ - VNester( - path: '/rooms', - widgetBuilder: (child) => TwoColumnLayout( - mainView: const ChatList(), - sideView: child, - ), - buildTransition: _fadeTransition, - nestedRoutes: [ - VWidget( - path: '', - widget: const EmptyPage(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: '/stories/create', - buildTransition: _fadeTransition, - widget: const AddStoryPage(), - ), - VWidget( - path: '/stories/:roomid', - buildTransition: _fadeTransition, - widget: const StoryPage(), - stackedRoutes: [ - VWidget( - path: 'share', - widget: const AddStoryPage(), - ), - ], - ), - VWidget( - path: '/spaces/:roomid', - widget: const ChatDetails(), - buildTransition: _fadeTransition, - stackedRoutes: _chatDetailsRoutes, - ), - VWidget( - path: '/newprivatechat', - widget: const NewPrivateChat(), - buildTransition: _fadeTransition, - ), - VWidget( - path: '/newgroup', - widget: const NewGroup(), - buildTransition: _fadeTransition, - ), - VWidget( - path: '/newspace', - widget: const NewSpace(), - buildTransition: _fadeTransition, - ), - VNester( - path: ':roomid', - widgetBuilder: (child) => SideViewLayout( - mainView: const Chat(), - sideView: child, + ShellRoute( + pageBuilder: (context, state, child) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? TwoColumnLayout( + mainView: const Settings(), + sideView: child, + displayNavigationRail: false, + ) + : child, + ), + routes: [ + GoRoute( + path: 'settings', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? const EmptyPage() + : const Settings(), ), - buildTransition: _fadeTransition, - nestedRoutes: [ - VWidget( - path: '', - widget: const Chat(), - buildTransition: _fadeTransition, + routes: [ + GoRoute( + path: 'notifications', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsNotifications(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: 'encryption', - widget: const ChatEncryptionSettings(), - buildTransition: _fadeTransition, + GoRoute( + path: 'style', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsStyle(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: 'details', - widget: const ChatDetails(), - buildTransition: _fadeTransition, - stackedRoutes: _chatDetailsRoutes, + GoRoute( + path: 'devices', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const DevicesSettings(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: 'invite', - widget: const InvitationSelection(), - buildTransition: _fadeTransition, + GoRoute( + path: 'chat', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsChat(), + ), + routes: [ + GoRoute( + path: 'emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const EmotesSettings(), + ), + ), + ], + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'addaccount', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const HomeserverPicker(addMultiAccount: true), + ), + routes: [ + GoRoute( + path: 'login', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Login(), + ), + redirect: loggedOutRedirect, + ), + ], + ), + GoRoute( + path: 'homeserver', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + const SettingsHomeserver(), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'security', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsSecurity(), + ), + routes: [ + GoRoute( + path: 'password', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + const SettingsPassword(), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'ignorelist', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + SettingsIgnoreList( + initialUserId: state.extra?.toString(), + ), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: '3pid', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Settings3Pid(), + ), + redirect: loggedOutRedirect, + ), + ], ), ], + redirect: loggedOutRedirect, ), ], ), - ], - ), - VWidget( - path: '/rooms', - widget: const TwoColumnLayout( - mainView: ChatList(), - sideView: EmptyPage(), - ), - buildTransition: _fadeTransition, - stackedRoutes: [ - VNester( - path: '/settings', - widgetBuilder: (child) => TwoColumnLayout( - mainView: const Settings(), - sideView: child, - ), - buildTransition: _dynamicTransition, - nestedRoutes: [ - VWidget( - path: '', - widget: const EmptyPage(), - buildTransition: _dynamicTransition, - stackedRoutes: _settingsRoutes, + GoRoute( + path: ':roomid', + pageBuilder: (context, state) { + final body = state.uri.queryParameters['body']; + var shareItems = state.extra is List + ? state.extra as List + : null; + if (body != null && body.isNotEmpty) { + shareItems ??= []; + shareItems.add(TextShareItem(body)); + } + return defaultPageBuilder( + context, + state, + ChatPage( + roomId: state.pathParameters['roomid']!, + shareItems: shareItems, + eventId: state.uri.queryParameters['event'], + ), + ); + }, + redirect: loggedOutRedirect, + routes: [ + GoRoute( + path: 'search', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatSearchPage( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, ), - ], - ), - VWidget( - path: '/archive', - widget: const TwoColumnLayout( - mainView: Archive(), - sideView: EmptyPage(), - ), - buildTransition: _fadeTransition, - ), - ], - ), - ]; - - List get _homeRoutes => [ - VWidget(path: '/', widget: const LoadingView()), - VWidget( - path: '/home', - widget: const HomeserverPicker(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, - ), - VWidget( - path: 'connect', - widget: const ConnectPage(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, + GoRoute( + path: 'encryption', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ChatEncryptionSettings(), ), - VWidget( - path: 'signup', - widget: const SignupPage(), - buildTransition: _fadeTransition, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'invite', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + InvitationSelection( + roomId: state.pathParameters['roomid']!, + ), ), - ]), - VWidget( - path: 'logs', - widget: const LogViewer(), - buildTransition: _dynamicTransition, - ), - ], - ), - ]; - - List get _chatDetailsRoutes => [ - VWidget( - path: 'permissions', - widget: const ChatPermissionsSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'invite', - widget: const InvitationSelection(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'multiple_emotes', - widget: const MultipleEmotesSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'emotes', - widget: const EmotesSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'emotes/:state_key', - widget: const EmotesSettings(), - buildTransition: _dynamicTransition, - ), - ]; - - List get _settingsRoutes => [ - VWidget( - path: 'notifications', - widget: const SettingsNotifications(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'style', - widget: const SettingsStyle(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'devices', - widget: const DevicesSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'chat', - widget: const SettingsChat(), - buildTransition: _dynamicTransition, - stackedRoutes: [ - VWidget( - path: 'emotes', - widget: const EmotesSettings(), - buildTransition: _dynamicTransition, - ), - ], - ), - VWidget( - path: 'account', - widget: const SettingsAccount(), - buildTransition: _dynamicTransition, - stackedRoutes: [ - VWidget( - path: 'add', - widget: const HomeserverPicker(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, + redirect: loggedOutRedirect, ), - VWidget( - path: 'connect', - widget: const ConnectPage(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, + GoRoute( + path: 'details', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatDetails( + roomId: state.pathParameters['roomid']!, + ), + ), + routes: [ + GoRoute( + path: 'access', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatAccessSettings( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'members', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatMembersPage( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'permissions', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ChatPermissionsSettings(), ), - VWidget( - path: 'signup', - widget: const SignupPage(), - buildTransition: _fadeTransition, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'invite', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + InvitationSelection( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'multiple_emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const MultipleEmotesSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const EmotesSettings(), ), - ]), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'emotes/:state_key', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const EmotesSettings(), + ), + redirect: loggedOutRedirect, + ), + ], + redirect: loggedOutRedirect, + ), ], ), ], ), - VWidget( - path: 'security', - widget: const SettingsSecurity(), - buildTransition: _dynamicTransition, - stackedRoutes: [ - VWidget( - path: 'stories', - widget: const SettingsStories(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'ignorelist', - widget: const SettingsIgnoreList(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: '3pid', - widget: const Settings3Pid(), - buildTransition: _dynamicTransition, - ), - ], - ), - VWidget( - path: 'logs', - widget: const LogViewer(), - buildTransition: _dynamicTransition, - ), - ]; - - FadeTransition Function(dynamic, dynamic, dynamic)? get _dynamicTransition => - columnMode ? _fadeTransition : null; + ], + ), + ]; - FadeTransition _fadeTransition(animation1, _, child) => - FadeTransition(opacity: animation1, child: child); + static Page defaultPageBuilder( + BuildContext context, + GoRouterState state, + Widget child, + ) => + FluffyThemes.isColumnMode(context) + ? NoTransitionPage( + key: state.pageKey, + restorationId: state.pageKey.value, + child: child, + ) + : MaterialPage( + key: state.pageKey, + restorationId: state.pageKey.value, + child: child, + ); } diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 94f4ab07e9..7c0e50df81 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -1,18 +1,15 @@ abstract class SettingKeys { - static const String wallpaper = 'chat.fluffy.wallpaper'; static const String renderHtml = 'chat.fluffy.renderHtml'; static const String hideRedactedEvents = 'chat.fluffy.hideRedactedEvents'; static const String hideUnknownEvents = 'chat.fluffy.hideUnknownEvents'; - static const String showDirectChatsInSpaces = - 'chat.fluffy.showDirectChatsInSpaces'; + static const String hideUnimportantStateEvents = + 'chat.fluffy.hideUnimportantStateEvents'; static const String separateChatTypes = 'chat.fluffy.separateChatTypes'; - static const String chatColor = 'chat.fluffy.chat_color'; static const String sentry = 'sentry'; static const String theme = 'theme'; static const String amoledEnabled = 'amoled_enabled'; static const String codeLanguage = 'code_language'; static const String showNoGoogle = 'chat.fluffy.show_no_google'; - static const String bubbleSizeFactor = 'chat.fluffy.bubble_size_factor'; static const String fontSizeFactor = 'chat.fluffy.font_size_factor'; static const String showNoPid = 'chat.fluffy.show_no_pid'; static const String databasePassword = 'database-password'; @@ -20,11 +17,21 @@ abstract class SettingKeys { static const String unifiedPushRegistered = 'chat.fluffy.unifiedpush.registered'; static const String unifiedPushEndpoint = 'chat.fluffy.unifiedpush.endpoint'; - static const String notificationCurrentIds = 'chat.fluffy.notification_ids'; static const String ownStatusMessage = 'chat.fluffy.status_msg'; static const String dontAskForBootstrapKey = 'chat.fluffychat.dont_ask_bootstrap'; static const String autoplayImages = 'chat.fluffy.autoplay_images'; + static const String sendTypingNotifications = + 'chat.fluffy.send_typing_notifications'; + static const String sendPublicReadReceipts = + 'chat.fluffy.send_public_read_receipts'; static const String sendOnEnter = 'chat.fluffy.send_on_enter'; + static const String swipeRightToLeftToReply = + 'chat.fluffy.swipeRightToLeftToReply'; static const String experimentalVoip = 'chat.fluffy.experimental_voip'; + static const String showPresences = 'chat.fluffy.show_presences'; + static const String displayChatDetailsColumn = + 'chat.fluffy.display_chat_details_column'; + static const String noEncryptionWarningShown = + 'chat.fluffy.no_encryption_warning_shown'; } diff --git a/lib/config/themes.dart b/lib/config/themes.dart index 9ca9f686b2..abb45c2f55 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -6,8 +6,17 @@ import 'app_config.dart'; abstract class FluffyThemes { static const double columnWidth = 360.0; + + static const double navRailWidth = 64.0; + + static bool isColumnModeByWidth(double width) => + width > columnWidth * 2 + navRailWidth; + static bool isColumnMode(BuildContext context) => - MediaQuery.of(context).size.width > columnWidth * 2; + isColumnModeByWidth(MediaQuery.of(context).size.width); + + static bool isThreeColumnMode(BuildContext context) => + MediaQuery.of(context).size.width > FluffyThemes.columnWidth * 3.5; static const fallbackTextStyle = TextStyle( fontFamily: 'Roboto', @@ -15,104 +24,122 @@ abstract class FluffyThemes { ); static var fallbackTextTheme = const TextTheme( - bodyText1: fallbackTextStyle, - bodyText2: fallbackTextStyle, - button: fallbackTextStyle, - caption: fallbackTextStyle, - overline: fallbackTextStyle, - headline1: fallbackTextStyle, - headline2: fallbackTextStyle, - headline3: fallbackTextStyle, - headline4: fallbackTextStyle, - headline5: fallbackTextStyle, - headline6: fallbackTextStyle, - subtitle1: fallbackTextStyle, - subtitle2: fallbackTextStyle, + bodyLarge: fallbackTextStyle, + bodyMedium: fallbackTextStyle, + labelLarge: fallbackTextStyle, + bodySmall: fallbackTextStyle, + labelSmall: fallbackTextStyle, + displayLarge: fallbackTextStyle, + displayMedium: fallbackTextStyle, + displaySmall: fallbackTextStyle, + headlineMedium: fallbackTextStyle, + headlineSmall: fallbackTextStyle, + titleLarge: fallbackTextStyle, + titleMedium: fallbackTextStyle, + titleSmall: fallbackTextStyle, ); - static ThemeData light([ColorScheme? colorScheme]) => ThemeData( - visualDensity: VisualDensity.standard, - useMaterial3: true, - brightness: Brightness.light, - colorSchemeSeed: AppConfig.colorSchemeSeed ?? - colorScheme?.primary ?? - AppConfig.chatColor, - textTheme: PlatformInfos.isDesktop - ? Typography.material2018().black.merge(fallbackTextTheme) - : null, - snackBarTheme: const SnackBarThemeData( - behavior: SnackBarBehavior.floating, - ), - pageTransitionsTheme: const PageTransitionsTheme( - builders: { - TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(), - TargetPlatform.android: ZoomPageTransitionsBuilder(), - TargetPlatform.linux: CupertinoPageTransitionsBuilder(), - TargetPlatform.macOS: CupertinoPageTransitionsBuilder(), - TargetPlatform.windows: CupertinoPageTransitionsBuilder(), - TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), - }, - ), - dividerColor: Colors.blueGrey.shade50, - inputDecorationTheme: const InputDecorationTheme( - border: UnderlineInputBorder(borderSide: BorderSide(width: 1)), - filled: true, + static LinearGradient backgroundGradient( + BuildContext context, + int alpha, + ) { + final colorScheme = Theme.of(context).colorScheme; + return LinearGradient( + begin: Alignment.topCenter, + colors: [ + colorScheme.primaryContainer.withAlpha(alpha), + colorScheme.secondaryContainer.withAlpha(alpha), + colorScheme.tertiaryContainer.withAlpha(alpha), + colorScheme.primaryContainer.withAlpha(alpha), + ], + ); + } + + static const Duration animationDuration = Duration(milliseconds: 250); + static const Curve animationCurve = Curves.easeInOut; + + static ThemeData buildTheme( + BuildContext context, + Brightness brightness, [ + Color? seed, + ]) { + final colorScheme = ColorScheme.fromSeed( + brightness: brightness, + seedColor: seed ?? AppConfig.colorSchemeSeed ?? AppConfig.primaryColor, + ); + return ThemeData( + visualDensity: VisualDensity.standard, + useMaterial3: true, + brightness: brightness, + colorScheme: colorScheme, + textTheme: PlatformInfos.isDesktop + ? brightness == Brightness.light + ? Typography.material2018().black.merge(fallbackTextTheme) + : Typography.material2018().white.merge(fallbackTextTheme) + : null, + dividerColor: colorScheme.surfaceContainer, + popupMenuTheme: PopupMenuThemeData( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), ), - appBarTheme: const AppBarTheme( - systemOverlayStyle: SystemUiOverlayStyle.dark, + ), + textSelectionTheme: TextSelectionThemeData( + selectionColor: colorScheme.onSurface.withAlpha(128), + selectionHandleColor: colorScheme.secondary, + ), + inputDecorationTheme: InputDecorationTheme( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), ), - ); - - static ThemeData dark([ColorScheme? colorScheme]) => ThemeData( - visualDensity: VisualDensity.standard, - useMaterial3: true, - brightness: Brightness.dark, - colorSchemeSeed: AppConfig.colorSchemeSeed ?? - colorScheme?.primary ?? - AppConfig.chatColor, - textTheme: PlatformInfos.isDesktop - ? Typography.material2018().white.merge(fallbackTextTheme) + contentPadding: const EdgeInsets.all(12), + filled: false, + ), + appBarTheme: AppBarTheme( + toolbarHeight: FluffyThemes.isColumnMode(context) ? 72 : 56, + shadowColor: FluffyThemes.isColumnMode(context) + ? colorScheme.surfaceContainer.withAlpha(128) : null, - snackBarTheme: - const SnackBarThemeData(behavior: SnackBarBehavior.floating), - pageTransitionsTheme: const PageTransitionsTheme( - builders: { - TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(), - TargetPlatform.android: ZoomPageTransitionsBuilder(), - TargetPlatform.linux: CupertinoPageTransitionsBuilder(), - TargetPlatform.macOS: CupertinoPageTransitionsBuilder(), - TargetPlatform.windows: CupertinoPageTransitionsBuilder(), - TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), - }, + surfaceTintColor: + FluffyThemes.isColumnMode(context) ? colorScheme.surface : null, + backgroundColor: + FluffyThemes.isColumnMode(context) ? colorScheme.surface : null, + systemOverlayStyle: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: brightness.reversed, + statusBarBrightness: brightness, + systemNavigationBarIconBrightness: brightness.reversed, + systemNavigationBarColor: colorScheme.surface, ), - inputDecorationTheme: const InputDecorationTheme( - border: UnderlineInputBorder(borderSide: BorderSide(width: 1)), - filled: true, + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + side: BorderSide( + width: 1, + color: colorScheme.primary, + ), + shape: RoundedRectangleBorder( + side: BorderSide(color: colorScheme.primary), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), ), - dividerColor: Colors.blueGrey.shade900, - ); - - static Color blackWhiteColor(BuildContext context) => - Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.black; - - static Color darken(Color color, [double amount = .1]) { - assert(amount >= 0 && amount <= 1); - - final hsl = HSLColor.fromColor(color); - final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0)); - - return hslDark.toColor(); + ), + snackBarTheme: const SnackBarThemeData( + behavior: SnackBarBehavior.floating, + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.secondaryContainer, + foregroundColor: colorScheme.onSecondaryContainer, + elevation: 0, + padding: const EdgeInsets.all(16), + textStyle: const TextStyle(fontSize: 16), + ), + ), + ); } +} - static Color lighten(Color color, [double amount = .1]) { - assert(amount >= 0 && amount <= 1); - - final hsl = HSLColor.fromColor(color); - final hslLight = - hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0)); - - return hslLight.toColor(); - } +extension on Brightness { + Brightness get reversed => + this == Brightness.dark ? Brightness.light : Brightness.dark; } diff --git a/lib/main.dart b/lib/main.dart index 7a0d60f994..d9ac10b4c3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,170 +1,105 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:dynamic_color/dynamic_color.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:matrix/matrix.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:vrouter/vrouter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; -import 'package:fluffychat/config/routes.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; -import 'config/app_config.dart'; -import 'config/themes.dart'; +import 'package:fluffychat/widgets/error_widget.dart'; +import 'config/setting_keys.dart'; import 'utils/background_push.dart'; -import 'utils/custom_scroll_behaviour.dart'; -import 'utils/localized_exception_extension.dart'; -import 'utils/platform_infos.dart'; -import 'widgets/lock_screen.dart'; -import 'widgets/matrix.dart'; +import 'widgets/fluffy_chat_app.dart'; void main() async { + Logs().i('Welcome to ${AppConfig.applicationName} <3'); + // Our background push shared isolate accesses flutter-internal things very early in the startup proccess // To make sure that the parts of flutter needed are started up already, we need to ensure that the // widget bindings are initialized already. WidgetsFlutterBinding.ensureInitialized(); - FlutterError.onError = - (FlutterErrorDetails details) => Zone.current.handleUncaughtError( - details.exception, - details.stack ?? StackTrace.current, - ); - final clients = await ClientManager.getClients(); - Logs().level = kReleaseMode ? Level.warning : Level.verbose; + Logs().nativeColors = !PlatformInfos.isIOS; + final store = await SharedPreferences.getInstance(); + final clients = await ClientManager.getClients(store: store); - if (PlatformInfos.isMobile) { - BackgroundPush.clientOnly(clients.first); - } + // If the app starts in detached mode, we assume that it is in + // background fetch mode for processing push notifications. This is + // currently only supported on Android. + if (PlatformInfos.isAndroid && + AppLifecycleState.detached == WidgetsBinding.instance.lifecycleState) { + // Do not send online presences when app is in background fetch mode. + for (final client in clients) { + client.backgroundSync = false; + client.syncPresence = PresenceType.offline; + } - final queryParameters = {}; - if (kIsWeb) { - queryParameters - .addAll(Uri.parse(html.window.location.href).queryParameters); + // In the background fetch mode we do not want to waste ressources with + // starting the Flutter engine but process incoming push notifications. + BackgroundPush.clientOnly(clients.first); + // To start the flutter engine afterwards we add an custom observer. + WidgetsBinding.instance.addObserver(AppStarter(clients, store)); + Logs().i( + '${AppConfig.applicationName} started in background-fetch mode. No GUI will be created unless the app is no longer detached.', + ); + return; } - runZonedGuarded( - () => runApp(PlatformInfos.isMobile - ? AppLock( - builder: (args) => FluffyChatApp( - clients: clients, - queryParameters: queryParameters, - ), - lockScreen: const LockScreen(), - enabled: false, - ) - : FluffyChatApp(clients: clients, queryParameters: queryParameters)), - SentryController.captureException, + // Started in foreground mode. + Logs().i( + '${AppConfig.applicationName} started in foreground mode. Rendering GUI...', ); + await startGui(clients, store); } -class FluffyChatApp extends StatefulWidget { - final Widget? testWidget; - final List clients; - final Map? queryParameters; - - const FluffyChatApp({ - Key? key, - this.testWidget, - required this.clients, - this.queryParameters, - }) : super(key: key); +/// Fetch the pincode for the applock and start the flutter engine. +Future startGui(List clients, SharedPreferences store) async { + // Fetch the pin for the applock if existing for mobile applications. + String? pin; + if (PlatformInfos.isMobile) { + try { + pin = + await const FlutterSecureStorage().read(key: SettingKeys.appLockKey); + } catch (e, s) { + Logs().d('Unable to read PIN from Secure storage', e, s); + } + } - /// getInitialLink may rereturn the value multiple times if this view is - /// opened multiple times for example if the user logs out after they logged - /// in with qr code or magic link. - static bool gotInitialLink = false; + // Preload first client + final firstClient = clients.firstOrNull; + await firstClient?.roomsLoading; + await firstClient?.accountDataLoading; - @override - _FluffyChatAppState createState() => _FluffyChatAppState(); + ErrorWidget.builder = (details) => FluffyChatErrorWidget(details); + runApp(FluffyChatApp(clients: clients, pincode: pin, store: store)); } -class _FluffyChatAppState extends State { - GlobalKey? _router; - bool? columnMode; - String? _initialUrl; +/// Watches the lifecycle changes to start the application when it +/// is no longer detached. +class AppStarter with WidgetsBindingObserver { + final List clients; + final SharedPreferences store; + bool guiStarted = false; - @override - void initState() { - super.initState(); - _initialUrl = - widget.clients.any((client) => client.isLogged()) ? '/rooms' : '/home'; - } + AppStarter(this.clients, this.store); @override - Widget build(BuildContext context) { - return DynamicColorBuilder( - builder: (lightColorScheme, darkColorScheme) => AdaptiveTheme( - light: FluffyThemes.light(lightColorScheme), - dark: FluffyThemes.dark(darkColorScheme), - initial: AdaptiveThemeMode.system, - builder: (theme, darkTheme) => LayoutBuilder( - builder: (context, constraints) { - const maxColumns = 3; - var newColumns = - (constraints.maxWidth / FluffyThemes.columnWidth).floor(); - if (newColumns > maxColumns) newColumns = maxColumns; - columnMode ??= newColumns > 1; - _router ??= GlobalKey(); - if (columnMode != newColumns > 1) { - Logs().v('Set Column Mode = $columnMode'); - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - _initialUrl = _router?.currentState?.url; - columnMode = newColumns > 1; - _router = GlobalKey(); - }); - }); - } - return VRouter( - key: _router, - title: AppConfig.applicationName, - theme: theme, - scrollBehavior: CustomScrollBehavior(), - logs: kReleaseMode ? VLogs.none : VLogs.info, - darkTheme: darkTheme, - localizationsDelegates: const [ - ...L10n.localizationsDelegates, - ], - supportedLocales: L10n.supportedLocales, - initialUrl: _initialUrl ?? '/', - routes: AppRoutes(columnMode ?? false).routes, - builder: (context, child) { - LoadingDialog.defaultTitle = - L10n.of(context)!.loadingPleaseWait; - LoadingDialog.defaultBackLabel = L10n.of(context)!.close; - LoadingDialog.defaultOnError = - (e) => (e as Object?)!.toLocalizedString(context); - WidgetsBinding.instance.addPostFrameCallback((_) { - SystemChrome.setSystemUIOverlayStyle( - SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - systemNavigationBarColor: - Theme.of(context).appBarTheme.backgroundColor, - systemNavigationBarIconBrightness: - Theme.of(context).brightness == Brightness.light - ? Brightness.dark - : Brightness.light, - ), - ); - }); - return Matrix( - context: context, - router: _router, - clients: widget.clients, - child: child, - ); - }, - ); - }, - ), - )); + void didChangeAppLifecycleState(AppLifecycleState state) { + if (guiStarted) return; + if (state == AppLifecycleState.detached) return; + + Logs().i( + '${AppConfig.applicationName} switches from the detached background-fetch mode to ${state.name} mode. Rendering GUI...', + ); + // Switching to foreground mode needs to reenable send online sync presence. + for (final client in clients) { + client.backgroundSync = true; + client.syncPresence = PresenceType.online; + } + startGui(clients, store); + // We must make sure that the GUI is only started once. + guiStarted = true; } } diff --git a/lib/pages/add_story/add_story.dart b/lib/pages/add_story/add_story.dart deleted file mode 100644 index 5a875e53b6..0000000000 --- a/lib/pages/add_story/add_story.dart +++ /dev/null @@ -1,308 +0,0 @@ -import 'dart:io'; -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:video_player/video_player.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/add_story/add_story_view.dart'; -import 'package:fluffychat/pages/add_story/invite_story_page.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; -import 'package:fluffychat/utils/resize_image.dart'; -import 'package:fluffychat/utils/story_theme_data.dart'; -import 'package:fluffychat/utils/string_color.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; - -class AddStoryPage extends StatefulWidget { - const AddStoryPage({Key? key}) : super(key: key); - - @override - AddStoryController createState() => AddStoryController(); -} - -class AddStoryController extends State { - final TextEditingController controller = TextEditingController(); - final FocusNode focusNode = FocusNode(); - late Color backgroundColor; - late Color backgroundColorDark; - MatrixImageFile? image; - MatrixVideoFile? video; - - VideoPlayerController? videoPlayerController; - - bool get hasMedia => image != null || video != null; - - bool hasText = false; - - bool textFieldHasFocus = false; - - BoxFit fit = BoxFit.contain; - - int alignmentX = 0; - int alignmentY = 0; - - void toggleBoxFit() { - if (fit == BoxFit.contain) { - setState(() { - fit = BoxFit.cover; - }); - } else { - setState(() { - fit = BoxFit.contain; - }); - } - } - - void updateHasText(String text) { - if (hasText != text.isNotEmpty) { - setState(() { - hasText = text.isNotEmpty; - }); - } - } - - void importMedia() async { - final picked = await FilePickerCross.importFromStorage( - type: FileTypeCross.image, - ); - final fileName = picked.fileName; - if (fileName == null) return; - final matrixFile = MatrixImageFile( - bytes: picked.toUint8List(), - name: fileName, - ); - setState(() { - image = matrixFile; - }); - } - - void capturePhoto() async { - final picked = await ImagePicker().pickImage( - source: ImageSource.camera, - ); - if (picked == null) return; - final matrixFile = await showFutureLoadingDialog( - context: context, - future: () async { - final bytes = await picked.readAsBytes(); - return MatrixImageFile( - bytes: bytes, - name: picked.name, - ); - }); - - setState(() { - image = matrixFile.result; - }); - } - - void updateColor() { - final rand = Random().nextInt(1000).toString(); - setState(() { - backgroundColor = rand.color; - backgroundColorDark = rand.darkColor; - }); - } - - void captureVideo() async { - final picked = await ImagePicker().pickVideo( - source: ImageSource.camera, - ); - if (picked == null) return; - final bytes = await picked.readAsBytes(); - - setState(() { - video = MatrixVideoFile(bytes: bytes, name: picked.name); - videoPlayerController = VideoPlayerController.file(File(picked.path)) - ..setLooping(true); - }); - } - - void reset() => setState(() { - image = video = null; - alignmentX = alignmentY = 0; - controller.clear(); - }); - - void postStory() async { - if (video == null && image == null && controller.text.isEmpty) return; - final client = Matrix.of(context).client; - var storiesRoom = await client.getStoriesRoom(context); - - // Invite contacts if necessary - final undecided = await showFutureLoadingDialog( - context: context, - future: () => client.getUndecidedContactsForStories(storiesRoom), - ); - final result = undecided.result; - if (result == null) return; - if (result.isNotEmpty) { - final created = await showDialog( - context: context, - useRootNavigator: false, - builder: (context) => InviteStoryPage(storiesRoom: storiesRoom), - ); - if (created != true) return; - storiesRoom ??= await client.getStoriesRoom(context); - } - - // Post story - final postResult = await showFutureLoadingDialog( - context: context, - future: () async { - if (storiesRoom == null) throw ('Stories room is null'); - var video = this.video?.detectFileType; - if (video != null) { - video = await video.resizeVideo(); - final thumbnail = await video.getVideoThumbnail(); - await storiesRoom.sendFileEvent( - video, - extraContent: { - 'body': controller.text, - StoryThemeData.contentKey: StoryThemeData( - fit: fit, - alignmentX: alignmentX, - alignmentY: alignmentY, - ).toJson(), - }, - thumbnail: thumbnail, - ); - return; - } - final image = this.image; - if (image != null) { - await storiesRoom.sendFileEvent( - image, - extraContent: { - 'body': controller.text, - StoryThemeData.contentKey: StoryThemeData( - fit: fit, - alignmentX: alignmentX, - alignmentY: alignmentY, - ).toJson(), - }, - ); - return; - } - await storiesRoom.sendEvent({ - 'msgtype': MessageTypes.Text, - 'body': controller.text, - StoryThemeData.contentKey: StoryThemeData( - color1: backgroundColor, - color2: backgroundColorDark, - fit: fit, - alignmentX: alignmentX, - alignmentY: alignmentY, - ).toJson(), - }); - }, - ); - if (postResult.error == null) { - VRouter.of(context).pop(); - } - } - - void onVerticalDragUpdate(DragUpdateDetails details) { - final delta = details.primaryDelta; - if (delta == null) return; - if (delta > 0 && alignmentY < 100) { - setState(() { - alignmentY += 1; - }); - } else if (delta < 0 && alignmentY > -100) { - setState(() { - alignmentY -= 1; - }); - } - } - - void onHorizontalDragUpdate(DragUpdateDetails details) { - final delta = details.primaryDelta; - if (delta == null) return; - if (delta > 0 && alignmentX < 100) { - setState(() { - alignmentX += 1; - }); - } else if (delta < 0 && alignmentX > -100) { - setState(() { - alignmentX -= 1; - }); - } - } - - @override - void initState() { - super.initState(); - final rand = Random().nextInt(1000).toString(); - backgroundColor = rand.color; - backgroundColorDark = rand.darkColor; - focusNode.addListener(() { - if (textFieldHasFocus != focusNode.hasFocus) { - setState(() { - textFieldHasFocus = focusNode.hasFocus; - }); - } - }); - - final shareContent = Matrix.of(context).shareContent; - if (shareContent != null) { - controller.text = shareContent.tryGet('body') ?? ''; - final shareFile = shareContent.tryGet('file')?.detectFileType; - - if (shareFile is MatrixImageFile) { - setState(() { - image = shareFile; - }); - } else if (shareFile is MatrixVideoFile) { - setState(() { - video = shareFile; - }); - } - - final msgType = shareContent.tryGet('msgtype'); - if (msgType == MessageTypes.Image) { - Event( - content: shareContent, - type: EventTypes.Message, - room: Room(id: '!tmproom', client: Matrix.of(context).client), - eventId: 'tmpevent', - senderId: '@tmpsender:example', - originServerTs: DateTime.now(), - ).downloadAndDecryptAttachment().then((file) { - setState(() { - image = file.detectFileType as MatrixImageFile; - }); - }); - } else if (msgType == MessageTypes.Video) { - Event( - content: shareContent, - type: EventTypes.Message, - room: Room(id: '!tmproom', client: Matrix.of(context).client), - eventId: 'tmpevent', - senderId: '@tmpsender:example', - originServerTs: DateTime.now(), - ).downloadAndDecryptAttachment().then((file) { - setState(() { - video = file.detectFileType as MatrixVideoFile; - }); - }); - } - Matrix.of(context).shareContent = null; - } - } - - @override - void dispose() { - videoPlayerController?.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) => AddStoryView(this); -} diff --git a/lib/pages/add_story/add_story_view.dart b/lib/pages/add_story/add_story_view.dart deleted file mode 100644 index 8153c60dad..0000000000 --- a/lib/pages/add_story/add_story_view.dart +++ /dev/null @@ -1,196 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:video_player/video_player.dart'; - -import 'add_story.dart'; - -class AddStoryView extends StatelessWidget { - final AddStoryController controller; - const AddStoryView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final video = controller.videoPlayerController; - - return Scaffold( - backgroundColor: Colors.blueGrey.shade900, - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0, - iconTheme: const IconThemeData(color: Colors.white), - title: Text( - L10n.of(context)!.addToStory, - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(0, 0), - blurRadius: 5, - ), - ], - ), - ), - actions: [ - if (controller.hasMedia) - IconButton( - icon: const Icon(Icons.fullscreen_outlined), - onPressed: controller.toggleBoxFit, - ), - if (!controller.hasMedia) - IconButton( - icon: const Icon(Icons.color_lens_outlined), - onPressed: controller.updateColor, - ), - IconButton( - icon: const Icon(Icons.delete_outlined), - onPressed: controller.reset, - ), - ], - ), - extendBodyBehindAppBar: true, - body: GestureDetector( - onVerticalDragUpdate: controller.onVerticalDragUpdate, - onHorizontalDragUpdate: controller.onHorizontalDragUpdate, - child: Stack( - children: [ - if (video != null) - Padding( - padding: const EdgeInsets.symmetric(vertical: 80.0), - child: FutureBuilder( - future: video.initialize().then((_) => video.play()), - builder: (_, __) => Center(child: VideoPlayer(video)), - ), - ), - AnimatedContainer( - duration: const Duration(seconds: 1), - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 80.0, - ), - decoration: BoxDecoration( - image: controller.image == null - ? null - : DecorationImage( - image: MemoryImage(controller.image!.bytes), - fit: controller.fit, - opacity: 0.75, - ), - gradient: controller.hasMedia - ? null - : LinearGradient( - colors: [ - controller.backgroundColorDark, - controller.backgroundColor, - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - child: Align( - alignment: Alignment( - controller.alignmentX / 100, - controller.alignmentY / 100, - ), - child: IntrinsicWidth( - child: TextField( - controller: controller.controller, - focusNode: controller.focusNode, - minLines: 1, - maxLines: 15, - autofocus: false, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - color: Colors.white, - shadows: controller.hasMedia - ? const [ - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - ] - : null, - ), - onChanged: controller.updateHasText, - decoration: InputDecoration( - border: InputBorder.none, - hintText: controller.hasMedia - ? L10n.of(context)!.addDescription - : L10n.of(context)!.whatIsGoingOn, - filled: false, - hintStyle: TextStyle( - color: Colors.white.withOpacity(0.5), - backgroundColor: Colors.transparent, - ), - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - ), - ), - ), - ), - ), - ], - ), - ), - floatingActionButton: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if (!controller.hasMedia) ...[ - FloatingActionButton( - onPressed: controller.importMedia, - backgroundColor: controller.backgroundColorDark, - foregroundColor: Colors.white, - heroTag: null, - child: const Icon(Icons.photo_outlined), - ), - const SizedBox(width: 16), - FloatingActionButton( - onPressed: controller.capturePhoto, - backgroundColor: controller.backgroundColorDark, - foregroundColor: Colors.white, - heroTag: null, - child: const Icon(Icons.camera_alt_outlined), - ), - const SizedBox(width: 16), - FloatingActionButton( - onPressed: controller.captureVideo, - backgroundColor: controller.backgroundColorDark, - foregroundColor: Colors.white, - heroTag: null, - child: const Icon(Icons.video_camera_front_outlined), - ), - ], - if (controller.hasMedia || controller.hasText) ...[ - const SizedBox(width: 16), - FloatingActionButton( - onPressed: controller.postStory, - backgroundColor: Theme.of(context).colorScheme.surface, - foregroundColor: Theme.of(context).colorScheme.onSurface, - child: const Icon(Icons.send_rounded), - ), - ], - ], - ), - ); - } -} diff --git a/lib/pages/add_story/invite_story_page.dart b/lib/pages/add_story/invite_story_page.dart deleted file mode 100644 index 76ad006b96..0000000000 --- a/lib/pages/add_story/invite_story_page.dart +++ /dev/null @@ -1,135 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class InviteStoryPage extends StatefulWidget { - final Room? storiesRoom; - const InviteStoryPage({ - required this.storiesRoom, - Key? key, - }) : super(key: key); - - @override - _InviteStoryPageState createState() => _InviteStoryPageState(); -} - -class _InviteStoryPageState extends State { - Set _undecided = {}; - final Set _invite = {}; - - void _inviteAction() async { - final confirmed = await showOkCancelAlertDialog( - context: context, - message: L10n.of(context)!.storyPrivacyWarning, - okLabel: L10n.of(context)!.iUnderstand, - cancelLabel: L10n.of(context)!.cancel, - ); - if (confirmed != OkCancelResult.ok) return; - final result = await showFutureLoadingDialog( - context: context, - future: () async { - final client = Matrix.of(context).client; - var room = await client.getStoriesRoom(context); - final inviteList = _invite.toList(); - if (room == null) { - room = await client.createStoriesRoom(inviteList.take(10).toList()); - if (inviteList.length > 10) { - inviteList.removeRange(0, 10); - } else { - inviteList.clear(); - } - } - for (final userId in inviteList) { - room.invite(userId); - } - - _undecided.removeAll(_invite); - _undecided.addAll(client.storiesBlockList); - await client.setStoriesBlockList(_undecided.toList()); - }, - ); - if (result.error != null) return; - Navigator.of(context).pop(true); - } - - Future>? loadContacts; - - @override - Widget build(BuildContext context) { - loadContacts ??= Matrix.of(context) - .client - .getUndecidedContactsForStories(widget.storiesRoom) - .then((contacts) { - return contacts; - }); - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(false), - ), - title: Text(L10n.of(context)!.whoCanSeeMyStories), - elevation: 0, - ), - body: Column( - children: [ - ListTile( - title: Text(L10n.of(context)!.whoCanSeeMyStoriesDesc), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), - ), - ), - const Divider(height: 1), - Expanded( - child: FutureBuilder>( - future: loadContacts, - builder: (context, snapshot) { - final contacts = snapshot.data; - if (contacts == null) { - final error = snapshot.error; - if (error != null) { - return Center( - child: Text(error.toLocalizedString(context))); - } - return const Center( - child: CircularProgressIndicator.adaptive()); - } - _undecided = contacts.map((u) => u.id).toSet(); - return ListView.builder( - itemCount: contacts.length, - itemBuilder: (context, i) => SwitchListTile.adaptive( - value: _invite.contains(contacts[i].id), - onChanged: (b) => setState(() => b - ? _invite.add(contacts[i].id) - : _invite.remove(contacts[i].id)), - secondary: Avatar( - mxContent: contacts[i].avatarUrl, - name: contacts[i].calcDisplayname(), - ), - title: Text(contacts[i].calcDisplayname()), - ), - ); - }), - ), - ], - ), - floatingActionButton: FloatingActionButton.extended( - onPressed: _inviteAction, - label: Text(L10n.of(context)!.publish), - backgroundColor: Theme.of(context).colorScheme.surface, - foregroundColor: Theme.of(context).colorScheme.onSurface, - icon: const Icon(Icons.send_rounded), - ), - ); - } -} diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index 4872c2946c..61c6d6a939 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -1,41 +1,51 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/archive/archive_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; class Archive extends StatefulWidget { - const Archive({Key? key}) : super(key: key); + const Archive({super.key}); @override ArchiveController createState() => ArchiveController(); } class ArchiveController extends State { - List? archive; + List archive = []; Future> getArchive(BuildContext context) async { - final archive = this.archive; - if (archive != null) return archive; - return await Matrix.of(context).client.loadArchive(); + if (archive.isNotEmpty) return archive; + return archive = await Matrix.of(context).client.loadArchive(); } - void forgetAction(int i) => setState(() => archive?.removeAt(i)); + void forgetRoomAction(int i) async { + await showFutureLoadingDialog( + context: context, + future: () async { + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); + await archive[i].forget(); + archive.removeAt(i); + }, + ); + setState(() {}); + } void forgetAllAction() async { final archive = this.archive; - if (archive == null) return; + final client = Matrix.of(context).client; + if (archive.isEmpty) return; if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - message: L10n.of(context)!.clearArchive, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).clearArchive, ) != OkCancelResult.ok) { return; @@ -44,12 +54,13 @@ class ArchiveController extends State { context: context, future: () async { while (archive.isNotEmpty) { - Logs().v('Forget room ${archive.last.displayname}'); + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); await archive.last.forget(); archive.removeLast(); } }, ); + client.clearArchivesFromCache(); setState(() {}); } diff --git a/lib/pages/archive/archive_view.dart b/lib/pages/archive/archive_view.dart index ea4295478c..8cfdb20c34 100644 --- a/lib/pages/archive/archive_view.dart +++ b/lib/pages/archive/archive_view.dart @@ -1,60 +1,72 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/archive/archive.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; class ArchiveView extends StatelessWidget { final ArchiveController controller; - const ArchiveView(this.controller, {Key? key}) : super(key: key); + const ArchiveView(this.controller, {super.key}); @override Widget build(BuildContext context) { - var archive = controller.archive; return FutureBuilder>( future: controller.getArchive(context), builder: (BuildContext context, snapshot) => Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.archive), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).archive), actions: [ - if (snapshot.hasData && archive != null && archive!.isNotEmpty) - TextButton( - onPressed: controller.forgetAllAction, - child: Text(L10n.of(context)!.clearArchive), - ) + if (snapshot.data?.isNotEmpty ?? false) + Padding( + padding: const EdgeInsets.all(8.0), + child: TextButton.icon( + onPressed: controller.forgetAllAction, + label: Text(L10n.of(context).clearArchive), + icon: const Icon(Icons.cleaning_services_outlined), + ), + ), ], ), - body: Builder( - builder: (BuildContext context) { - if (snapshot.hasError) { - return Center( + body: MaxWidthBody( + withScrolling: false, + child: Builder( + builder: (BuildContext context) { + if (snapshot.hasError) { + return Center( child: Text( - L10n.of(context)!.oopsSomethingWentWrong, - textAlign: TextAlign.center, - )); - } - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2)); - } else { - archive = snapshot.data; - if (archive == null || archive!.isEmpty) { + L10n.of(context).oopsSomethingWentWrong, + textAlign: TextAlign.center, + ), + ); + } + if (!snapshot.hasData) { return const Center( - child: Icon(Icons.archive_outlined, size: 80)); + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } else { + if (controller.archive.isEmpty) { + return const Center( + child: Icon(Icons.archive_outlined, size: 80), + ); + } + return ListView.builder( + itemCount: controller.archive.length, + itemBuilder: (BuildContext context, int i) => ChatListItem( + controller.archive[i], + onForget: () => controller.forgetRoomAction(i), + onTap: () => context + .go('/rooms/archive/${controller.archive[i].id}'), + ), + ); } - return ListView.builder( - itemCount: archive!.length, - itemBuilder: (BuildContext context, int i) => ChatListItem( - archive![i], - onForget: controller.forgetAction, - ), - ); - } - }, + }, + ), ), ), ); diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 2c05ce427b..4b15e91fca 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -1,48 +1,39 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/encryption.dart'; -import 'package:matrix/encryption/utils/bootstrap.dart'; import 'package:matrix/matrix.dart'; -import 'package:share_plus/share_plus.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_flat_button.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../utils/adaptive_bottom_sheet.dart'; import '../key_verification/key_verification_dialog.dart'; class BootstrapDialog extends StatefulWidget { final bool wipe; final Client client; const BootstrapDialog({ - Key? key, + super.key, this.wipe = false, required this.client, - }) : super(key: key); + }); - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ); + Future show(BuildContext context) => showAdaptiveBottomSheet( + context: context, + builder: (context) => this, + ); @override - _BootstrapDialogState createState() => _BootstrapDialogState(); + BootstrapDialogState createState() => BootstrapDialogState(); } -class _BootstrapDialogState extends State { +class BootstrapDialogState extends State { final TextEditingController _recoveryKeyTextEditingController = TextEditingController(); @@ -69,51 +60,43 @@ class _BootstrapDialogState extends State { String _getSecureStorageLocalizedName() { if (PlatformInfos.isAndroid) { - return L10n.of(context)!.storeInAndroidKeystore; + return L10n.of(context).storeInAndroidKeystore; } if (PlatformInfos.isIOS || PlatformInfos.isMacOS) { - return L10n.of(context)!.storeInAppleKeyChain; + return L10n.of(context).storeInAppleKeyChain; } - return L10n.of(context)!.storeSecurlyOnThisDevice; + return L10n.of(context).storeSecurlyOnThisDevice; } - static const secureStorage = FlutterSecureStorage( - aOptions: AndroidOptions( - encryptedSharedPreferences: true, - ), - ); - @override void initState() { _createBootstrap(widget.wipe); super.initState(); } - void _createBootstrap(bool wipe) { + void _createBootstrap(bool wipe) async { _wipe = wipe; titleText = null; _recoveryKeyStored = false; bootstrap = - widget.client.encryption!.bootstrap(onUpdate: () => setState(() {})); - secureStorage.read(key: _secureStorageKey).then((key) { - if (key == null) return; - _recoveryKeyTextEditingController.text = key; - }); + widget.client.encryption!.bootstrap(onUpdate: (_) => setState(() {})); + final key = await const FlutterSecureStorage().read(key: _secureStorageKey); + if (key == null) return; + _recoveryKeyTextEditingController.text = key; } @override Widget build(BuildContext context) { + final theme = Theme.of(context); _wipe ??= widget.wipe; - final buttons = []; - Widget body = PlatformInfos.isCupertinoStyle - ? const CupertinoActivityIndicator() - : const LinearProgressIndicator(); - titleText = L10n.of(context)!.loadingPleaseWait; + final buttons = []; + Widget body = const CircularProgressIndicator.adaptive(); + titleText = L10n.of(context).loadingPleaseWait; if (bootstrap.newSsssKey?.recoveryKey != null && _recoveryKeyStored == false) { final key = bootstrap.newSsssKey!.recoveryKey; - titleText = L10n.of(context)!.recoveryKey; + titleText = L10n.of(context).recoveryKey; return Scaffold( appBar: AppBar( centerTitle: true, @@ -121,7 +104,7 @@ class _BootstrapDialogState extends State { icon: const Icon(Icons.close), onPressed: Navigator.of(context).pop, ), - title: Text(L10n.of(context)!.recoveryKey), + title: Text(L10n.of(context).recoveryKey), ), body: Center( child: ConstrainedBox( @@ -132,28 +115,36 @@ class _BootstrapDialogState extends State { children: [ ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - trailing: Icon( - Icons.info_outlined, - color: Theme.of(context).colorScheme.primary, + trailing: CircleAvatar( + backgroundColor: Colors.transparent, + child: Icon( + Icons.info_outlined, + color: theme.colorScheme.primary, + ), ), - subtitle: Text(L10n.of(context)!.chatBackupDescription), + subtitle: Text(L10n.of(context).chatBackupDescription), ), const Divider( height: 32, thickness: 1, ), TextField( - minLines: 4, + minLines: 2, maxLines: 4, readOnly: true, + style: const TextStyle(fontFamily: 'RobotoMono'), controller: TextEditingController(text: key), + decoration: const InputDecoration( + contentPadding: EdgeInsets.all(16), + suffixIcon: Icon(Icons.key_outlined), + ), ), const SizedBox(height: 16), if (_supportsSecureStorage) - CheckboxListTile( + CheckboxListTile.adaptive( contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), value: _storeInSecureStorage, - activeColor: Theme.of(context).colorScheme.primary, + activeColor: theme.colorScheme.primary, onChanged: (b) { setState(() { _storeInSecureStorage = b; @@ -161,34 +152,29 @@ class _BootstrapDialogState extends State { }, title: Text(_getSecureStorageLocalizedName()), subtitle: - Text(L10n.of(context)!.storeInSecureStorageDescription), + Text(L10n.of(context).storeInSecureStorageDescription), ), const SizedBox(height: 16), - CheckboxListTile( + CheckboxListTile.adaptive( contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), value: _recoveryKeyCopied, - activeColor: Theme.of(context).colorScheme.primary, + activeColor: theme.colorScheme.primary, onChanged: (b) { - final box = context.findRenderObject() as RenderBox; - Share.share( - key!, - sharePositionOrigin: - box.localToGlobal(Offset.zero) & box.size, - ); + FluffyShare.share(key!, context); setState(() => _recoveryKeyCopied = true); }, - title: Text(L10n.of(context)!.copyToClipboard), - subtitle: Text(L10n.of(context)!.saveKeyManuallyDescription), + title: Text(L10n.of(context).copyToClipboard), + subtitle: Text(L10n.of(context).saveKeyManuallyDescription), ), const SizedBox(height: 16), ElevatedButton.icon( icon: const Icon(Icons.check_outlined), - label: Text(L10n.of(context)!.next), + label: Text(L10n.of(context).next), onPressed: (_recoveryKeyCopied || _storeInSecureStorage == true) ? () { if (_storeInSecureStorage == true) { - secureStorage.write( + const FlutterSecureStorage().write( key: _secureStorageKey, value: key, ); @@ -240,12 +226,13 @@ class _BootstrapDialogState extends State { icon: const Icon(Icons.close), onPressed: Navigator.of(context).pop, ), - title: Text(L10n.of(context)!.unlockOldMessages), + title: Text(L10n.of(context).chatBackup), ), body: Center( child: ConstrainedBox( constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 1.5), + maxWidth: FluffyThemes.columnWidth * 1.5, + ), child: ListView( padding: const EdgeInsets.all(16.0), children: [ @@ -254,84 +241,141 @@ class _BootstrapDialogState extends State { const EdgeInsets.symmetric(horizontal: 8.0), trailing: Icon( Icons.info_outlined, - color: Theme.of(context).colorScheme.primary, + color: theme.colorScheme.primary, ), subtitle: Text( - L10n.of(context)!.pleaseEnterRecoveryKeyDescription), + L10n.of(context).pleaseEnterRecoveryKeyDescription, + ), ), const Divider(height: 32), TextField( minLines: 1, - maxLines: 1, + maxLines: 2, autocorrect: false, readOnly: _recoveryKeyInputLoading, autofillHints: _recoveryKeyInputLoading ? null : [AutofillHints.password], controller: _recoveryKeyTextEditingController, + style: const TextStyle(fontFamily: 'RobotoMono'), decoration: InputDecoration( - hintText: 'Abc123 Def456', - labelText: L10n.of(context)!.recoveryKey, + contentPadding: const EdgeInsets.all(16), + hintStyle: TextStyle( + fontFamily: theme.textTheme.bodyLarge?.fontFamily, + ), + prefixIcon: const Icon(Icons.key_outlined), + labelText: L10n.of(context).recoveryKey, + hintText: 'Es** **** **** ****', errorText: _recoveryKeyInputError, + errorMaxLines: 2, ), ), const SizedBox(height: 16), ElevatedButton.icon( - icon: _recoveryKeyInputLoading - ? const CircularProgressIndicator.adaptive() - : const Icon(Icons.lock_open_outlined), - label: Text(L10n.of(context)!.unlockOldMessages), - onPressed: _recoveryKeyInputLoading - ? null - : () async { - setState(() { - _recoveryKeyInputError = null; - _recoveryKeyInputLoading = true; - }); - try { - final key = - _recoveryKeyTextEditingController.text; - await bootstrap.newSsssKey!.unlock( - keyOrPassphrase: key, - ); - Logs().d('SSSS unlocked'); - await bootstrap - .client.encryption!.crossSigning - .selfSign( - keyOrPassphrase: key, + style: ElevatedButton.styleFrom( + foregroundColor: theme.colorScheme.onPrimary, + backgroundColor: theme.colorScheme.primary, + ), + icon: _recoveryKeyInputLoading + ? const CircularProgressIndicator.adaptive() + : const Icon(Icons.lock_open_outlined), + label: Text(L10n.of(context).unlockOldMessages), + onPressed: _recoveryKeyInputLoading + ? null + : () async { + setState(() { + _recoveryKeyInputError = null; + _recoveryKeyInputLoading = true; + }); + try { + final key = _recoveryKeyTextEditingController + .text + .trim(); + if (key.isEmpty) return; + await bootstrap.newSsssKey!.unlock( + keyOrPassphrase: key, + ); + await bootstrap.openExistingSsss(); + Logs().d('SSSS unlocked'); + if (bootstrap.encryption.crossSigning.enabled) { + Logs().v( + 'Cross signing is already enabled. Try to self-sign', ); - Logs().d('Successful elfsigned'); - await bootstrap.openExistingSsss(); - } catch (e, s) { - Logs().w('Unable to unlock SSSS', e, s); - setState(() => _recoveryKeyInputError = - L10n.of(context)!.oopsSomethingWentWrong); - } finally { - setState( - () => _recoveryKeyInputLoading = false); + try { + await bootstrap + .client.encryption!.crossSigning + .selfSign(recoveryKey: key); + Logs().d('Successful selfsigned'); + } catch (e, s) { + Logs().e( + 'Unable to self sign with recovery key after successfully open existing SSSS', + e, + s, + ); + } } - }), + } on InvalidPassphraseException catch (e) { + setState( + () => _recoveryKeyInputError = + e.toLocalizedString(context), + ); + } on FormatException catch (_) { + setState( + () => _recoveryKeyInputError = + L10n.of(context).wrongRecoveryKey, + ); + } catch (e, s) { + ErrorReporter( + context, + 'Unable to open SSSS with recovery key', + ).onErrorCallback(e, s); + setState( + () => _recoveryKeyInputError = + e.toLocalizedString(context), + ); + } finally { + setState( + () => _recoveryKeyInputLoading = false, + ); + } + }, + ), const SizedBox(height: 16), - Row(children: [ - const Expanded(child: Divider()), - Padding( - padding: const EdgeInsets.all(12.0), - child: Text(L10n.of(context)!.or), - ), - const Expanded(child: Divider()), - ]), + Row( + children: [ + const Expanded(child: Divider()), + Padding( + padding: const EdgeInsets.all(12.0), + child: Text(L10n.of(context).or), + ), + const Expanded(child: Divider()), + ], + ), const SizedBox(height: 16), ElevatedButton.icon( icon: const Icon(Icons.cast_connected_outlined), - label: Text(L10n.of(context)!.transferFromAnotherDevice), + label: Text(L10n.of(context).transferFromAnotherDevice), onPressed: _recoveryKeyInputLoading ? null : () async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).verifyOtherDevice, + message: L10n.of(context) + .verifyOtherDeviceDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; final req = await showFutureLoadingDialog( context: context, - future: () => widget.client - .userDeviceKeys[widget.client.userID!]! - .startVerification(), + delay: false, + future: () async { + await widget.client.updateUserDeviceKeys(); + return widget.client + .userDeviceKeys[widget.client.userID!]! + .startVerification(); + }, ); if (req.error != null) return; await KeyVerificationDialog(request: req.result!) @@ -342,10 +386,11 @@ class _BootstrapDialogState extends State { const SizedBox(height: 16), ElevatedButton.icon( style: ElevatedButton.styleFrom( - onPrimary: Colors.red, + backgroundColor: theme.colorScheme.errorContainer, + foregroundColor: theme.colorScheme.onErrorContainer, ), icon: const Icon(Icons.delete_outlined), - label: Text(L10n.of(context)!.recoveryKeyLost), + label: Text(L10n.of(context).recoveryKeyLost), onPressed: _recoveryKeyInputLoading ? null : () async { @@ -353,16 +398,16 @@ class _BootstrapDialogState extends State { await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.recoveryKeyLost, - message: L10n.of(context)!.wipeChatBackup, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - isDestructiveAction: true, + title: L10n.of(context).recoveryKeyLost, + message: L10n.of(context).wipeChatBackup, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, )) { setState(() => _createBootstrap(true)); } }, - ) + ), ], ), ), @@ -394,44 +439,65 @@ class _BootstrapDialogState extends State { ); break; case BootstrapState.error: - titleText = L10n.of(context)!.oopsSomethingWentWrong; - body = const Icon(Icons.error_outline, color: Colors.red, size: 40); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(false), - )); + titleText = L10n.of(context).oopsSomethingWentWrong; + body = const Icon(Icons.error_outline, color: Colors.red, size: 80); + buttons.add( + OutlinedButton( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(false), + child: Text(L10n.of(context).close), + ), + ); break; case BootstrapState.done: - titleText = L10n.of(context)!.everythingReady; + titleText = L10n.of(context).everythingReady; body = Column( mainAxisSize: MainAxisSize.min, children: [ - Image.asset('assets/backup.png', fit: BoxFit.contain), - Text(L10n.of(context)!.yourChatBackupHasBeenSetUp), + const Icon( + Icons.check_circle_rounded, + size: 120, + color: Colors.green, + ), + const SizedBox(height: 16), + Text( + L10n.of(context).yourChatBackupHasBeenSetUp, + style: const TextStyle(fontSize: 20), + ), + const SizedBox(height: 16), ], ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(false), - )); + buttons.add( + OutlinedButton( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(false), + child: Text(L10n.of(context).close), + ), + ); break; } } - final title = Text(titleText!); - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: body, - actions: buttons, - ); - } - return AlertDialog( - title: title, - content: body, - actions: buttons, + return Scaffold( + appBar: AppBar( + leading: Center( + child: CloseButton( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(true), + ), + ), + title: Text(titleText ?? L10n.of(context).loadingPleaseWait), + ), + body: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + body, + const SizedBox(height: 8), + ...buttons, + ], + ), + ), ); } } diff --git a/lib/pages/chat/add_widget_tile.dart b/lib/pages/chat/add_widget_tile.dart index 1034083bf8..066ce3d651 100644 --- a/lib/pages/chat/add_widget_tile.dart +++ b/lib/pages/chat/add_widget_tile.dart @@ -8,7 +8,7 @@ import 'package:fluffychat/pages/chat/add_widget_tile_view.dart'; class AddWidgetTile extends StatefulWidget { final Room room; - const AddWidgetTile({Key? key, required this.room}) : super(key: key); + const AddWidgetTile({super.key, required this.room}); @override State createState() => AddWidgetTileState(); @@ -43,14 +43,14 @@ class AddWidgetTileState extends State { if (name.length < 3) { setState(() { - nameError = L10n.of(context)!.widgetNameError; + nameError = L10n.of(context).widgetNameError; }); return; } if (uri == null || uri.scheme != 'https') { setState(() { - urlError = L10n.of(context)!.widgetUrlError; + urlError = L10n.of(context).widgetUrlError; }); return; } @@ -75,7 +75,8 @@ class AddWidgetTileState extends State { Navigator.of(context).pop(); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.errorAddingWidget))); + SnackBar(content: Text(L10n.of(context).errorAddingWidget)), + ); } } diff --git a/lib/pages/chat/add_widget_tile_view.dart b/lib/pages/chat/add_widget_tile_view.dart index 0f98b7cc0a..ea7bb97215 100644 --- a/lib/pages/chat/add_widget_tile_view.dart +++ b/lib/pages/chat/add_widget_tile_view.dart @@ -8,13 +8,12 @@ import 'package:fluffychat/pages/chat/add_widget_tile.dart'; class AddWidgetTileView extends StatelessWidget { final AddWidgetTileState controller; - const AddWidgetTileView({Key? key, required this.controller}) - : super(key: key); + const AddWidgetTileView({super.key, required this.controller}); @override Widget build(BuildContext context) { return ExpansionTile( - title: Text(L10n.of(context)!.addWidget), + title: Text(L10n.of(context).addWidget), leading: const Icon(Icons.add), initiallyExpanded: controller.initiallyExpanded, children: [ @@ -22,16 +21,19 @@ class AddWidgetTileView extends StatelessWidget { groupValue: controller.widgetType, padding: const EdgeInsets.all(8), children: { - 'm.etherpad': Text(L10n.of(context)!.widgetEtherpad), - 'm.jitsi': Text(L10n.of(context)!.widgetJitsi), - 'm.video': Text(L10n.of(context)!.widgetVideo), - 'm.custom': Text(L10n.of(context)!.widgetCustom), - }.map((key, value) => MapEntry( + 'm.etherpad': Text(L10n.of(context).widgetEtherpad), + 'm.jitsi': Text(L10n.of(context).widgetJitsi), + 'm.video': Text(L10n.of(context).widgetVideo), + 'm.custom': Text(L10n.of(context).widgetCustom), + }.map( + (key, value) => MapEntry( key, Padding( padding: const EdgeInsets.symmetric(horizontal: 4.0), child: value, - ))), + ), + ), + ), onValueChanged: controller.setWidgetType, ), Padding( @@ -41,7 +43,7 @@ class AddWidgetTileView extends StatelessWidget { autofocus: true, decoration: InputDecoration( prefixIcon: const Icon(Icons.label), - label: Text(L10n.of(context)!.widgetName), + label: Text(L10n.of(context).widgetName), errorText: controller.nameError, ), ), @@ -52,19 +54,19 @@ class AddWidgetTileView extends StatelessWidget { controller: controller.urlController, decoration: InputDecoration( prefixIcon: const Icon(Icons.add_link), - label: Text(L10n.of(context)!.link), + label: Text(L10n.of(context).link), errorText: controller.urlError, ), ), ), - ButtonBar( + OverflowBar( children: [ TextButton( onPressed: controller.addWidget, - child: Text(L10n.of(context)!.addWidget), + child: Text(L10n.of(context).addWidget), ), ], - ) + ), ], ); } diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 4d9640be05..dc8f853a2c 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1,63 +1,116 @@ import 'dart:async'; import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:collection/collection.dart'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; import 'package:matrix/matrix.dart'; import 'package:record/record.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat_view.dart'; import 'package:fluffychat/pages/chat/event_info_dialog.dart'; import 'package:fluffychat/pages/chat/recording_dialog.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/event_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/pages/chat_details/chat_details.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/voip/callkeep_manager.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; import '../../utils/account_bundles.dart'; import '../../utils/localized_exception_extension.dart'; -import '../../utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart'; -import '../../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; import 'send_file_dialog.dart'; import 'send_location_dialog.dart'; -import 'sticker_picker_dialog.dart'; -class Chat extends StatefulWidget { - final Widget? sideView; +class ChatPage extends StatelessWidget { + final String roomId; + final List? shareItems; + final String? eventId; - const Chat({Key? key, this.sideView}) : super(key: key); + const ChatPage({ + super.key, + required this.roomId, + this.eventId, + this.shareItems, + }); + + @override + Widget build(BuildContext context) { + final room = Matrix.of(context).client.getRoomById(roomId); + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ), + ); + } + + return ChatPageWithRoom( + key: Key('chat_page_${roomId}_$eventId'), + room: room, + shareItems: shareItems, + eventId: eventId, + ); + } +} + +class ChatPageWithRoom extends StatefulWidget { + final Room room; + final List? shareItems; + final String? eventId; + + const ChatPageWithRoom({ + super.key, + required this.room, + this.shareItems, + this.eventId, + }); @override ChatController createState() => ChatController(); } -class ChatController extends State { - Room? room; +class ChatController extends State + with WidgetsBindingObserver { + Room get room => sendingClient.getRoomById(roomId) ?? widget.room; - Client? sendingClient; + late Client sendingClient; Timeline? timeline; - MatrixState? matrix; + late final String readMarkerEventId; - String? get roomId => context.vRouter.pathParameters['roomid']; + String get roomId => widget.room.id; final AutoScrollController scrollController = AutoScrollController(); FocusNode inputFocus = FocusNode(); + StreamSubscription? onFocusSub; Timer? typingCoolDown; Timer? typingTimeout; @@ -70,20 +123,16 @@ class ChatController extends State { void onDragDone(DropDoneDetails details) async { setState(() => dragging = false); - for (final xfile in details.files) { - final bytes = await xfile.readAsBytes(); - await showDialog( - context: context, - useRootNavigator: false, - builder: (c) => SendFileDialog( - file: MatrixFile( - bytes: bytes, - name: xfile.name, - ).detectFileType, - room: room!, - ), - ); - } + if (details.files.isEmpty) return; + + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: details.files, + room: room, + outerContext: context, + ), + ); } bool get canSaveSelectedEvent => @@ -96,149 +145,282 @@ class ChatController extends State { MessageTypes.File, }.contains(selectedEvents.single.messageType); - void saveSelectedEvent() => selectedEvents.single.saveFile(context); + void saveSelectedEvent(context) => selectedEvents.single.saveFile(context); List selectedEvents = []; - late List filteredEvents; - final Set unfolded = {}; Event? replyEvent; Event? editEvent; - bool showScrollDownButton = false; + bool _scrolledUp = false; + + bool get showScrollDownButton => + _scrolledUp || timeline?.allowNewEvent == false; bool get selectMode => selectedEvents.isNotEmpty; final int _loadHistoryCount = 100; - String inputText = ''; - String pendingText = ''; - bool get canLoadMore => - timeline!.events.isEmpty || - timeline!.events.last.type != EventTypes.RoomCreate; - bool showEmojiPicker = false; + void recreateChat() async { + final room = this.room; + final userId = room.directChatMatrixID; + if (userId == null) { + throw Exception( + 'Try to recreate a room with is not a DM room. This should not be possible from the UI!', + ); + } + await showFutureLoadingDialog( + context: context, + future: () => room.invite(userId), + ); + } + + void leaveChat() async { + final success = await showFutureLoadingDialog( + context: context, + future: room.leave, + ); + if (success.error != null) return; + context.go('/rooms'); + } + EmojiPickerType emojiPickerType = EmojiPickerType.keyboard; - void requestHistory() async { - if (canLoadMore) { - try { - await timeline!.requestHistory(historyCount: _loadHistoryCount); - } catch (err) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - (err).toLocalizedString(context), - ), - ), - ); - rethrow; - } - } + void requestHistory([_]) async { + Logs().v('Requesting history...'); + await timeline?.requestHistory(historyCount: _loadHistoryCount); + } + + void requestFuture() async { + final timeline = this.timeline; + if (timeline == null) return; + Logs().v('Requesting future...'); + final mostRecentEventId = timeline.events.first.eventId; + await timeline.requestFuture(historyCount: _loadHistoryCount); + setReadMarker(eventId: mostRecentEventId); } void _updateScrollController() { if (!mounted) { return; } - setReadMarker(); if (!scrollController.hasClients) return; - if (scrollController.position.pixels == - scrollController.position.maxScrollExtent && - timeline!.events.isNotEmpty && - timeline!.events[timeline!.events.length - 1].type != - EventTypes.RoomCreate) { - requestHistory(); + if (timeline?.allowNewEvent == false || + scrollController.position.pixels > 0 && _scrolledUp == false) { + setState(() => _scrolledUp = true); + } else if (scrollController.position.pixels <= 0 && _scrolledUp == true) { + setState(() => _scrolledUp = false); + setReadMarker(); + } + + if (scrollController.position.pixels == 0 || + scrollController.position.pixels == 64) { + requestFuture(); + } + } + + void _loadDraft() async { + final prefs = await SharedPreferences.getInstance(); + final draft = prefs.getString('draft_$roomId'); + if (draft != null && draft.isNotEmpty) { + sendController.text = draft; } - if (scrollController.position.pixels > 0 && showScrollDownButton == false) { - setState(() => showScrollDownButton = true); - } else if (scrollController.position.pixels == 0 && - showScrollDownButton == true) { - setState(() => showScrollDownButton = false); + } + + void _shareItems([_]) { + final shareItems = widget.shareItems; + if (shareItems == null || shareItems.isEmpty) return; + for (final item in shareItems) { + if (item is FileShareItem) continue; + if (item is TextShareItem) room.sendTextEvent(item.value); + if (item is ContentShareItem) room.sendEvent(item.value); } + final files = shareItems + .whereType() + .map((item) => item.value) + .toList(); + if (files.isEmpty) return; + showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: files, + room: room, + outerContext: context, + ), + ); } @override void initState() { scrollController.addListener(_updateScrollController); inputFocus.addListener(_inputFocusListener); - final voipPlugin = Matrix.of(context).voipPlugin; - if (voipPlugin != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - CallKeepManager().setVoipPlugin(voipPlugin); - CallKeepManager().initialize().catchError((_) => true); - }); - } + _loadDraft(); + WidgetsBinding.instance.addPostFrameCallback(_shareItems); super.initState(); + _displayChatDetailsColumn = ValueNotifier( + Matrix.of(context).store.getBool(SettingKeys.displayChatDetailsColumn) ?? + false, + ); + + sendingClient = Matrix.of(context).client; + readMarkerEventId = room.hasNewMessages ? room.fullyRead : ''; + WidgetsBinding.instance.addObserver(this); + _tryLoadTimeline(); + if (kIsWeb) { + onFocusSub = html.window.onFocus.listen((_) => setReadMarker()); + } + } + + void _tryLoadTimeline() async { + final initialEventId = widget.eventId; + loadTimelineFuture = _getTimeline(); + try { + await loadTimelineFuture; + if (initialEventId != null) scrollToEventId(initialEventId); + + var readMarkerEventIndex = readMarkerEventId.isEmpty + ? -1 + : timeline!.events + .filterByVisibleInGui(exceptionEventId: readMarkerEventId) + .indexWhere((e) => e.eventId == readMarkerEventId); + + // Read marker is existing but not found in first events. Try a single + // requestHistory call before opening timeline on event context: + if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + await timeline?.requestHistory(historyCount: _loadHistoryCount); + readMarkerEventIndex = timeline!.events + .filterByVisibleInGui(exceptionEventId: readMarkerEventId) + .indexWhere((e) => e.eventId == readMarkerEventId); + } + + if (readMarkerEventIndex > 1) { + Logs().v('Scroll up to visible event', readMarkerEventId); + scrollToEventId(readMarkerEventId, highlightEvent: false); + return; + } else if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + _showScrollUpMaterialBanner(readMarkerEventId); + } + + // Mark room as read on first visit if requirements are fulfilled + setReadMarker(); + + if (!mounted) return; + } catch (e, s) { + ErrorReporter(context, 'Unable to load timeline').onErrorCallback(e, s); + rethrow; + } } + String? scrollUpBannerEventId; + + void discardScrollUpBannerEventId() => setState(() { + scrollUpBannerEventId = null; + }); + + void _showScrollUpMaterialBanner(String eventId) => setState(() { + scrollUpBannerEventId = eventId; + }); + void updateView() { if (!mounted) return; - setState( - () { - filteredEvents = timeline!.getFilteredEvents(unfolded: unfolded); - }, - ); + setReadMarker(); + setState(() {}); } - void unfold(String eventId) { - var i = filteredEvents.indexWhere((e) => e.eventId == eventId); - setState(() { - while (i < filteredEvents.length - 1 && filteredEvents[i].isState) { - unfolded.add(filteredEvents[i].eventId); - i++; - } - filteredEvents = timeline!.getFilteredEvents(unfolded: unfolded); - }); + Future? loadTimelineFuture; + + int? animateInEventIndex; + + void onInsert(int i) { + // setState will be called by updateView() anyway + animateInEventIndex = i; } - Future getTimeline() async { - if (timeline == null) { - timeline = await room!.getTimeline(onUpdate: updateView); - if (timeline!.events.isNotEmpty) { - if (room!.markedUnread) room!.markUnread(false); - setReadMarker(); + Future _getTimeline({ + String? eventContextId, + }) async { + await Matrix.of(context).client.roomsLoading; + await Matrix.of(context).client.accountDataLoading; + if (eventContextId != null && + (!eventContextId.isValidMatrixId || eventContextId.sigil != '\$')) { + eventContextId = null; + } + try { + timeline?.cancelSubscriptions(); + timeline = await room.getTimeline( + onUpdate: updateView, + eventContextId: eventContextId, + onInsert: onInsert, + ); + } catch (e, s) { + Logs().w('Unable to load timeline on event ID $eventContextId', e, s); + if (!mounted) return; + timeline = await room.getTimeline( + onUpdate: updateView, + onInsert: onInsert, + ); + if (!mounted) return; + if (e is TimeoutException || e is IOException) { + _showScrollUpMaterialBanner(eventContextId!); } - - // when the scroll controller is attached we want to scroll to an event id, if specified - // and update the scroll controller...which will trigger a request history, if the - // "load more" button is visible on the screen - SchedulerBinding.instance.addPostFrameCallback((_) async { - if (mounted) { - final event = VRouter.of(context).queryParameters['event']; - if (event != null) { - scrollToEventId(event); - } - _updateScrollController(); - } - }); } - filteredEvents = timeline!.getFilteredEvents(unfolded: unfolded); - timeline!.requestKeys(); - return true; + timeline!.requestKeys(onlineKeyBackupOnly: false); + if (room.markedUnread) room.markUnread(false); + + return; + } + + String? scrollToEventIdMarker; + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state != AppLifecycleState.resumed) return; + setReadMarker(); } Future? _setReadMarkerFuture; - void setReadMarker([_]) { - if (_setReadMarkerFuture == null && - (room!.hasNewMessages || room!.notificationCount > 0) && - timeline != null && - timeline!.events.isNotEmpty && - Matrix.of(context).webHasFocus) { - Logs().v('Set read marker...'); - // ignore: unawaited_futures - _setReadMarkerFuture = timeline!.setReadMarker().then((_) { - _setReadMarkerFuture = null; - }); - room!.client.updateIosBadge(); + void setReadMarker({String? eventId}) { + if (_setReadMarkerFuture != null) return; + if (_scrolledUp) return; + if (scrollUpBannerEventId != null) return; + + if (eventId == null && + !room.hasNewMessages && + room.notificationCount == 0) { + return; + } + + // Do not send read markers when app is not in foreground + if (kIsWeb && !Matrix.of(context).webHasFocus) return; + if (!kIsWeb && + WidgetsBinding.instance.lifecycleState != AppLifecycleState.resumed) { + return; + } + + final timeline = this.timeline; + if (timeline == null || timeline.events.isEmpty) return; + + Logs().d('Set read marker...', eventId); + // ignore: unawaited_futures + _setReadMarkerFuture = timeline + .setReadMarker( + eventId: eventId, + public: AppConfig.sendPublicReadReceipts, + ) + .then((_) { + _setReadMarkerFuture = null; + }); + if (eventId == null || eventId == timeline.room.lastEvent?.eventId) { + Matrix.of(context).backgroundPush?.cancelNotification(roomId); } } @@ -247,20 +429,30 @@ class ChatController extends State { timeline?.cancelSubscriptions(); timeline = null; inputFocus.removeListener(_inputFocusListener); + onFocusSub?.cancel(); super.dispose(); } TextEditingController sendController = TextEditingController(); - void setSendingClient(Client? c) { - // first cancle typing with the old sending client + void setSendingClient(Client c) { + // first cancel typing with the old sending client if (currentlyTyping) { // no need to have the setting typing to false be blocking typingCoolDown?.cancel(); typingCoolDown = null; - room!.setTyping(false); + room.setTyping(false); currentlyTyping = false; } + // then cancel the old timeline + // fixes bug with read reciepts and quick switching + loadTimelineFuture = _getTimeline(eventContextId: room.fullyRead).onError( + ErrorReporter( + context, + 'Unable to load timeline after changing sending Client', + ).onErrorCallback, + ); + // then set the new sending client setState(() => sendingClient = c); } @@ -271,15 +463,17 @@ class ChatController extends State { Future send() async { if (sendController.text.trim().isEmpty) return; + _storeInputTimeoutTimer?.cancel(); + final prefs = await SharedPreferences.getInstance(); + prefs.remove('draft_$roomId'); var parseCommands = true; final commandMatch = RegExp(r'^\/(\w+)').firstMatch(sendController.text); if (commandMatch != null && - !room!.client.commands.keys.contains(commandMatch[1]!.toLowerCase())) { - final l10n = L10n.of(context)!; + !sendingClient.commands.keys.contains(commandMatch[1]!.toLowerCase())) { + final l10n = L10n.of(context); final dialogResult = await showOkCancelAlertDialog( context: context, - useRootNavigator: false, title: l10n.commandInvalid, message: l10n.commandMissing(commandMatch[0]!), okLabel: l10n.sendAsText, @@ -290,17 +484,20 @@ class ChatController extends State { } // ignore: unawaited_futures - room!.sendTextEvent(sendController.text, - inReplyTo: replyEvent, - editEventId: editEvent?.eventId, - parseCommands: parseCommands); + room.sendTextEvent( + sendController.text, + inReplyTo: replyEvent, + editEventId: editEvent?.eventId, + parseCommands: parseCommands, + ); sendController.value = TextEditingValue( text: pendingText, selection: const TextSelection.collapsed(offset: 0), ); setState(() { - inputText = pendingText; + sendController.text = pendingText; + _inputTextIsEmpty = pendingText.isEmpty; replyEvent = null; editEvent = null; pendingText = ''; @@ -308,35 +505,44 @@ class ChatController extends State { } void sendFileAction() async { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.any); - if (result.fileName == null) return; - await showDialog( + final files = await selectFiles(context, allowMultiple: true); + if (files.isEmpty) return; + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: files, + room: room, + outerContext: context, + ), + ); + } + + void sendImageFromClipBoard(Uint8List? image) async { + if (image == null) return; + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixFile( - bytes: result.toUint8List(), - name: result.fileName!, - ).detectFileType, - room: room!, + files: [XFile.fromData(image)], + room: room, + outerContext: context, ), ); } void sendImageAction() async { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; - await showDialog( + final files = await selectFiles( + context, + allowMultiple: true, + type: FileSelectorType.images, + ); + if (files.isEmpty) return; + + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixImageFile( - bytes: result.toUint8List(), - name: result.fileName!, - ), - room: room!, + files: files, + room: room, + outerContext: context, ), ); } @@ -346,16 +552,13 @@ class ChatController extends State { FocusScope.of(context).requestFocus(FocusNode()); final file = await ImagePicker().pickImage(source: ImageSource.camera); if (file == null) return; - final bytes = await file.readAsBytes(); - await showDialog( + + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixImageFile( - bytes: bytes, - name: file.path, - ), - room: room!, + files: [file], + room: room, + outerContext: context, ), ); } @@ -363,68 +566,50 @@ class ChatController extends State { void openVideoCameraAction() async { // Make sure the textfield is unfocused before opening the camera FocusScope.of(context).requestFocus(FocusNode()); - final file = await ImagePicker().pickVideo(source: ImageSource.camera); + final file = await ImagePicker().pickVideo( + source: ImageSource.camera, + maxDuration: const Duration(minutes: 1), + ); if (file == null) return; - final bytes = await file.readAsBytes(); - await showDialog( + + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixVideoFile( - bytes: bytes, - name: file.path, - ), - room: room!, + files: [file], + room: room, + outerContext: context, ), ); } - void sendStickerAction() async { - final sticker = await showModalBottomSheet( - context: context, - useRootNavigator: false, - builder: (c) => StickerPickerDialog(room: room!), - ); - if (sticker == null) return; - final eventContent = { - 'body': sticker.body, - if (sticker.info != null) 'info': sticker.info, - 'url': sticker.url.toString(), - }; - // send the sticker - await room!.sendEvent( - eventContent, - type: EventTypes.Sticker, - ); - } - void voiceMessageAction() async { + final scaffoldMessenger = ScaffoldMessenger.of(context); if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; - if ((info.version.sdkInt ?? 16) < 19) { + if (info.version.sdkInt < 19) { showOkAlertDialog( context: context, - title: L10n.of(context)!.unsupportedAndroidVersion, - message: L10n.of(context)!.unsupportedAndroidVersionLong, - okLabel: L10n.of(context)!.close, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, ); return; } } - if (await Record().hasPermission() == false) return; + if (await AudioRecorder().hasPermission() == false) return; final result = await showDialog( context: context, - useRootNavigator: false, + barrierDismissible: false, builder: (c) => const RecordingDialog(), ); if (result == null) return; - final audioFile = File(result.path); + final audioFile = XFile(result.path); final file = MatrixAudioFile( - bytes: audioFile.readAsBytesSync(), - name: audioFile.path, + bytes: await audioFile.readAsBytes(), + name: result.fileName ?? audioFile.path, ); - await room!.sendFileEvent( + await room.sendFileEvent( file, inReplyTo: replyEvent, extraContent: { @@ -438,12 +623,25 @@ class ChatController extends State { 'waveform': result.waveform, }, }, - ); + ).catchError((e) { + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text( + (e as Object).toLocalizedString(context), + ), + ), + ); + return null; + }); setState(() { replyEvent = null; }); } + void hideEmojiPicker() { + setState(() => showEmojiPicker = false); + } + void emojiPickerAction() { if (showEmojiPicker) { inputFocus.requestFocus(); @@ -462,10 +660,9 @@ class ChatController extends State { } void sendLocationAction() async { - await showDialog( + await showAdaptiveDialog( context: context, - useRootNavigator: false, - builder: (c) => SendLocationDialog(room: room!), + builder: (c) => SendLocationDialog(room: room), ); } @@ -474,13 +671,14 @@ class ChatController extends State { if (selectedEvents.length == 1) { return selectedEvents.first .getDisplayEvent(timeline!) - .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)!)); + .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context))); } for (final event in selectedEvents) { if (copyString.isNotEmpty) copyString += '\n\n'; copyString += event.getDisplayEvent(timeline!).calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true); + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + ); } return copyString; } @@ -495,41 +693,41 @@ class ChatController extends State { void reportEventAction() async { final event = selectedEvents.single; - final score = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.reportMessage, - message: L10n.of(context)!.howOffensiveIsThisContent, - cancelLabel: L10n.of(context)!.cancel, - okLabel: L10n.of(context)!.ok, - actions: [ - AlertDialogAction( - key: -100, - label: L10n.of(context)!.extremeOffensive, - ), - AlertDialogAction( - key: -50, - label: L10n.of(context)!.offensive, - ), - AlertDialogAction( - key: 0, - label: L10n.of(context)!.inoffensive, - ), - ]); + final score = await showModalActionPopup( + context: context, + title: L10n.of(context).reportMessage, + message: L10n.of(context).howOffensiveIsThisContent, + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: -100, + label: L10n.of(context).extremeOffensive, + ), + AdaptiveModalAction( + value: -50, + label: L10n.of(context).offensive, + ), + AdaptiveModalAction( + value: 0, + label: L10n.of(context).inoffensive, + ), + ], + ); if (score == null) return; final reason = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.whyDoYouWantToReportThis, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [DialogTextField(hintText: L10n.of(context)!.reason)]); - if (reason == null || reason.single.isEmpty) return; + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; final result = await showFutureLoadingDialog( context: context, future: () => Matrix.of(context).client.reportContent( event.roomId!, event.eventId, - reason: reason.single, + reason: reason, score: score, ), ); @@ -539,40 +737,68 @@ class ChatController extends State { selectedEvents.clear(); }); ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.contentHasBeenReported))); + SnackBar(content: Text(L10n.of(context).contentHasBeenReported)), + ); + } + + void deleteErrorEventsAction() async { + try { + if (selectedEvents.any((event) => event.status != EventStatus.error)) { + throw Exception( + 'Tried to delete failed to send events but one event is not failed to sent', + ); + } + for (final event in selectedEvents) { + await event.cancelSend(); + } + setState(selectedEvents.clear); + } catch (e, s) { + ErrorReporter( + context, + 'Error while delete error events action', + ).onErrorCallback(e, s); + } } void redactEventsAction() async { - final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.messageWillBeRemovedWarning, - okLabel: L10n.of(context)!.remove, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok; - if (!confirmed) return; + final reasonInput = selectedEvents.any((event) => event.status.isSent) + ? await showTextInputDialog( + context: context, + title: L10n.of(context).redactMessage, + message: L10n.of(context).redactMessageDescription, + isDestructive: true, + hintText: L10n.of(context).optionalRedactReason, + okLabel: L10n.of(context).remove, + cancelLabel: L10n.of(context).cancel, + ) + : null; + if (reasonInput == null) return; + final reason = reasonInput.isEmpty ? null : reasonInput; for (final event in selectedEvents) { await showFutureLoadingDialog( - context: context, - future: () async { - if (event.status.isSent) { - if (event.canRedact) { - await event.redactEvent(); - } else { - final client = currentRoomBundle.firstWhere( - (cl) => selectedEvents.first.senderId == cl!.userID, - orElse: () => null); - if (client == null) { - return; - } - final room = client.getRoomById(roomId!)!; - await Event.fromJson(event.toJson(), room).redactEvent(); - } + context: context, + future: () async { + if (event.status.isSent) { + if (event.canRedact) { + await event.redactEvent(reason: reason); } else { - await event.remove(); + final client = currentRoomBundle.firstWhere( + (cl) => selectedEvents.first.senderId == cl!.userID, + orElse: () => null, + ); + if (client == null) { + return; + } + final room = client.getRoomById(roomId)!; + await Event.fromJson(event.toJson(), room).redactEvent( + reason: reason, + ); } - }); + } else { + await event.cancelSend(); + } + }, + ); } setState(() { showEmojiPicker = false; @@ -581,22 +807,38 @@ class ChatController extends State { } List get currentRoomBundle { - final clients = matrix!.currentBundle!; - clients.removeWhere((c) => c!.getRoomById(roomId!) == null); + final clients = Matrix.of(context).currentBundle!; + clients.removeWhere((c) => c!.getRoomById(roomId) == null); return clients; } bool get canRedactSelectedEvents { - final clients = matrix!.currentBundle; + if (isArchived) return false; + final clients = Matrix.of(context).currentBundle; for (final event in selectedEvents) { + if (!event.status.isSent) return false; if (event.canRedact == false && - !(clients!.any((cl) => event.senderId == cl!.userID))) return false; + !(clients!.any((cl) => event.senderId == cl!.userID))) { + return false; + } + } + return true; + } + + bool get canPinSelectedEvents { + if (isArchived || + !room.canChangeStateEvent(EventTypes.RoomPinnedEvents) || + selectedEvents.length != 1 || + !selectedEvents.single.status.isSent) { + return false; } return true; } bool get canEditSelectedEvents { - if (selectedEvents.length != 1 || !selectedEvents.first.status.isSent) { + if (isArchived || + selectedEvents.length != 1 || + !selectedEvents.first.status.isSent) { return false; } return currentRoomBundle @@ -604,16 +846,17 @@ class ChatController extends State { } void forwardEventsAction() async { - if (selectedEvents.length == 1) { - Matrix.of(context).shareContent = selectedEvents.first.content; - } else { - Matrix.of(context).shareContent = { - 'msgtype': 'm.text', - 'body': _getSelectedEventString(), - }; - } + if (selectedEvents.isEmpty) return; + await showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: selectedEvents + .map((event) => ContentShareItem(event.content)) + .toList(), + ), + ); + if (!mounted) return; setState(() => selectedEvents.clear()); - VRouter.of(context).to('/rooms'); } void sendAgainAction() { @@ -638,59 +881,61 @@ class ChatController extends State { inputFocus.requestFocus(); } - void scrollToEventId(String eventId) async { - var eventIndex = filteredEvents.indexWhere((e) => e.eventId == eventId); + void scrollToEventId( + String eventId, { + bool highlightEvent = true, + }) async { + final foundEvent = + timeline!.events.firstWhereOrNull((event) => event.eventId == eventId); + + final eventIndex = foundEvent == null + ? -1 + : timeline!.events + .filterByVisibleInGui(exceptionEventId: eventId) + .indexOf(foundEvent); + if (eventIndex == -1) { - // event id not found...maybe we can fetch it? - // the try...finally is here to start and close the loading dialog reliably - await showFutureLoadingDialog( - context: context, - future: () async { - // okay, we first have to fetch if the event is in the room - try { - final event = await timeline!.getEventById(eventId); - if (event == null) { - // event is null...meaning something is off - return; - } - } catch (err) { - if (err is MatrixException && err.errcode == 'M_NOT_FOUND') { - // event wasn't found, as the server gave a 404 or something - return; - } - rethrow; - } - // okay, we know that the event *is* in the room - while (eventIndex == -1) { - if (!canLoadMore) { - // we can't load any more events but still haven't found ours yet...better stop here - return; - } - try { - await timeline!.requestHistory(historyCount: _loadHistoryCount); - } catch (err) { - if (err is TimeoutException) { - // loading the history timed out...so let's do nothing - return; - } - rethrow; - } - eventIndex = - filteredEvents.indexWhere((e) => e.eventId == eventId); - } - }); - } - if (!mounted) { + setState(() { + timeline = null; + _scrolledUp = false; + loadTimelineFuture = _getTimeline(eventContextId: eventId).onError( + ErrorReporter(context, 'Unable to load timeline after scroll to ID') + .onErrorCallback, + ); + }); + await loadTimelineFuture; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + scrollToEventId(eventId); + }); return; } + if (highlightEvent) { + setState(() { + scrollToEventIdMarker = eventId; + }); + } await scrollController.scrollToIndex( - eventIndex, + eventIndex + 1, + duration: FluffyThemes.animationDuration, preferPosition: AutoScrollPosition.middle, ); _updateScrollController(); } - void scrollDown() => scrollController.jumpTo(0); + void scrollDown() async { + if (!timeline!.allowNewEvent) { + setState(() { + timeline = null; + _scrolledUp = false; + loadTimelineFuture = _getTimeline().onError( + ErrorReporter(context, 'Unable to load timeline after scroll down') + .onErrorCallback, + ); + }); + await loadTimelineFuture; + } + scrollController.jumpTo(0); + } void onEmojiSelected(_, Emoji? emoji) { switch (emojiPickerType) { @@ -708,8 +953,11 @@ class ChatController extends State { setState(() => showEmojiPicker = false); if (emoji == null) return; // make sure we don't send the same emoji twice - if (_allReactionEvents - .any((e) => e.content['m.relates_to']['key'] == emoji.emoji)) return; + if (_allReactionEvents.any( + (e) => e.content.tryGetMap('m.relates_to')?['key'] == emoji.emoji, + )) { + return; + } return sendEmojiAction(emoji.emoji); } @@ -740,7 +988,8 @@ class ChatController extends State { sendController ..text = sendController.text.characters.skipLast(1).toString() ..selection = TextSelection.fromPosition( - TextPosition(offset: sendController.text.length)); + TextPosition(offset: sendController.text.length), + ); break; } } @@ -755,7 +1004,7 @@ class ChatController extends State { final events = List.from(selectedEvents); setState(() => selectedEvents.clear()); for (final event in events) { - await room!.sendReaction( + await room.sendReaction( event.eventId, emoji!, ); @@ -775,8 +1024,9 @@ class ChatController extends State { void editSelectedEventAction() { final client = currentRoomBundle.firstWhere( - (cl) => selectedEvents.first.senderId == cl!.userID, - orElse: () => null); + (cl) => selectedEvents.first.senderId == cl!.userID, + orElse: () => null, + ); if (client == null) { return; } @@ -784,10 +1034,12 @@ class ChatController extends State { setState(() { pendingText = sendController.text; editEvent = selectedEvents.first; - inputText = sendController.text = editEvent! - .getDisplayEvent(timeline!) - .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, hideReply: true); + sendController.text = + editEvent!.getDisplayEvent(timeline!).calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ); selectedEvents.clear(); }); inputFocus.requestFocus(); @@ -796,31 +1048,32 @@ class ChatController extends State { void goToNewRoomAction() async { if (OkCancelResult.ok != await showOkCancelAlertDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.goToTheNewRoom, - message: room! + title: L10n.of(context).goToTheNewRoom, + message: room .getState(EventTypes.RoomTombstone)! .parsedTombstoneContent .body, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, )) { return; } final result = await showFutureLoadingDialog( context: context, - future: () => room!.client.joinRoom(room! - .getState(EventTypes.RoomTombstone)! - .parsedTombstoneContent - .replacementRoom), + future: () => room.client.joinRoom( + room + .getState(EventTypes.RoomTombstone)! + .parsedTombstoneContent + .replacementRoom, + ), ); await showFutureLoadingDialog( context: context, - future: room!.leave, + future: room.leave, ); if (result.error == null) { - VRouter.of(context).toSegments(['rooms', result.result!]); + context.go('/rooms/${result.result!}'); } } @@ -877,9 +1130,6 @@ class ChatController extends State { if (choice == 'camera-video') { openVideoCameraAction(); } - if (choice == 'sticker') { - sendStickerAction(); - } if (choice == 'location') { sendLocationAction(); } @@ -888,24 +1138,22 @@ class ChatController extends State { unpinEvent(String eventId) async { final response = await showOkCancelAlertDialog( context: context, - title: L10n.of(context)!.unpin, - message: L10n.of(context)!.confirmEventUnpin, - okLabel: L10n.of(context)!.unpin, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).unpin, + message: L10n.of(context).confirmEventUnpin, + okLabel: L10n.of(context).unpin, + cancelLabel: L10n.of(context).cancel, ); if (response == OkCancelResult.ok) { - final events = room!.pinnedEventIds + final events = room.pinnedEventIds ..removeWhere((oldEvent) => oldEvent == eventId); showFutureLoadingDialog( context: context, - future: () => room!.setPinnedEvents(events), + future: () => room.setPinnedEvents(events), ); } } void pinEvent() { - final room = this.room; - if (room == null) return; final pinnedEventIds = room.pinnedEventIds; final selectedEventIds = selectedEvents.map((e) => e.eventId).toSet(); final unpin = selectedEventIds.length == 1 && @@ -921,9 +1169,22 @@ class ChatController extends State { ); } + Timer? _storeInputTimeoutTimer; + static const Duration _storeInputTimeout = Duration(milliseconds: 500); + void onInputBarChanged(String text) { - setReadMarker(); - if (text.endsWith(' ') && matrix!.hasComplexBundles) { + if (_inputTextIsEmpty != text.isEmpty) { + setState(() { + _inputTextIsEmpty = text.isEmpty; + }); + } + + _storeInputTimeoutTimer?.cancel(); + _storeInputTimeoutTimer = Timer(_storeInputTimeout, () async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('draft_$roomId', text); + }); + if (text.endsWith(' ') && Matrix.of(context).hasComplexBundles) { final clients = currentRoomBundle; for (final client in clients) { final prefix = client!.sendPrefix; @@ -931,31 +1192,38 @@ class ChatController extends State { text.toLowerCase() == '${prefix.toLowerCase()} ') { setSendingClient(client); setState(() { - inputText = ''; - sendController.text = ''; + sendController.clear(); }); return; } } } - typingCoolDown?.cancel(); - typingCoolDown = Timer(const Duration(seconds: 2), () { - typingCoolDown = null; - currentlyTyping = false; - room!.setTyping(false); - }); - typingTimeout ??= Timer(const Duration(seconds: 30), () { - typingTimeout = null; - currentlyTyping = false; - }); - if (!currentlyTyping) { - currentlyTyping = true; - room! - .setTyping(true, timeout: const Duration(seconds: 30).inMilliseconds); + if (AppConfig.sendTypingNotifications) { + typingCoolDown?.cancel(); + typingCoolDown = Timer(const Duration(seconds: 2), () { + typingCoolDown = null; + currentlyTyping = false; + room.setTyping(false); + }); + typingTimeout ??= Timer(const Duration(seconds: 30), () { + typingTimeout = null; + currentlyTyping = false; + }); + if (!currentlyTyping) { + currentlyTyping = true; + room.setTyping( + true, + timeout: const Duration(seconds: 30).inMilliseconds, + ); + } } - setState(() => inputText = text); } + bool _inputTextIsEmpty = true; + + bool get isArchived => + {Membership.leave, Membership.ban}.contains(room.membership); + void showEventInfo([Event? event]) => (event ?? selectedEvents.single).showInfoDialog(context); @@ -963,69 +1231,113 @@ class ChatController extends State { // VoIP required Android SDK 21 if (PlatformInfos.isAndroid) { DeviceInfoPlugin().androidInfo.then((value) { - if ((value.version.sdkInt ?? 16) < 21) { + if (value.version.sdkInt < 21) { Navigator.pop(context); showOkAlertDialog( context: context, - title: L10n.of(context)!.unsupportedAndroidVersion, - message: L10n.of(context)!.unsupportedAndroidVersionLong, - okLabel: L10n.of(context)!.close, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, ); } }); } - final callType = await showModalActionSheet( + final callType = await showModalActionPopup( context: context, - title: L10n.of(context)!.warning, - message: L10n.of(context)!.videoCallsBetaWarning, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).warning, + message: L10n.of(context).videoCallsBetaWarning, + cancelLabel: L10n.of(context).cancel, actions: [ - SheetAction( - label: L10n.of(context)!.voiceCall, - icon: Icons.phone_outlined, - key: CallType.kVoice, + AdaptiveModalAction( + label: L10n.of(context).voiceCall, + icon: const Icon(Icons.phone_outlined), + value: CallType.kVoice, ), - SheetAction( - label: L10n.of(context)!.videoCall, - icon: Icons.video_call_outlined, - key: CallType.kVideo, + AdaptiveModalAction( + label: L10n.of(context).videoCall, + icon: const Icon(Icons.video_call_outlined), + value: CallType.kVideo, ), ], ); if (callType == null) return; - final success = await showFutureLoadingDialog( - context: context, - future: () => - Matrix.of(context).voipPlugin!.voip.requestTurnServerCredentials()); - if (success.result != null) { - final voipPlugin = Matrix.of(context).voipPlugin; - await voipPlugin!.voip.inviteToCall(room!.id, callType).catchError((e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text((e as Object).toLocalizedString(context))), - ); - }); - } else { - await showOkAlertDialog( - context: context, - title: L10n.of(context)!.unavailable, - okLabel: L10n.of(context)!.next, - useRootNavigator: false, + final voipPlugin = Matrix.of(context).voipPlugin; + try { + await voipPlugin!.voip.inviteToCall(room, callType); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), ); } } void cancelReplyEventAction() => setState(() { if (editEvent != null) { - inputText = sendController.text = pendingText; + sendController.text = pendingText; pendingText = ''; } replyEvent = null; editEvent = null; }); + late final ValueNotifier _displayChatDetailsColumn; + + void toggleDisplayChatDetailsColumn() async { + await Matrix.of(context).store.setBool( + SettingKeys.displayChatDetailsColumn, + !_displayChatDetailsColumn.value, + ); + _displayChatDetailsColumn.value = !_displayChatDetailsColumn.value; + } + @override - Widget build(BuildContext context) => ChatView(this); + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Row( + children: [ + Expanded( + child: ChatView(this), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: ValueListenableBuilder( + valueListenable: _displayChatDetailsColumn, + builder: (context, displayChatDetailsColumn, _) { + if (!FluffyThemes.isThreeColumnMode(context) || + room.membership != Membership.join || + !displayChatDetailsColumn) { + return const SizedBox( + height: double.infinity, + width: 0, + ); + } + return Container( + width: FluffyThemes.columnWidth, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + border: Border( + left: BorderSide( + width: 1, + color: theme.dividerColor, + ), + ), + ), + child: ChatDetails( + roomId: roomId, + embeddedCloseButton: IconButton( + icon: const Icon(Icons.close), + onPressed: toggleDisplayChatDetailsColumn, + ), + ), + ); + }, + ), + ), + ], + ); + } } enum EmojiPickerType { reaction, keyboard } diff --git a/lib/pages/chat/chat_app_bar_list_tile.dart b/lib/pages/chat/chat_app_bar_list_tile.dart new file mode 100644 index 0000000000..1ca0c5fba9 --- /dev/null +++ b/lib/pages/chat/chat_app_bar_list_tile.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_linkify/flutter_linkify.dart'; + +import 'package:fluffychat/utils/url_launcher.dart'; + +class ChatAppBarListTile extends StatelessWidget { + final Widget? leading; + final String title; + final Widget? trailing; + final void Function()? onTap; + + static const double fixedHeight = 40.0; + + const ChatAppBarListTile({ + super.key, + this.leading, + required this.title, + this.trailing, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final leading = this.leading; + final trailing = this.trailing; + return SizedBox( + height: fixedHeight, + child: InkWell( + onTap: onTap, + child: Row( + children: [ + if (leading != null) leading, + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Linkify( + text: title, + options: const LinkifyOptions(humanize: false), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: theme.colorScheme.onSurfaceVariant, + overflow: TextOverflow.ellipsis, + fontSize: 14, + ), + linkStyle: TextStyle( + color: theme.colorScheme.onSurfaceVariant, + fontSize: 14, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.onSurfaceVariant, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + if (trailing != null) trailing, + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart index 91a770f024..09ead63cef 100644 --- a/lib/pages/chat/chat_app_bar_title.dart +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -1,61 +1,85 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat.dart'; -import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; class ChatAppBarTitle extends StatelessWidget { final ChatController controller; - const ChatAppBarTitle(this.controller, {Key? key}) : super(key: key); + const ChatAppBarTitle(this.controller, {super.key}); @override Widget build(BuildContext context) { final room = controller.room; - if (room == null) { - return Container(); - } if (controller.selectedEvents.isNotEmpty) { return Text(controller.selectedEvents.length.toString()); } - final directChatMatrixID = room.directChatMatrixID; return InkWell( + hoverColor: Colors.transparent, splashColor: Colors.transparent, highlightColor: Colors.transparent, - onTap: directChatMatrixID != null - ? () => showModalBottomSheet( - context: context, - builder: (c) => UserBottomSheet( - user: room - .unsafeGetUserFromMemoryOrFallback(directChatMatrixID), - outerContext: context, - onMention: () => controller.sendController.text += - '${room.unsafeGetUserFromMemoryOrFallback(directChatMatrixID).mention} ', - ), - ) - : () => VRouter.of(context).toSegments(['rooms', room.id, 'details']), + onTap: controller.isArchived + ? null + : () => FluffyThemes.isThreeColumnMode(context) + ? controller.toggleDisplayChatDetailsColumn() + : context.go('/rooms/${room.id}/details'), child: Row( children: [ Hero( tag: 'content_banner', child: Avatar( mxContent: room.avatar, - name: room.displayname, + name: room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), size: 32, ), ), const SizedBox(width: 12), Expanded( - child: Text( - room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 16, - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 16, + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + child: PresenceBuilder( + userId: room.directChatMatrixID, + builder: (context, presence) { + final lastActiveTimestamp = presence?.lastActiveTimestamp; + final style = Theme.of(context).textTheme.bodySmall; + if (presence?.currentlyActive == true) { + return Text( + L10n.of(context).currentlyActive, + style: style, + ); + } + if (lastActiveTimestamp != null) { + return Text( + L10n.of(context).lastActiveAgo( + lastActiveTimestamp.localizedTimeShort(context), + ), + style: style, + ); + } + return const SizedBox.shrink(); + }, + ), + ), + ], ), ), ], diff --git a/lib/pages/chat/chat_emoji_picker.dart b/lib/pages/chat/chat_emoji_picker.dart index 069c4fc129..e819c57b5c 100644 --- a/lib/pages/chat/chat_emoji_picker.dart +++ b/lib/pages/chat/chat_emoji_picker.dart @@ -1,26 +1,104 @@ import 'package:flutter/material.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/sticker_picker_dialog.dart'; import 'chat.dart'; class ChatEmojiPicker extends StatelessWidget { final ChatController controller; - const ChatEmojiPicker(this.controller, {Key? key}) : super(key: key); + const ChatEmojiPicker(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); return AnimatedContainer( - duration: const Duration(milliseconds: 300), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), height: controller.showEmojiPicker ? MediaQuery.of(context).size.height / 2 : 0, child: controller.showEmojiPicker - ? EmojiPicker( - onEmojiSelected: controller.onEmojiSelected, - onBackspacePressed: controller.emojiPickerBackspace, + ? DefaultTabController( + length: 2, + child: Column( + children: [ + TabBar( + tabs: [ + Tab(text: L10n.of(context).emojis), + Tab(text: L10n.of(context).stickers), + ], + ), + Expanded( + child: TabBarView( + children: [ + EmojiPicker( + onEmojiSelected: controller.onEmojiSelected, + onBackspacePressed: controller.emojiPickerBackspace, + config: Config( + emojiViewConfig: EmojiViewConfig( + noRecents: const NoRecent(), + backgroundColor: + theme.colorScheme.onInverseSurface, + ), + bottomActionBarConfig: const BottomActionBarConfig( + enabled: false, + ), + categoryViewConfig: CategoryViewConfig( + backspaceColor: theme.colorScheme.primary, + iconColor: + theme.colorScheme.primary.withAlpha(128), + iconColorSelected: theme.colorScheme.primary, + indicatorColor: theme.colorScheme.primary, + ), + skinToneConfig: SkinToneConfig( + dialogBackgroundColor: Color.lerp( + theme.colorScheme.surface, + theme.colorScheme.primaryContainer, + 0.75, + )!, + indicatorColor: theme.colorScheme.onSurface, + ), + ), + ), + StickerPickerDialog( + room: controller.room, + onSelected: (sticker) { + controller.room.sendEvent( + { + 'body': sticker.body, + 'info': sticker.info ?? {}, + 'url': sticker.url.toString(), + }, + type: EventTypes.Sticker, + ); + controller.hideEmojiPicker(); + }, + ), + ], + ), + ), + ], + ), ) : null, ); } } + +class NoRecent extends StatelessWidget { + const NoRecent({super.key}); + + @override + Widget build(BuildContext context) { + return Text( + L10n.of(context).emoteKeyboardNoRecents, + style: Theme.of(context).textTheme.bodyLarge, + ); + } +} diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index da4f5d00e5..57ac404ab9 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; @@ -10,105 +9,156 @@ import 'package:fluffychat/pages/chat/events/message.dart'; import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/pages/chat/typing_indicators.dart'; import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; class ChatEventList extends StatelessWidget { final ChatController controller; const ChatEventList({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); @override Widget build(BuildContext context) { + final timeline = controller.timeline; + if (timeline == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0; + final events = timeline.events.filterByVisibleInGui(); + final animateInEventIndex = controller.animateInEventIndex; + // create a map of eventId --> index to greatly improve performance of // ListView's findChildIndexCallback final thisEventsKeyMap = {}; - for (var i = 0; i < controller.filteredEvents.length; i++) { - thisEventsKeyMap[controller.filteredEvents[i].eventId] = i; + for (var i = 0; i < events.length; i++) { + thisEventsKeyMap[events[i].eventId] = i; } - return ListView.custom( - padding: EdgeInsets.only( - top: 16, - bottom: 4, - left: horizontalPadding, - right: horizontalPadding, - ), - reverse: true, - controller: controller.scrollController, - keyboardDismissBehavior: PlatformInfos.isIOS - ? ScrollViewKeyboardDismissBehavior.onDrag - : ScrollViewKeyboardDismissBehavior.manual, - childrenDelegate: SliverChildBuilderDelegate( - (BuildContext context, int i) { - // Footer to display typing indicator and read receipts: - if (i == 0) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - SeenByRow(controller), - TypingIndicators(controller), - ], - ); - } - // Request history button or progress indicator: - if (i == controller.filteredEvents.length + 1) { - if (controller.timeline!.isRequestingHistory) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ); - } - if (controller.canLoadMore) { - Center( - child: OutlinedButton( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + final hasWallpaper = + controller.room.client.applicationAccountConfig.wallpaperUrl != null; + + return SelectionArea( + child: ListView.custom( + padding: EdgeInsets.only( + top: 16, + bottom: 8, + left: horizontalPadding, + right: horizontalPadding, + ), + reverse: true, + controller: controller.scrollController, + keyboardDismissBehavior: PlatformInfos.isIOS + ? ScrollViewKeyboardDismissBehavior.onDrag + : ScrollViewKeyboardDismissBehavior.manual, + childrenDelegate: SliverChildBuilderDelegate( + (BuildContext context, int i) { + // Footer to display typing indicator and read receipts: + if (i == 0) { + if (timeline.isRequestingFuture) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + if (timeline.canRequestFuture) { + return Center( + child: IconButton( + onPressed: controller.requestFuture, + icon: const Icon(Icons.refresh_outlined), ), - onPressed: controller.requestHistory, - child: Text(L10n.of(context)!.loadMore), - ), + ); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + SeenByRow(controller), + TypingIndicators(controller), + ], ); } - return Container(); - } - // The message at this index: - return AutoScrollTag( - key: ValueKey(controller.filteredEvents[i - 1].eventId), - index: i - 1, - controller: controller.scrollController, - child: Message(controller.filteredEvents[i - 1], - onSwipe: (direction) => controller.replyAction( - replyTo: controller.filteredEvents[i - 1]), - onInfoTab: controller.showEventInfo, - onAvatarTab: (Event event) => showModalBottomSheet( - context: context, - builder: (c) => UserBottomSheet( - user: event.senderFromMemoryOrFallback, - outerContext: context, - onMention: () => controller.sendController.text += - '${event.senderFromMemoryOrFallback.mention} ', + // Request history button or progress indicator: + if (i == events.length + 1) { + if (timeline.isRequestingHistory) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + if (timeline.canRequestHistory) { + return Builder( + builder: (context) { + WidgetsBinding.instance + .addPostFrameCallback(controller.requestHistory); + return Center( + child: IconButton( + onPressed: controller.requestHistory, + icon: const Icon(Icons.refresh_outlined), ), - ), - unfold: controller.unfold, + ); + }, + ); + } + return const SizedBox.shrink(); + } + i--; + + // The message at this index: + final event = events[i]; + final animateIn = animateInEventIndex != null && + timeline.events.length > animateInEventIndex && + event == timeline.events[animateInEventIndex]; + + return AutoScrollTag( + key: ValueKey(event.eventId), + index: i, + controller: controller.scrollController, + child: Message( + event, + animateIn: animateIn, + resetAnimateIn: () { + controller.animateInEventIndex = null; + }, + onSwipe: () => controller.replyAction(replyTo: event), + onInfoTab: controller.showEventInfo, + onAvatarTab: (Event event) => showAdaptiveBottomSheet( + context: context, + builder: (c) => UserBottomSheet( + user: event.senderFromMemoryOrFallback, + outerContext: context, + onMention: () => controller.sendController.text += + '${event.senderFromMemoryOrFallback.mention} ', + ), + ), + highlightMarker: + controller.scrollToEventIdMarker == event.eventId, onSelect: controller.onSelectMessage, scrollToEventId: (String eventId) => controller.scrollToEventId(eventId), - longPressSelect: controller.selectedEvents.isEmpty, - selected: controller.selectedEvents.any((e) => - e.eventId == controller.filteredEvents[i - 1].eventId), - timeline: controller.timeline!, - nextEvent: i < controller.filteredEvents.length - ? controller.filteredEvents[i] - : null), - ); - }, - childCount: controller.filteredEvents.length + 2, - findChildIndexCallback: (key) => - controller.findChildIndexCallback(key, thisEventsKeyMap), + longPressSelect: controller.selectedEvents.isNotEmpty, + selected: controller.selectedEvents + .any((e) => e.eventId == event.eventId), + timeline: timeline, + displayReadMarker: + i > 0 && controller.readMarkerEventId == event.eventId, + nextEvent: i + 1 < events.length ? events[i + 1] : null, + previousEvent: i > 0 ? events[i - 1] : null, + wallpaperMode: hasWallpaper, + ), + ); + }, + childCount: events.length + 2, + findChildIndexCallback: (key) => + controller.findChildIndexCallback(key, thisEventsKeyMap), + ), ), ); } diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 346b3b4429..9d4fe4602d 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,242 +1,242 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:animations/animations.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import '../../config/themes.dart'; import 'chat.dart'; import 'input_bar.dart'; class ChatInputRow extends StatelessWidget { final ChatController controller; - const ChatInputRow(this.controller, {Key? key}) : super(key: key); + const ChatInputRow(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); if (controller.showEmojiPicker && controller.emojiPickerType == EmojiPickerType.reaction) { - return Container(); + return const SizedBox.shrink(); } + const height = 48.0; return Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: controller.selectMode ? [ - SizedBox( - height: 56, - child: TextButton( - onPressed: controller.forwardEventsAction, - child: Row( - children: [ - const Icon(Icons.keyboard_arrow_left_outlined), - Text(L10n.of(context)!.forward), - ], + if (controller.selectedEvents + .every((event) => event.status == EventStatus.error)) + SizedBox( + height: height, + child: TextButton( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, + ), + onPressed: controller.deleteErrorEventsAction, + child: Row( + children: [ + const Icon(Icons.delete), + Text(L10n.of(context).delete), + ], + ), + ), + ) + else + SizedBox( + height: height, + child: TextButton( + onPressed: controller.forwardEventsAction, + child: Row( + children: [ + const Icon(Icons.keyboard_arrow_left_outlined), + Text(L10n.of(context).forward), + ], + ), ), ), - ), controller.selectedEvents.length == 1 ? controller.selectedEvents.first .getDisplayEvent(controller.timeline!) .status .isSent ? SizedBox( - height: 56, + height: height, child: TextButton( onPressed: controller.replyAction, child: Row( children: [ - Text(L10n.of(context)!.reply), + Text(L10n.of(context).reply), const Icon(Icons.keyboard_arrow_right), ], ), ), ) : SizedBox( - height: 56, + height: height, child: TextButton( onPressed: controller.sendAgainAction, child: Row( children: [ - Text(L10n.of(context)!.tryToSendAgain), + Text(L10n.of(context).tryToSendAgain), const SizedBox(width: 4), const Icon(Icons.send_outlined, size: 16), ], ), ), ) - : Container(), + : const SizedBox.shrink(), ] : [ - KeyBoardShortcuts( - child: AnimatedContainer( - duration: const Duration(milliseconds: 200), - height: 56, - width: controller.inputText.isEmpty ? 56 : 0, - alignment: Alignment.center, - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: PopupMenuButton( - icon: const Icon(Icons.add_outlined), - onSelected: controller.onAddPopupMenuButtonSelected, - itemBuilder: (BuildContext context) => - >[ + const SizedBox(width: 4), + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + height: height, + width: controller.sendController.text.isEmpty ? height : 0, + alignment: Alignment.center, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + child: PopupMenuButton( + icon: const Icon(Icons.add_outlined), + onSelected: controller.onAddPopupMenuButtonSelected, + itemBuilder: (BuildContext context) => + >[ + PopupMenuItem( + value: 'file', + child: ListTile( + leading: const CircleAvatar( + backgroundColor: Colors.green, + foregroundColor: Colors.white, + child: Icon(Icons.attachment_outlined), + ), + title: Text(L10n.of(context).sendFile), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: 'image', + child: ListTile( + leading: const CircleAvatar( + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + child: Icon(Icons.image_outlined), + ), + title: Text(L10n.of(context).sendImage), + contentPadding: const EdgeInsets.all(0), + ), + ), + if (PlatformInfos.isMobile) PopupMenuItem( - value: 'file', + value: 'camera', child: ListTile( leading: const CircleAvatar( - backgroundColor: Colors.green, + backgroundColor: Colors.purple, foregroundColor: Colors.white, - child: Icon(Icons.attachment_outlined), + child: Icon(Icons.camera_alt_outlined), ), - title: Text(L10n.of(context)!.sendFile), + title: Text(L10n.of(context).openCamera), contentPadding: const EdgeInsets.all(0), ), ), + if (PlatformInfos.isMobile) PopupMenuItem( - value: 'image', + value: 'camera-video', child: ListTile( leading: const CircleAvatar( - backgroundColor: Colors.blue, + backgroundColor: Colors.red, foregroundColor: Colors.white, - child: Icon(Icons.image_outlined), + child: Icon(Icons.videocam_outlined), ), - title: Text(L10n.of(context)!.sendImage), + title: Text(L10n.of(context).openVideoCamera), contentPadding: const EdgeInsets.all(0), ), ), - if (PlatformInfos.isMobile) - PopupMenuItem( - value: 'camera', - child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.purple, - foregroundColor: Colors.white, - child: Icon(Icons.camera_alt_outlined), - ), - title: Text(L10n.of(context)!.openCamera), - contentPadding: const EdgeInsets.all(0), - ), - ), - if (PlatformInfos.isMobile) - PopupMenuItem( - value: 'camera-video', - child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.red, - foregroundColor: Colors.white, - child: Icon(Icons.videocam_outlined), - ), - title: Text(L10n.of(context)!.openVideoCamera), - contentPadding: const EdgeInsets.all(0), - ), - ), - if (controller.room! - .getImagePacks(ImagePackUsage.sticker) - .isNotEmpty) - PopupMenuItem( - value: 'sticker', - child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.orange, - foregroundColor: Colors.white, - child: Icon(Icons.emoji_emotions_outlined), - ), - title: Text(L10n.of(context)!.sendSticker), - contentPadding: const EdgeInsets.all(0), - ), - ), - if (PlatformInfos.isMobile) - PopupMenuItem( - value: 'location', - child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.brown, - foregroundColor: Colors.white, - child: Icon(Icons.gps_fixed_outlined), - ), - title: Text(L10n.of(context)!.shareLocation), - contentPadding: const EdgeInsets.all(0), + if (PlatformInfos.isMobile) + PopupMenuItem( + value: 'location', + child: ListTile( + leading: const CircleAvatar( + backgroundColor: Colors.brown, + foregroundColor: Colors.white, + child: Icon(Icons.gps_fixed_outlined), ), + title: Text(L10n.of(context).shareLocation), + contentPadding: const EdgeInsets.all(0), ), - ], - ), + ), + ], ), - keysToPress: { - LogicalKeyboardKey.altLeft, - LogicalKeyboardKey.keyA - }, - onKeysPressed: () => - controller.onAddPopupMenuButtonSelected('file'), - helpLabel: L10n.of(context)!.sendFile, ), Container( - height: 56, + height: height, + width: height, alignment: Alignment.center, - child: KeyBoardShortcuts( - child: IconButton( - tooltip: L10n.of(context)!.emojis, - icon: PageTransitionSwitcher( - transitionBuilder: ( - Widget child, - Animation primaryAnimation, - Animation secondaryAnimation, - ) { - return SharedAxisTransition( - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - transitionType: SharedAxisTransitionType.scaled, - child: child, - fillColor: Colors.transparent, - ); - }, - child: Icon( - controller.showEmojiPicker - ? Icons.keyboard - : Icons.emoji_emotions_outlined, - key: ValueKey(controller.showEmojiPicker), - ), + child: IconButton( + tooltip: L10n.of(context).emojis, + icon: PageTransitionSwitcher( + transitionBuilder: ( + Widget child, + Animation primaryAnimation, + Animation secondaryAnimation, + ) { + return SharedAxisTransition( + animation: primaryAnimation, + secondaryAnimation: secondaryAnimation, + transitionType: SharedAxisTransitionType.scaled, + fillColor: Colors.transparent, + child: child, + ); + }, + child: Icon( + controller.showEmojiPicker + ? Icons.keyboard + : Icons.add_reaction_outlined, + key: ValueKey(controller.showEmojiPicker), ), - onPressed: controller.emojiPickerAction, ), - keysToPress: { - LogicalKeyboardKey.altLeft, - LogicalKeyboardKey.keyE - }, - onKeysPressed: controller.emojiPickerAction, - helpLabel: L10n.of(context)!.emojis, + onPressed: controller.emojiPickerAction, ), ), - if (controller.matrix!.isMultiAccount && - controller.matrix!.hasComplexBundles && - controller.matrix!.currentBundle!.length > 1) + if (Matrix.of(context).isMultiAccount && + Matrix.of(context).hasComplexBundles && + Matrix.of(context).currentBundle!.length > 1) Container( - height: 56, + width: height, + height: height, alignment: Alignment.center, child: _ChatAccountPicker(controller), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), + padding: const EdgeInsets.symmetric(vertical: 0.0), child: InputBar( - room: controller.room!, + room: controller.room, minLines: 1, maxLines: 8, autofocus: !PlatformInfos.isMobile, keyboardType: TextInputType.multiline, textInputAction: - AppConfig.sendOnEnter ? TextInputAction.send : null, + AppConfig.sendOnEnter == true && PlatformInfos.isMobile + ? TextInputAction.send + : null, onSubmitted: controller.onInputBarSubmitted, + onSubmitImage: controller.sendImageFromClipBoard, focusNode: controller.inputFocus, controller: controller.sendController, decoration: InputDecoration( - hintText: L10n.of(context)!.writeAMessage, + contentPadding: const EdgeInsets.only( + left: 6.0, + right: 6.0, + bottom: 6.0, + top: 3.0, + ), + hintText: L10n.of(context).writeAMessage, hintMaxLines: 1, border: InputBorder.none, enabledBorder: InputBorder.none, @@ -246,27 +246,37 @@ class ChatInputRow extends StatelessWidget { ), ), ), - if (PlatformInfos.platformCanRecord && - controller.inputText.isEmpty) - Container( - height: 56, - alignment: Alignment.center, - child: IconButton( - tooltip: L10n.of(context)!.voiceMessage, - icon: const Icon(Icons.mic_none_outlined), - onPressed: controller.voiceMessageAction, - ), - ), - if (!PlatformInfos.isMobile || controller.inputText.isNotEmpty) - Container( - height: 56, - alignment: Alignment.center, - child: IconButton( - icon: const Icon(Icons.send_outlined), - onPressed: controller.send, - tooltip: L10n.of(context)!.send, - ), - ), + Container( + height: height, + width: height, + alignment: Alignment.center, + child: PlatformInfos.platformCanRecord && + controller.sendController.text.isEmpty + ? FloatingActionButton.small( + tooltip: L10n.of(context).voiceMessage, + onPressed: controller.voiceMessageAction, + elevation: 0, + heroTag: null, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(height), + ), + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + child: const Icon(Icons.mic_none_outlined), + ) + : FloatingActionButton.small( + tooltip: L10n.of(context).send, + onPressed: controller.send, + elevation: 0, + heroTag: null, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(height), + ), + backgroundColor: theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.onPrimary, + child: const Icon(Icons.send_outlined), + ), + ), ], ); } @@ -275,10 +285,11 @@ class ChatInputRow extends StatelessWidget { class _ChatAccountPicker extends StatelessWidget { final ChatController controller; - const _ChatAccountPicker(this.controller, {Key? key}) : super(key: key); + const _ChatAccountPicker(this.controller); - void _popupMenuButtonSelected(String mxid) { - final client = controller.matrix!.currentBundle! + void _popupMenuButtonSelected(String mxid, BuildContext context) { + final client = Matrix.of(context) + .currentBundle! .firstWhere((cl) => cl!.userID == mxid, orElse: () => null); if (client == null) { Logs().w('Attempted to switch to a non-existing client $mxid'); @@ -289,37 +300,37 @@ class _ChatAccountPicker extends StatelessWidget { @override Widget build(BuildContext context) { - controller.matrix ??= Matrix.of(context); final clients = controller.currentRoomBundle; return Padding( padding: const EdgeInsets.all(8.0), child: FutureBuilder( - future: controller.sendingClient!.fetchOwnProfile(), + future: controller.sendingClient.fetchOwnProfile(), builder: (context, snapshot) => PopupMenuButton( - onSelected: _popupMenuButtonSelected, + onSelected: (mxid) => _popupMenuButtonSelected(mxid, context), itemBuilder: (BuildContext context) => clients - .map((client) => PopupMenuItem( - value: client!.userID, - child: FutureBuilder( - future: client.fetchOwnProfile(), - builder: (context, snapshot) => ListTile( - leading: Avatar( - mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - client.userID!.localpart, - size: 20, - ), - title: - Text(snapshot.data?.displayName ?? client.userID!), - contentPadding: const EdgeInsets.all(0), + .map( + (client) => PopupMenuItem( + value: client!.userID, + child: FutureBuilder( + future: client.fetchOwnProfile(), + builder: (context, snapshot) => ListTile( + leading: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? + client.userID!.localpart, + size: 20, ), + title: Text(snapshot.data?.displayName ?? client.userID!), + contentPadding: const EdgeInsets.all(0), ), - )) + ), + ), + ) .toList(), child: Avatar( mxContent: snapshot.data?.avatarUrl, name: snapshot.data?.displayName ?? - controller.matrix!.client.userID!.localpart, + Matrix.of(context).client.userID!.localpart, size: 20, ), ), diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 3f1fdcc8d2..08152d2cbe 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -1,26 +1,29 @@ +import 'dart:ui' as ui; + import 'package:flutter/material.dart'; +import 'package:badges/badges.dart'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; import 'package:fluffychat/pages/chat/chat_app_bar_title.dart'; import 'package:fluffychat/pages/chat/chat_event_list.dart'; import 'package:fluffychat/pages/chat/encryption_button.dart'; import 'package:fluffychat/pages/chat/pinned_events.dart'; import 'package:fluffychat/pages/chat/reactions_picker.dart'; import 'package:fluffychat/pages/chat/reply_display.dart'; -import 'package:fluffychat/pages/chat/tombstone_display.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/connection_status_header.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import 'package:fluffychat/widgets/unread_badge_back_button.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/unread_rooms_badge.dart'; import '../../utils/stream_extension.dart'; import 'chat_emoji_picker.dart'; import 'chat_input_row.dart'; @@ -30,7 +33,7 @@ enum _EventContextAction { info, report } class ChatView extends StatelessWidget { final ChatController controller; - const ChatView(this.controller, {Key? key}) : super(key: key); + const ChatView(this.controller, {super.key}); List _appBarActions(BuildContext context) { if (controller.selectMode) { @@ -38,31 +41,35 @@ class ChatView extends StatelessWidget { if (controller.canEditSelectedEvents) IconButton( icon: const Icon(Icons.edit_outlined), - tooltip: L10n.of(context)!.edit, + tooltip: L10n.of(context).edit, onPressed: controller.editSelectedEventAction, ), IconButton( icon: const Icon(Icons.copy_outlined), - tooltip: L10n.of(context)!.copy, + tooltip: L10n.of(context).copy, onPressed: controller.copyEventsAction, ), if (controller.canSaveSelectedEvent) + // Use builder context to correctly position the share dialog on iPad + Builder( + builder: (context) => IconButton( + icon: Icon(Icons.adaptive.share), + tooltip: L10n.of(context).share, + onPressed: () => controller.saveSelectedEvent(context), + ), + ), + if (controller.canPinSelectedEvents) IconButton( - icon: Icon(Icons.adaptive.share), - tooltip: L10n.of(context)!.share, - onPressed: controller.saveSelectedEvent, + icon: const Icon(Icons.push_pin_outlined), + onPressed: controller.pinEvent, + tooltip: L10n.of(context).pinMessage, ), if (controller.canRedactSelectedEvents) IconButton( icon: const Icon(Icons.delete_outlined), - tooltip: L10n.of(context)!.redactMessage, + tooltip: L10n.of(context).redactMessage, onPressed: controller.redactEventsAction, ), - IconButton( - icon: const Icon(Icons.push_pin_outlined), - onPressed: controller.pinEvent, - tooltip: L10n.of(context)!.pinMessage, - ), if (controller.selectedEvents.length == 1) PopupMenuButton<_EventContextAction>( onSelected: (action) { @@ -84,217 +91,291 @@ class ChatView extends StatelessWidget { children: [ const Icon(Icons.info_outlined), const SizedBox(width: 12), - Text(L10n.of(context)!.messageInfo), + Text(L10n.of(context).messageInfo), ], ), ), - PopupMenuItem( - value: _EventContextAction.report, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon( - Icons.shield_outlined, - color: Colors.red, - ), - const SizedBox(width: 12), - Text(L10n.of(context)!.reportMessage), - ], + if (controller.selectedEvents.single.status.isSent) + PopupMenuItem( + value: _EventContextAction.report, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.shield_outlined, + color: Colors.red, + ), + const SizedBox(width: 12), + Text(L10n.of(context).reportMessage), + ], + ), ), - ), ], ), ]; - } else { + } else if (!controller.room.isArchived) { return [ if (Matrix.of(context).voipPlugin != null && - controller.room!.isDirectChat) + controller.room.isDirectChat) IconButton( onPressed: controller.onPhoneButtonTap, icon: const Icon(Icons.call_outlined), - tooltip: L10n.of(context)!.placeCall, + tooltip: L10n.of(context).placeCall, ), - EncryptionButton(controller.room!), - ChatSettingsPopupMenu(controller.room!, !controller.room!.isDirectChat), + EncryptionButton(controller.room), + ChatSettingsPopupMenu(controller.room, true), ]; } + return []; } @override Widget build(BuildContext context) { - controller.matrix ??= Matrix.of(context); - final client = controller.matrix!.client; - controller.sendingClient ??= client; - controller.room = controller.sendingClient!.getRoomById(controller.roomId!); - if (controller.room == null) { - return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.oopsSomethingWentWrong), - ), - body: Center( - child: Text(L10n.of(context)!.youAreNoLongerParticipatingInThisChat), - ), - ); - } - - if (controller.room!.membership == Membership.invite) { + final theme = Theme.of(context); + if (controller.room.membership == Membership.invite) { showFutureLoadingDialog( - context: context, future: () => controller.room!.join()); + context: context, + future: () => controller.room.join(), + exceptionContext: ExceptionContext.joinRoom, + ); } final bottomSheetPadding = FluffyThemes.isColumnMode(context) ? 16.0 : 8.0; + final scrollUpBannerEventId = controller.scrollUpBannerEventId; - return VWidgetGuard( - onSystemPop: (redirector) async { + final accountConfig = Matrix.of(context).client.applicationAccountConfig; + + return PopScope( + canPop: controller.selectedEvents.isEmpty && !controller.showEmojiPicker, + onPopInvokedWithResult: (pop, _) async { + if (pop) return; if (controller.selectedEvents.isNotEmpty) { controller.clearSelectedEvents(); - redirector.stopRedirection(); } else if (controller.showEmojiPicker) { controller.emojiPickerAction(); - redirector.stopRedirection(); } }, - child: GestureDetector( - onTapDown: controller.setReadMarker, - behavior: HitTestBehavior.opaque, - child: StreamBuilder( - stream: controller.room!.onUpdate.stream - .rateLimit(const Duration(milliseconds: 250)), - builder: (context, snapshot) => FutureBuilder( - future: controller.getTimeline(), - builder: (BuildContext context, snapshot) { - return Scaffold( - appBar: AppBar( - elevation: 2, - actionsIconTheme: IconThemeData( - color: controller.selectedEvents.isEmpty - ? null - : Theme.of(context).colorScheme.primary, - ), - leading: controller.selectMode - ? IconButton( - icon: const Icon(Icons.close), - onPressed: controller.clearSelectedEvents, - tooltip: L10n.of(context)!.close, - color: Theme.of(context).colorScheme.primary, - ) - : UnreadBadgeBackButton(roomId: controller.roomId!), - titleSpacing: 0, - title: ChatAppBarTitle(controller), - actions: _appBarActions(context), + child: StreamBuilder( + stream: controller.room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id) + .rateLimit(const Duration(seconds: 1)), + builder: (context, snapshot) => FutureBuilder( + future: controller.loadTimelineFuture, + builder: (BuildContext context, snapshot) { + var appbarBottomHeight = 0.0; + if (controller.room.pinnedEventIds.isNotEmpty) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + if (scrollUpBannerEventId != null) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + final tombstoneEvent = + controller.room.getState(EventTypes.RoomTombstone); + if (tombstoneEvent != null) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + return Scaffold( + appBar: AppBar( + actionsIconTheme: IconThemeData( + color: controller.selectedEvents.isEmpty + ? null + : theme.colorScheme.primary, ), - floatingActionButton: controller.showScrollDownButton && - controller.selectedEvents.isEmpty - ? Padding( - padding: const EdgeInsets.only(bottom: 56.0), - child: FloatingActionButton( - onPressed: controller.scrollDown, - mini: true, - child: const Icon(Icons.arrow_downward_outlined), - ), + leading: controller.selectMode + ? IconButton( + icon: const Icon(Icons.close), + onPressed: controller.clearSelectedEvents, + tooltip: L10n.of(context).close, + color: theme.colorScheme.primary, ) - : null, - backgroundColor: Theme.of(context).colorScheme.surface, - body: DropTarget( - onDragDone: controller.onDragDone, - onDragEntered: controller.onDragEntered, - onDragExited: controller.onDragExited, - child: Stack( - children: [ - if (Matrix.of(context).wallpaper != null) - Image.file( - Matrix.of(context).wallpaper!, - width: double.infinity, - height: double.infinity, - fit: BoxFit.cover, - ), - SafeArea( - child: Column( - children: [ - TombstoneDisplay(controller), - PinnedEvents(controller), - Expanded( - child: GestureDetector( - onTap: controller.clearSingleSelectedEvent, - child: Builder( - builder: (context) { - if (snapshot.hasError) { - SentryController.captureException( - snapshot.error, - StackTrace.current, - ); - } - if (controller.timeline == null) { - return const Center( - child: CircularProgressIndicator - .adaptive(strokeWidth: 2), - ); - } - - return ChatEventList( - controller: controller, - ); - }, - )), - ), - if (controller.room!.canSendDefaultMessages && - controller.room!.membership == Membership.join) - Container( - margin: EdgeInsets.only( - bottom: bottomSheetPadding, - left: bottomSheetPadding, - right: bottomSheetPadding, - ), - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 2.5), - alignment: Alignment.center, - child: Material( - borderRadius: const BorderRadius.only( - bottomLeft: - Radius.circular(AppConfig.borderRadius), - bottomRight: - Radius.circular(AppConfig.borderRadius), - ), - elevation: 6, - shadowColor: Theme.of(context) - .dividerColor - .withAlpha(100), - clipBehavior: Clip.hardEdge, - color: Theme.of(context).brightness == - Brightness.light - ? Colors.white - : Colors.black, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const ConnectionStatusHeader(), - ReactionsPicker(controller), - ReplyDisplay(controller), - ChatInputRow(controller), - ChatEmojiPicker(controller), - ], - ), - ), - ), - ], + : StreamBuilder( + stream: Matrix.of(context) + .client + .onSync + .stream + .where((syncUpdate) => syncUpdate.hasRoomUpdate), + builder: (context, _) => UnreadRoomsBadge( + filter: (r) => r.id != controller.roomId, + badgePosition: BadgePosition.topEnd(end: 8, top: 4), + child: const Center(child: BackButton()), ), ), - if (controller.dragging) - Container( - color: Theme.of(context) - .scaffoldBackgroundColor - .withOpacity(0.9), - alignment: Alignment.center, - child: const Icon( - Icons.upload_outlined, - size: 100, + titleSpacing: 0, + title: ChatAppBarTitle(controller), + actions: _appBarActions(context), + bottom: PreferredSize( + preferredSize: Size.fromHeight(appbarBottomHeight), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + PinnedEvents(controller), + if (tombstoneEvent != null) + ChatAppBarListTile( + title: tombstoneEvent.parsedTombstoneContent.body, + leading: const Padding( + padding: EdgeInsets.all(8.0), + child: Icon(Icons.upgrade_outlined), + ), + trailing: TextButton( + onPressed: controller.goToNewRoomAction, + child: Text(L10n.of(context).goToTheNewRoom), + ), + ), + if (scrollUpBannerEventId != null) + ChatAppBarListTile( + leading: IconButton( + color: theme.colorScheme.onSurfaceVariant, + icon: const Icon(Icons.close), + tooltip: L10n.of(context).close, + onPressed: () { + controller.discardScrollUpBannerEventId(); + controller.setReadMarker(); + }, + ), + title: L10n.of(context).jumpToLastReadMessage, + trailing: TextButton( + onPressed: () { + controller.scrollToEventId( + scrollUpBannerEventId, + ); + controller.discardScrollUpBannerEventId(); + }, + child: Text(L10n.of(context).jump), ), ), ], ), ), - ); - }, - ), + ), + floatingActionButton: controller.showScrollDownButton && + controller.selectedEvents.isEmpty + ? Padding( + padding: const EdgeInsets.only(bottom: 56.0), + child: FloatingActionButton( + onPressed: controller.scrollDown, + heroTag: null, + mini: true, + child: const Icon(Icons.arrow_downward_outlined), + ), + ) + : null, + body: DropTarget( + onDragDone: controller.onDragDone, + onDragEntered: controller.onDragEntered, + onDragExited: controller.onDragExited, + child: Stack( + children: [ + if (accountConfig.wallpaperUrl != null) + Opacity( + opacity: accountConfig.wallpaperOpacity ?? 0.5, + child: ImageFiltered( + imageFilter: ui.ImageFilter.blur( + sigmaX: accountConfig.wallpaperBlur ?? 0.0, + sigmaY: accountConfig.wallpaperBlur ?? 0.0, + ), + child: MxcImage( + cacheKey: accountConfig.wallpaperUrl.toString(), + uri: accountConfig.wallpaperUrl, + fit: BoxFit.cover, + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + isThumbnail: false, + placeholder: (_) => Container(), + ), + ), + ), + SafeArea( + child: Column( + children: [ + Expanded( + child: GestureDetector( + onTap: controller.clearSingleSelectedEvent, + child: ChatEventList(controller: controller), + ), + ), + if (controller.room.canSendDefaultMessages && + controller.room.membership == Membership.join) + Container( + margin: EdgeInsets.only( + bottom: bottomSheetPadding, + left: bottomSheetPadding, + right: bottomSheetPadding, + ), + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 2.5, + ), + alignment: Alignment.center, + child: Material( + clipBehavior: Clip.hardEdge, + color: theme.colorScheme.surfaceContainerHigh, + borderRadius: const BorderRadius.all( + Radius.circular(24), + ), + child: controller.room.isAbandonedDMRoom == true + ? Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + TextButton.icon( + style: TextButton.styleFrom( + padding: const EdgeInsets.all( + 16, + ), + foregroundColor: + theme.colorScheme.error, + ), + icon: const Icon( + Icons.archive_outlined, + ), + onPressed: controller.leaveChat, + label: Text( + L10n.of(context).leave, + ), + ), + TextButton.icon( + style: TextButton.styleFrom( + padding: const EdgeInsets.all( + 16, + ), + ), + icon: const Icon( + Icons.forum_outlined, + ), + onPressed: controller.recreateChat, + label: Text( + L10n.of(context).reopenChat, + ), + ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + const ConnectionStatusHeader(), + ReactionsPicker(controller), + ReplyDisplay(controller), + ChatInputRow(controller), + ChatEmojiPicker(controller), + ], + ), + ), + ), + ], + ), + ), + if (controller.dragging) + Container( + color: theme.scaffoldBackgroundColor.withAlpha(230), + alignment: Alignment.center, + child: const Icon( + Icons.upload_outlined, + size: 100, + ), + ), + ], + ), + ), + ); + }, ), ), ); diff --git a/lib/pages/chat/command_hints.dart b/lib/pages/chat/command_hints.dart index 617c4f80ba..ccc405aa5e 100644 --- a/lib/pages/chat/command_hints.dart +++ b/lib/pages/chat/command_hints.dart @@ -2,6 +2,28 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; +String commandExample(String command) { + switch (command) { + case 'markasdm': + case 'kick': + case 'dm': + case 'ban': + case 'unban': + case 'ignore': + case 'unignore': + case 'invite': + return '/$command '; + case 'html': + case 'sendraw': + case 'plain': + return '/$command '; + case 'op': + return '/$command '; + default: + return '/$command'; + } +} + String commandHint(L10n l10n, String command) { switch (command) { case "ban": @@ -40,6 +62,22 @@ String commandHint(L10n l10n, String command) { return l10n.commandHint_send; case "unban": return l10n.commandHint_unban; + case 'markasdm': + return l10n.commandHint_markasdm; + case 'markasgroup': + return l10n.commandHint_markasgroup; + case 'googly': + return l10n.commandHint_googly; + case 'hug': + return l10n.commandHint_hug; + case 'cuddle': + return l10n.commandHint_cuddle; + case 'sendraw': + return l10n.commandHint_sendraw; + case 'ignore': + return l10n.commandHint_ignore; + case 'unignore': + return l10n.commandHint_unignore; default: return ""; } diff --git a/lib/pages/chat/cupertino_widgets_bottom_sheet.dart b/lib/pages/chat/cupertino_widgets_bottom_sheet.dart deleted file mode 100644 index 9079475683..0000000000 --- a/lib/pages/chat/cupertino_widgets_bottom_sheet.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/link.dart'; - -import 'edit_widgets_dialog.dart'; - -class CupertinoWidgetsBottomSheet extends StatelessWidget { - final Room room; - - const CupertinoWidgetsBottomSheet({Key? key, required this.room}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return CupertinoActionSheet( - title: Text(L10n.of(context)!.matrixWidgets), - actions: [ - ...room.widgets.map( - (widget) => Link( - builder: (context, callback) { - return CupertinoActionSheetAction( - child: Text(widget.name ?? widget.url), - onPressed: callback ?? () {}, - ); - }, - target: LinkTarget.blank, - uri: Uri.parse(widget.url), - ), - ), - CupertinoActionSheetAction( - child: Text(L10n.of(context)!.editWidgets), - onPressed: () { - Navigator.of(context).pop(); - showCupertinoDialog( - context: context, - builder: (context) => EditWidgetsDialog(room: room), - useRootNavigator: false, - ); - }, - ), - CupertinoActionSheetAction( - child: Text(L10n.of(context)!.cancel), - onPressed: Navigator.of(context).pop, - ), - ], - ); - } -} diff --git a/lib/pages/chat/edit_widgets_dialog.dart b/lib/pages/chat/edit_widgets_dialog.dart deleted file mode 100644 index 8d35191377..0000000000 --- a/lib/pages/chat/edit_widgets_dialog.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'add_widget_tile.dart'; - -class EditWidgetsDialog extends StatelessWidget { - final Room room; - - const EditWidgetsDialog({Key? key, required this.room}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SimpleDialog( - title: Text(L10n.of(context)!.editWidgets), - children: [ - ...room.widgets.map((e) => ListTile( - title: Text(e.name ?? e.type), - leading: IconButton( - onPressed: () { - room.deleteWidget(e.id!); - Navigator.of(context).pop(); - }, - icon: const Icon(Icons.delete)), - )), - AddWidgetTile(room: room), - ], - ); - } -} diff --git a/lib/pages/chat/encryption_button.dart b/lib/pages/chat/encryption_button.dart index 89fe0b6e33..9eae07677c 100644 --- a/lib/pages/chat/encryption_button.dart +++ b/lib/pages/chat/encryption_button.dart @@ -1,114 +1,47 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import '../../widgets/matrix.dart'; -class EncryptionButton extends StatefulWidget { +class EncryptionButton extends StatelessWidget { final Room room; - const EncryptionButton(this.room, {Key? key}) : super(key: key); - @override - _EncryptionButtonState createState() => _EncryptionButtonState(); -} - -class _EncryptionButtonState extends State { - StreamSubscription? _onSyncSub; - - void _enableEncryptionAction() async { - if (widget.room.encrypted) { - VRouter.of(context).toSegments(['rooms', widget.room.id, 'encryption']); - return; - } - if (widget.room.joinRules == JoinRules.public) { - await showOkAlertDialog( - useRootNavigator: false, - context: context, - okLabel: L10n.of(context)!.ok, - message: L10n.of(context)!.noEncryptionForPublicRooms, - ); - return; - } - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.enableEncryption, - message: widget.room.client.encryptionEnabled - ? L10n.of(context)!.enableEncryptionWarning - : L10n.of(context)!.needPantalaimonWarning, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok) { - await showFutureLoadingDialog( - context: context, - future: () => widget.room.enableEncryption(), - ); - // we want to enable the lock icon - setState(() {}); - } - } - - @override - void dispose() { - _onSyncSub?.cancel(); - super.dispose(); - } + const EncryptionButton(this.room, {super.key}); @override Widget build(BuildContext context) { - if (widget.room.encrypted) { - _onSyncSub ??= Matrix.of(context) + return StreamBuilder( + stream: Matrix.of(context) .client .onSync .stream - .where((s) => s.deviceLists != null) - .listen((s) => setState(() {})); - } - return FutureBuilder>( - future: - widget.room.encrypted ? widget.room.requestParticipants() : null, - builder: (BuildContext context, snapshot) { - Color? color; - if (widget.room.encrypted && snapshot.hasData) { - final users = snapshot.data!; - users.removeWhere((u) => - !{Membership.invite, Membership.join}.contains(u.membership) || - !widget.room.client.userDeviceKeys.containsKey(u.id)); - var allUsersValid = true; - var oneUserInvalid = false; - for (final u in users) { - final status = widget.room.client.userDeviceKeys[u.id]!.verified; - if (status != UserVerifiedStatus.verified) { - allUsersValid = false; - } - if (status == UserVerifiedStatus.unknownDevice) { - oneUserInvalid = true; - } - } - if (oneUserInvalid) color = Colors.red; - if (!allUsersValid) color = Colors.orange; - } else if (!widget.room.encrypted && - widget.room.joinRules != JoinRules.public) { - color = Colors.red; - } - return IconButton( - tooltip: widget.room.encrypted - ? L10n.of(context)!.encrypted - : L10n.of(context)!.encryptionNotEnabled, + .where((s) => s.deviceLists != null), + builder: (context, snapshot) { + return FutureBuilder( + future: room.encrypted + ? room.calcEncryptionHealthState() + : Future.value(EncryptionHealthState.allVerified), + builder: (BuildContext context, snapshot) => IconButton( + tooltip: room.encrypted + ? L10n.of(context).encrypted + : L10n.of(context).encryptionNotEnabled, icon: Icon( - widget.room.encrypted - ? Icons.lock_outlined - : Icons.lock_open_outlined, - size: 20, - color: color), - onPressed: _enableEncryptionAction, - ); - }); + room.encrypted ? Icons.lock_outlined : Icons.lock_open_outlined, + size: 20, + color: room.joinRules != JoinRules.public && !room.encrypted + ? Colors.red + : room.joinRules != JoinRules.public && + snapshot.data == + EncryptionHealthState.unverifiedDevices + ? Colors.orange + : null, + ), + onPressed: () => context.go('/rooms/${room.id}/encryption'), + ), + ); + }, + ); } } diff --git a/lib/pages/chat/event_info_dialog.dart b/lib/pages/chat/event_info_dialog.dart index 16862bf089..dca325dfd3 100644 --- a/lib/pages/chat/event_info_dialog.dart +++ b/lib/pages/chat/event_info_dialog.dart @@ -6,14 +6,15 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; extension EventInfoDialogExtension on Event { - void showInfoDialog(BuildContext context) => showModalBottomSheet( + void showInfoDialog(BuildContext context) => showAdaptiveBottomSheet( context: context, builder: (context) => - EventInfoDialog(l10n: L10n.of(context)!, event: this), + EventInfoDialog(l10n: L10n.of(context), event: this), ); } @@ -23,25 +24,27 @@ class EventInfoDialog extends StatelessWidget { const EventInfoDialog({ required this.event, required this.l10n, - Key? key, - }) : super(key: key); + super.key, + }); - String get prettyJson { - const JsonDecoder decoder = JsonDecoder(); - const JsonEncoder encoder = JsonEncoder.withIndent(' '); + String prettyJson(MatrixEvent event) { + const decoder = JsonDecoder(); + const encoder = JsonEncoder.withIndent(' '); final object = decoder.convert(jsonEncode(event.toJson())); return encoder.convert(object); } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final originalSource = event.originalSource; return Scaffold( appBar: AppBar( - title: Text(L10n.of(context)!.messageInfo), + title: Text(L10n.of(context).messageInfo), leading: IconButton( icon: const Icon(Icons.arrow_downward_outlined), onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, + tooltip: L10n.of(context).close, ), ), body: ListView( @@ -50,49 +53,62 @@ class EventInfoDialog extends StatelessWidget { leading: Avatar( mxContent: event.senderFromMemoryOrFallback.avatarUrl, name: event.senderFromMemoryOrFallback.calcDisplayname(), + client: event.room.client, + presenceUserId: event.senderId, ), - title: Text(L10n.of(context)!.sender), + title: Text(L10n.of(context).sender), subtitle: Text( - '${event.senderFromMemoryOrFallback.calcDisplayname()} [${event.senderId}]'), + '${event.senderFromMemoryOrFallback.calcDisplayname()} [${event.senderId}]', + ), ), ListTile( - title: Text(L10n.of(context)!.time), + title: Text('${L10n.of(context).time}:'), subtitle: Text(event.originServerTs.localizedTime(context)), ), ListTile( - title: Text(L10n.of(context)!.messageType), - subtitle: Text(event.humanreadableType), + title: Text('${L10n.of(context).status}:'), + subtitle: Text(event.status.name), ), - ListTile(title: Text('${L10n.of(context)!.sourceCode}:')), + ListTile(title: Text('${L10n.of(context).sourceCode}:')), Padding( padding: const EdgeInsets.all(12.0), child: Material( borderRadius: BorderRadius.circular(AppConfig.borderRadius), - color: Theme.of(context).colorScheme.surface, + color: theme.colorScheme.surfaceContainer, child: SingleChildScrollView( - padding: const EdgeInsets.all(8), + padding: const EdgeInsets.all(16), scrollDirection: Axis.horizontal, - child: SelectableText(prettyJson), + child: SelectableText( + prettyJson(MatrixEvent.fromJson(event.toJson())), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), ), ), ), + if (originalSource != null) ...[ + ListTile(title: Text('${L10n.of(context).encrypted}:')), + Padding( + padding: const EdgeInsets.all(12.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: SelectableText( + prettyJson(originalSource), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + ], ], ), ); } } - -extension on Event { - String get humanreadableType { - if (type == EventTypes.Message) { - return messageType.split('m.').last; - } - if (type.startsWith('m.room.')) { - return type.split('m.room.').last; - } - if (type.startsWith('m.')) { - return type.split('m.').last; - } - return type; - } -} diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 9b6177a745..1fb65dc24e 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -1,37 +1,47 @@ import 'dart:async'; import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; +import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; -import '../../../utils/matrix_sdk_extensions.dart/event_extension.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import '../../../utils/matrix_sdk_extensions/event_extension.dart'; class AudioPlayerWidget extends StatefulWidget { final Color color; + final double fontSize; final Event event; static String? currentId; static const int wavesCount = 40; - const AudioPlayerWidget(this.event, {this.color = Colors.black, Key? key}) - : super(key: key); + const AudioPlayerWidget( + this.event, { + this.color = Colors.black, + required this.fontSize, + super.key, + }); @override - _AudioPlayerState createState() => _AudioPlayerState(); + AudioPlayerState createState() => AudioPlayerState(); } enum AudioPlayerStatus { notDownloaded, downloading, downloaded } -class _AudioPlayerState extends State { +class AudioPlayerState extends State { AudioPlayerStatus status = AudioPlayerStatus.notDownloaded; - final AudioPlayer audioPlayer = AudioPlayer(); + AudioPlayer? audioPlayer; StreamSubscription? onAudioPositionChanged; StreamSubscription? onDurationChanged; @@ -39,15 +49,16 @@ class _AudioPlayerState extends State { StreamSubscription? onPlayerError; String? statusText; - int currentPosition = 0; - double maxPosition = 0; + double currentPosition = 0; + double maxPosition = 1; + MatrixFile? matrixFile; File? audioFile; @override void dispose() { - if (audioPlayer.playerState.playing) { - audioPlayer.stop(); + if (audioPlayer?.playerState.playing == true) { + audioPlayer?.stop(); } onAudioPositionChanged?.cancel(); onDurationChanged?.cancel(); @@ -57,21 +68,44 @@ class _AudioPlayerState extends State { super.dispose(); } + void _startAction() { + if (status == AudioPlayerStatus.downloaded) { + _playAction(); + } else { + _downloadAction(); + } + } + Future _downloadAction() async { if (status != AudioPlayerStatus.notDownloaded) return; setState(() => status = AudioPlayerStatus.downloading); try { - final matrixFile = - await widget.event.downloadAndDecryptAttachmentCached(); - if (matrixFile == null) throw ('Download failed'); - final tempDir = await getTemporaryDirectory(); - final fileName = Uri.encodeComponent( - widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last); - final file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); - await file.writeAsBytes(matrixFile.bytes); + final matrixFile = await widget.event.downloadAndDecryptAttachment(); + File? file; + + if (!kIsWeb) { + final tempDir = await getTemporaryDirectory(); + final fileName = Uri.encodeComponent( + widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, + ); + file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); + + await file.writeAsBytes(matrixFile.bytes); + + if (Platform.isIOS && + matrixFile.mimeType.toLowerCase() == 'audio/ogg') { + Logs().v('Convert ogg audio file for iOS...'); + final convertedFile = File('${file.path}.caf'); + if (await convertedFile.exists() == false) { + OpusCaf().convertOpusToCaf(file.path, convertedFile.path); + } + file = convertedFile; + } + } setState(() { audioFile = file; + this.matrixFile = matrixFile; status = AudioPlayerStatus.downloaded; }); _playAction(); @@ -86,6 +120,7 @@ class _AudioPlayerState extends State { } void _playAction() async { + final audioPlayer = this.audioPlayer ??= AudioPlayer(); if (AudioPlayerWidget.currentId != widget.event.eventId) { if (AudioPlayerWidget.currentId != null) { if (audioPlayer.playerState.playing) { @@ -104,28 +139,33 @@ class _AudioPlayerState extends State { } onAudioPositionChanged ??= audioPlayer.positionStream.listen((state) { + if (maxPosition <= 0) return; setState(() { statusText = '${state.inMinutes.toString().padLeft(2, '0')}:${(state.inSeconds % 60).toString().padLeft(2, '0')}'; - currentPosition = ((state.inMilliseconds.toDouble() / maxPosition) * - AudioPlayerWidget.wavesCount) - .round(); + currentPosition = state.inMilliseconds.toDouble(); }); + if (state.inMilliseconds.toDouble() == maxPosition) { + audioPlayer.stop(); + audioPlayer.seek(null); + } + }); + onDurationChanged ??= audioPlayer.durationStream.listen((max) { + if (max == null || max == Duration.zero) return; + setState(() => maxPosition = max.inMilliseconds.toDouble()); }); - onDurationChanged ??= audioPlayer.durationStream.listen((max) => max == null - ? null - : setState(() => maxPosition = max.inMilliseconds.toDouble())); onPlayerStateChanged ??= audioPlayer.playingStream.listen((_) => setState(() {})); - audioPlayer.setFilePath(audioFile!.path); - audioPlayer.play().catchError((e, s) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.oopsSomethingWentWrong), - ), - ); - SentryController.captureException(e, s); - }); + final audioFile = this.audioFile; + if (audioFile != null) { + audioPlayer.setFilePath(audioFile.path); + } else { + await audioPlayer.setAudioSource(MatrixFileAudioSource(matrixFile!)); + } + audioPlayer.play().onError( + ErrorReporter(context, 'Unable to play audio message') + .onErrorCallback, + ); } static const double buttonSize = 36; @@ -139,12 +179,12 @@ class _AudioPlayerState extends State { return '${duration.inMinutes.toString().padLeft(2, '0')}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}'; } - List _getWaveform() { + List? _getWaveform() { final eventWaveForm = widget.event.content .tryGetMap('org.matrix.msc1767.audio') ?.tryGetList('waveform'); - if (eventWaveForm == null) { - return List.filled(AudioPlayerWidget.wavesCount, 500); + if (eventWaveForm == null || eventWaveForm.isEmpty) { + return null; } while (eventWaveForm.length < AudioPlayerWidget.wavesCount) { for (var i = 0; i < eventWaveForm.length; i = i + 2) { @@ -160,93 +200,225 @@ class _AudioPlayerState extends State { return eventWaveForm.map((i) => i > 1024 ? 1024 : i).toList(); } - late final List waveform; + late final List? _waveform; + + void _toggleSpeed() async { + final audioPlayer = this.audioPlayer; + if (audioPlayer == null) return; + switch (audioPlayer.speed) { + case 1.0: + await audioPlayer.setSpeed(1.25); + break; + case 1.25: + await audioPlayer.setSpeed(1.5); + break; + case 1.5: + await audioPlayer.setSpeed(2.0); + break; + case 2.0: + await audioPlayer.setSpeed(0.5); + break; + case 0.5: + default: + await audioPlayer.setSpeed(1.0); + break; + } + setState(() {}); + } @override void initState() { super.initState(); - waveform = _getWaveform(); + _waveform = _getWaveform(); } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final waveform = _waveform; + final statusText = this.statusText ??= _durationString ?? '00:00'; + final audioPlayer = this.audioPlayer; + + final body = widget.event.content.tryGet('body') ?? + widget.event.content.tryGet('filename'); + final displayBody = body != null && + body.isNotEmpty && + widget.event.content['org.matrix.msc1767.audio'] == null; + + final wavePosition = + (currentPosition / maxPosition) * AudioPlayerWidget.wavesCount; + + final fontSize = 12 * AppConfig.fontSizeFactor; + return Padding( - padding: const EdgeInsets.symmetric(horizontal: 6.0), - child: Row( + padding: const EdgeInsets.all(12.0), + child: Column( mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - width: buttonSize, - height: buttonSize, - child: status == AudioPlayerStatus.downloading - ? CircularProgressIndicator(strokeWidth: 2, color: widget.color) - : InkWell( - borderRadius: BorderRadius.circular(64), - child: Material( - color: widget.color.withAlpha(64), - borderRadius: BorderRadius.circular(64), - child: Icon( - audioPlayer.playerState.playing - ? Icons.pause_outlined - : Icons.play_arrow_outlined, - color: widget.color, - ), - ), - onLongPress: () => widget.event.saveFile(context), - onTap: () { - if (status == AudioPlayerStatus.downloaded) { - _playAction(); - } else { - _downloadAction(); - } - }, - ), - ), - const SizedBox(width: 8), - Expanded( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth), child: Row( - children: [ - for (var i = 0; i < AudioPlayerWidget.wavesCount; i++) - Expanded( - child: InkWell( - onTap: () => audioPlayer.seek(Duration( - milliseconds: - (maxPosition / AudioPlayerWidget.wavesCount) - .round() * - i)), - child: Container( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: buttonSize, + height: buttonSize, + child: status == AudioPlayerStatus.downloading + ? CircularProgressIndicator( + strokeWidth: 2, + color: widget.color, + ) + : InkWell( + borderRadius: BorderRadius.circular(64), + onLongPress: () => widget.event.saveFile(context), + onTap: _startAction, + child: Material( + color: widget.color.withAlpha(64), + borderRadius: BorderRadius.circular(64), + child: Icon( + audioPlayer?.playerState.playing == true + ? Icons.pause_outlined + : Icons.play_arrow_outlined, + color: widget.color, + ), + ), + ), + ), + const SizedBox(width: 8), + Expanded( + child: Stack( + children: [ + if (waveform != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + children: [ + for (var i = 0; + i < AudioPlayerWidget.wavesCount; + i++) + Expanded( + child: Container( + height: 32, + alignment: Alignment.center, + child: Container( + margin: const EdgeInsets.symmetric( + horizontal: 1, + ), + decoration: BoxDecoration( + color: i < wavePosition + ? widget.color + : widget.color.withAlpha(128), + borderRadius: BorderRadius.circular(64), + ), + height: 32 * (waveform[i] / 1024), + ), + ), + ), + ], + ), + ), + SizedBox( height: 32, - alignment: Alignment.center, - child: Opacity( - opacity: currentPosition > i ? 1 : 0.5, - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 1), - decoration: BoxDecoration( - color: widget.color, - borderRadius: BorderRadius.circular(64), - ), - height: 32 * (waveform[i] / 1024)), + child: Slider( + thumbColor: widget.event.senderId == + widget.event.room.client.userID + ? theme.colorScheme.onPrimary + : theme.colorScheme.primary, + activeColor: waveform == null + ? widget.color + : Colors.transparent, + inactiveColor: waveform == null + ? widget.color.withAlpha(128) + : Colors.transparent, + max: maxPosition, + value: currentPosition, + onChanged: (position) => audioPlayer == null + ? _startAction() + : audioPlayer.seek( + Duration(milliseconds: position.round()), + ), ), ), + ], + ), + ), + const SizedBox(width: 8), + SizedBox( + width: 36, + child: Text( + statusText, + style: TextStyle( + color: widget.color, + fontSize: 12, ), - ) + ), + ), + const SizedBox(width: 8), + Badge( + isLabelVisible: audioPlayer != null, + label: audioPlayer == null + ? null + : Text( + '${audioPlayer.speed.toString()}x', + ), + backgroundColor: theme.colorScheme.secondary, + textColor: theme.colorScheme.onSecondary, + child: InkWell( + splashColor: widget.color.withAlpha(128), + borderRadius: BorderRadius.circular(64), + onTap: audioPlayer == null ? null : _toggleSpeed, + child: Icon( + Icons.mic_none_outlined, + color: widget.color, + ), + ), + ), + const SizedBox(width: 8), ], ), ), - const SizedBox(width: 8), - Container( - alignment: Alignment.centerRight, - width: 42, - child: Text( - statusText, + if (displayBody) ...[ + const SizedBox(height: 8), + Linkify( + text: body, style: TextStyle( color: widget.color, + fontSize: fontSize, ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: widget.color.withAlpha(150), + fontSize: fontSize, + decoration: TextDecoration.underline, + decorationColor: widget.color.withAlpha(150), + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), - ), + ], ], ), ); } } + +/// To use a MatrixFile as an AudioSource for the just_audio package +class MatrixFileAudioSource extends StreamAudioSource { + final MatrixFile file; + MatrixFileAudioSource(this.file); + + @override + Future request([int? start, int? end]) async { + start ??= 0; + end ??= file.bytes.length; + return StreamAudioResponse( + sourceLength: file.bytes.length, + contentLength: end - start, + offset: start, + stream: Stream.value(file.bytes.sublist(start, end)), + contentType: file.mimeType, + ); + } +} diff --git a/lib/pages/chat/events/cute_events.dart b/lib/pages/chat/events/cute_events.dart new file mode 100644 index 0000000000..4f073a283f --- /dev/null +++ b/lib/pages/chat/events/cute_events.dart @@ -0,0 +1,194 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; + +class CuteContent extends StatefulWidget { + final Event event; + + const CuteContent(this.event, {super.key}); + + @override + State createState() => _CuteContentState(); +} + +class _CuteContentState extends State { + static bool _isOverlayShown = false; + + @override + void initState() { + if (AppConfig.autoplayImages && !_isOverlayShown) { + addOverlay(); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: widget.event.fetchSenderUser(), + builder: (context, snapshot) { + final label = generateLabel(snapshot.data); + + return GestureDetector( + onTap: addOverlay, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + widget.event.text, + style: const TextStyle(fontSize: 150), + ), + if (label != null) Text(label), + ], + ), + ); + }, + ); + } + + Future addOverlay() async { + _isOverlayShown = true; + await Future.delayed(const Duration(milliseconds: 50)); + + OverlayEntry? overlay; + overlay = OverlayEntry( + builder: (context) => CuteEventOverlay( + emoji: widget.event.text, + onAnimationEnd: () { + _isOverlayShown = false; + overlay?.remove(); + }, + ), + ); + Overlay.of(context).insert(overlay); + } + + generateLabel(User? user) { + switch (widget.event.content['cute_type']) { + case 'googly_eyes': + return L10n.of(context).googlyEyesContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + case 'cuddle': + return L10n.of(context).cuddleContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + case 'hug': + return L10n.of(context).hugContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + } + } +} + +class CuteEventOverlay extends StatefulWidget { + final String emoji; + final VoidCallback onAnimationEnd; + + const CuteEventOverlay({ + super.key, + required this.emoji, + required this.onAnimationEnd, + }); + + @override + State createState() => _CuteEventOverlayState(); +} + +class _CuteEventOverlayState extends State + with TickerProviderStateMixin { + final List items = List.generate( + 50, + (index) => Size( + Random().nextDouble(), + 4 + (Random().nextDouble() * 4), + ), + ); + + AnimationController? controller; + + @override + void initState() { + controller = AnimationController( + duration: const Duration(milliseconds: 2500), + vsync: this, + ); + controller?.forward(); + controller?.addStatusListener(_hideOverlay); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: controller!, + builder: (context, _) => LayoutBuilder( + builder: (context, constraints) { + final width = constraints.maxWidth - _CuteOverlayContent.size; + final height = constraints.maxHeight + _CuteOverlayContent.size; + return SizedBox( + height: constraints.maxHeight, + width: constraints.maxWidth, + child: OverflowBox( + child: Stack( + alignment: Alignment.bottomLeft, + fit: StackFit.expand, + children: items + .map( + (position) => Positioned( + left: position.width * width, + bottom: (height * + .25 * + position.height * + (controller?.value ?? 0)) - + _CuteOverlayContent.size, + child: _CuteOverlayContent( + emoji: widget.emoji, + ), + ), + ) + .toList(), + ), + ), + ); + }, + ), + ); + } + + void _hideOverlay(AnimationStatus status) { + if (status == AnimationStatus.completed) { + widget.onAnimationEnd.call(); + } + } +} + +class _CuteOverlayContent extends StatelessWidget { + static const double size = 64.0; + final String emoji; + + const _CuteOverlayContent({required this.emoji}); + + @override + Widget build(BuildContext context) { + return SizedBox.square( + dimension: size, + child: Text( + emoji, + style: const TextStyle(fontSize: 48), + ), + ); + } +} diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index 7fbe913955..4d97eb2d2d 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -1,150 +1,498 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_matrix_html/flutter_html.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter_highlighter/flutter_highlighter.dart'; +import 'package:flutter_highlighter/themes/shades-of-purple.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:flutter_html_table/flutter_html_table.dart'; +import 'package:html/dom.dart' as dom; +import 'package:linkify/linkify.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../../config/app_config.dart'; -import '../../../config/setting_keys.dart'; -import '../../../pages/image_viewer/image_viewer.dart'; -import '../../../utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import '../../../utils/url_launcher.dart'; class HtmlMessage extends StatelessWidget { final String html; - final int? maxLines; final Room room; - final TextStyle? defaultTextStyle; - final TextStyle? linkStyle; - final double? emoteSize; + final Color textColor; const HtmlMessage({ - Key? key, + super.key, required this.html, - this.maxLines, required this.room, - this.defaultTextStyle, - this.linkStyle, - this.emoteSize, - }) : super(key: key); + this.textColor = Colors.black, + }); + + dom.Node _linkifyHtml(dom.Node element) { + for (final node in element.nodes) { + if (node is! dom.Text || + (element is dom.Element && element.localName == 'code')) { + node.replaceWith(_linkifyHtml(node)); + continue; + } + + final parts = linkify( + node.text, + options: const LinkifyOptions(humanize: false), + ); + + if (!parts.any((part) => part is UrlElement)) { + continue; + } + + final newHtml = parts + .map( + (linkifyElement) => linkifyElement is! UrlElement + ? linkifyElement.text.replaceAll('<', '<') + : '${linkifyElement.text}', + ) + .join(' '); + + node.replaceWith(dom.Element.html('

$newHtml

')); + } + return element; + } @override Widget build(BuildContext context) { - // riot-web is notorious for creating bad reply fallback events from invalid messages which, if - // not handled properly, can lead to impersination. As such, we strip the entire `` tags - // here already, to prevent that from happening. - // We do *not* do this in an AST and just with simple regex here, as riot-web tends to create - // miss-matching tags, and this way we actually correctly identify what we want to strip and, well, - // strip it. - final renderHtml = html.replaceAll( - RegExp('.*', - caseSensitive: false, multiLine: false, dotAll: true), - ''); + final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - // there is no need to pre-validate the html, as we validate it while rendering + final linkColor = textColor.withAlpha(150); - final matrix = Matrix.of(context); - - final themeData = Theme.of(context); - return Html( - data: renderHtml, - defaultTextStyle: defaultTextStyle, - emoteSize: emoteSize, - linkStyle: linkStyle ?? - themeData.textTheme.bodyText2!.copyWith( - color: themeData.colorScheme.secondary, - decoration: TextDecoration.underline, - ), - shrinkToFit: true, - maxLines: maxLines, - onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), - onPillTap: (url) => UrlLauncher(context, url).launchUrl(), - getMxcUrl: (String mxc, double? width, double? height, - {bool? animated = false}) { - final ratio = MediaQuery.of(context).devicePixelRatio; - return Uri.parse(mxc) - .getThumbnail( - matrix.client, - width: (width ?? 800) * ratio, - height: (height ?? 800) * ratio, - method: ThumbnailMethod.scale, - animated: AppConfig.autoplayImages ? animated : false, - ) - .toString(); - }, - onImageTap: (String mxc) => showDialog( - context: Matrix.of(context).navigatorContext, - useRootNavigator: false, - builder: (_) => ImageViewer(Event( - type: EventTypes.Message, - content: { - 'body': mxc, - 'url': mxc, - 'msgtype': MessageTypes.Image, - }, - senderId: room.client.userID!, - originServerTs: DateTime.now(), - eventId: 'fake_event', - room: room))), - setCodeLanguage: (String key, String value) async { - await matrix.store.setItem('${SettingKeys.codeLanguage}.$key', value); - }, - getCodeLanguage: (String key) async { - return await matrix.store.getItem('${SettingKeys.codeLanguage}.$key'); + final blockquoteStyle = Style( + border: Border( + left: BorderSide( + width: 3, + color: textColor, + ), + ), + padding: HtmlPaddings.only(left: 6, bottom: 0), + ); + + final element = _linkifyHtml(HtmlParser.parseHTML(html)); + + // there is no need to pre-validate the html, as we validate it while rendering + return Html.fromElement( + documentElement: element as dom.Element, + style: { + '*': Style( + color: textColor, + margin: Margins.all(0), + fontSize: FontSize(fontSize), + ), + 'a': Style(color: linkColor, textDecorationColor: linkColor), + 'h1': Style( + fontSize: FontSize(fontSize * 2), + lineHeight: LineHeight.number(1.5), + fontWeight: FontWeight.w600, + ), + 'h2': Style( + fontSize: FontSize(fontSize * 1.75), + lineHeight: LineHeight.number(1.5), + fontWeight: FontWeight.w500, + ), + 'h3': Style( + fontSize: FontSize(fontSize * 1.5), + lineHeight: LineHeight.number(1.5), + ), + 'h4': Style( + fontSize: FontSize(fontSize * 1.25), + lineHeight: LineHeight.number(1.5), + ), + 'h5': Style( + fontSize: FontSize(fontSize * 1.25), + lineHeight: LineHeight.number(1.5), + ), + 'h6': Style( + fontSize: FontSize(fontSize), + lineHeight: LineHeight.number(1.5), + ), + 'blockquote': blockquoteStyle, + 'tg-forward': blockquoteStyle, + 'hr': Style( + border: Border.all(color: textColor, width: 0.5), + ), + 'table': Style( + border: Border.all(color: textColor, width: 0.5), + ), + 'tr': Style( + border: Border.all(color: textColor, width: 0.5), + ), + 'td': Style( + border: Border.all(color: textColor, width: 0.5), + padding: HtmlPaddings.all(2), + ), + 'th': Style( + border: Border.all(color: textColor, width: 0.5), + ), }, - getPillInfo: (String url) async { - final identityParts = url.parseIdentifierIntoParts(); - final identifier = identityParts?.primaryIdentifier; - if (identifier == null) { - return {}; - } - if (identifier.sigil == '@') { - // we have a user pill - final user = room.getState('m.room.member', identifier); - if (user != null) { - return user.content; - } - // there might still be a profile... - final profile = await room.client.getProfileFromUserId(identifier); - return { - 'displayname': profile.displayName, - 'avatar_url': profile.avatarUrl.toString(), - }; - } - if (identifier.sigil == '#') { - // we have an alias pill - for (final r in room.client.rooms) { - final state = r.getState('m.room.canonical_alias'); - if (state != null && - ((state.content['alias'] is String && - state.content['alias'] == identifier) || - (state.content['alt_aliases'] is List && - state.content['alt_aliases'].contains(identifier)))) { - // we have a room! - return { - 'displayname': - r.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - 'avatar_url': r.getState('m.room.avatar')?.content['url'], - }; - } - } - return {}; - } - if (identifier.sigil == '!') { - // we have a room ID pill - final r = room.client.getRoomById(identifier); - if (r == null) { - return {}; - } - return { - 'displayname': - r.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - 'avatar_url': r.getState('m.room.avatar')?.content['url'], - }; - } - return {}; + extensions: [ + RoomPillExtension(context, room, fontSize, linkColor), + CodeExtension(fontSize: fontSize), + const TableHtmlExtension(), + SpoilerExtension(textColor: textColor), + const ImageExtension(), + FontColorExtension(), + FallbackTextExtension(fontSize: fontSize), + ], + onLinkTap: (url, _, element) => UrlLauncher( + context, + url, + element?.text, + ).launchUrl(), + onlyRenderTheseTags: const { + ...allowedHtmlTags, + // Needed to make it work properly + 'body', + 'html', }, + shrinkWrap: true, + ); + } + + static const Set fallbackTextTags = {'tg-forward'}; + + /// Keep in sync with: https://spec.matrix.org/v1.6/client-server-api/#mroommessage-msgtypes + static const Set allowedHtmlTags = { + 'font', + 'del', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'p', + 'a', + 'ul', + 'ol', + 'sup', + 'sub', + 'li', + 'b', + 'i', + 'u', + 'strong', + 'em', + 'strike', + 'code', + 'hr', + 'br', + 'div', + 'table', + 'thead', + 'tbody', + 'tr', + 'th', + 'td', + 'caption', + 'pre', + 'span', + 'img', + 'details', + 'summary', + // Not in the allowlist of the matrix spec yet but should be harmless: + 'ruby', + 'rp', + 'rt', + // Workaround for https://github.com/krille-chan/fluffychat/issues/507 + ...fallbackTextTags, + }; +} + +class FontColorExtension extends HtmlExtension { + static const String colorAttribute = 'color'; + static const String mxColorAttribute = 'data-mx-color'; + static const String bgColorAttribute = 'data-mx-bg-color'; + + @override + Set get supportedTags => {'font', 'span'}; + + @override + bool matches(ExtensionContext context) { + if (!supportedTags.contains(context.elementName)) return false; + return context.element?.attributes.keys.any( + { + colorAttribute, + mxColorAttribute, + bgColorAttribute, + }.contains, + ) ?? + false; + } + + Color? hexToColor(String? hexCode) { + if (hexCode == null) return null; + if (hexCode.startsWith('#')) hexCode = hexCode.substring(1); + if (hexCode.length == 6) hexCode = 'FF$hexCode'; + final colorValue = int.tryParse(hexCode, radix: 16); + return colorValue == null ? null : Color(colorValue); + } + + @override + InlineSpan build( + ExtensionContext context, + ) { + final colorText = context.element?.attributes[colorAttribute] ?? + context.element?.attributes[mxColorAttribute]; + final bgColor = context.element?.attributes[bgColorAttribute]; + return TextSpan( + style: TextStyle( + color: hexToColor(colorText), + backgroundColor: hexToColor(bgColor), + ), + text: context.innerHtml, + ); + } +} + +class ImageExtension extends HtmlExtension { + final double defaultDimension; + + const ImageExtension({this.defaultDimension = 64}); + + @override + Set get supportedTags => {'img'}; + + @override + InlineSpan build(ExtensionContext context) { + final mxcUrl = Uri.tryParse(context.attributes['src'] ?? ''); + if (mxcUrl == null || mxcUrl.scheme != 'mxc') { + return TextSpan(text: context.attributes['alt']); + } + + final width = double.tryParse(context.attributes['width'] ?? ''); + final height = double.tryParse(context.attributes['height'] ?? ''); + + final actualWidth = width ?? height ?? defaultDimension; + final actualHeight = height ?? width ?? defaultDimension; + + return WidgetSpan( + child: SizedBox( + width: actualWidth, + height: actualHeight, + child: MxcImage( + uri: mxcUrl, + width: actualWidth, + height: actualHeight, + isThumbnail: (actualWidth * actualHeight) > (256 * 256), + ), + ), + ); + } +} + +class SpoilerExtension extends HtmlExtension { + final Color textColor; + + const SpoilerExtension({required this.textColor}); + + @override + Set get supportedTags => {'span'}; + + static const String customDataAttribute = 'data-mx-spoiler'; + + @override + bool matches(ExtensionContext context) { + if (context.elementName != 'span') return false; + return context.element?.attributes.containsKey(customDataAttribute) ?? + false; + } + + @override + InlineSpan build(ExtensionContext context) { + var obscure = true; + final children = context.inlineSpanChildren; + return WidgetSpan( + child: StatefulBuilder( + builder: (context, setState) { + return InkWell( + onTap: () => setState(() { + obscure = !obscure; + }), + child: RichText( + text: TextSpan( + style: obscure ? TextStyle(backgroundColor: textColor) : null, + children: children, + ), + ), + ); + }, + ), + ); + } +} + +class CodeExtension extends HtmlExtension { + final double fontSize; + + CodeExtension({required this.fontSize}); + @override + Set get supportedTags => {'code'}; + + @override + InlineSpan build(ExtensionContext context) => WidgetSpan( + child: Material( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(4), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: HighlightView( + context.element?.text ?? '', + language: context.element?.className + .split(' ') + .singleWhereOrNull( + (className) => className.startsWith('language-'), + ) + ?.split('language-') + .last ?? + 'md', + theme: shadesOfPurpleTheme, + padding: EdgeInsets.symmetric( + horizontal: 6, + vertical: context.element?.parent?.localName == 'pre' ? 6 : 0, + ), + textStyle: TextStyle(fontSize: fontSize), + ), + ), + ), + ); +} + +class FallbackTextExtension extends HtmlExtension { + final double fontSize; + + FallbackTextExtension({required this.fontSize}); + @override + Set get supportedTags => HtmlMessage.fallbackTextTags; + + @override + InlineSpan build(ExtensionContext context) => TextSpan( + text: context.element?.text ?? '', + style: TextStyle( + fontSize: fontSize, + ), + ); +} + +class RoomPillExtension extends HtmlExtension { + final Room room; + final BuildContext context; + final double fontSize; + final Color color; + + RoomPillExtension(this.context, this.room, this.fontSize, this.color); + @override + Set get supportedTags => {'a'}; + + @override + bool matches(ExtensionContext context) { + if (context.elementName != 'a') return false; + final userId = context.element?.attributes['href'] + ?.parseIdentifierIntoParts() + ?.primaryIdentifier; + return userId != null; + } + + static final _cachedUsers = {}; + + Future _fetchUser(String matrixId) async => + _cachedUsers[room.id + matrixId] ??= await room.requestUser(matrixId); + + @override + InlineSpan build(ExtensionContext context) { + final href = context.element?.attributes['href']; + final matrixId = href?.parseIdentifierIntoParts()?.primaryIdentifier; + if (href == null || matrixId == null) { + return TextSpan(text: context.innerHtml); + } + if (matrixId.sigil == '@') { + return WidgetSpan( + child: FutureBuilder( + future: _fetchUser(matrixId), + builder: (context, snapshot) => MatrixPill( + key: Key('user_pill_$matrixId'), + name: _cachedUsers[room.id + matrixId]?.calcDisplayname() ?? + matrixId.localpart ?? + matrixId, + avatar: _cachedUsers[room.id + matrixId]?.avatarUrl, + uri: href, + outerContext: this.context, + fontSize: fontSize, + color: color, + ), + ), + ); + } + if (matrixId.sigil == '#' || matrixId.sigil == '!') { + final room = matrixId.sigil == '!' + ? this.room.client.getRoomById(matrixId) + : this.room.client.getRoomByAlias(matrixId); + if (room != null) { + return WidgetSpan( + child: MatrixPill( + name: room.getLocalizedDisplayname(), + avatar: room.avatar, + uri: href, + outerContext: this.context, + fontSize: fontSize, + color: color, + ), + ); + } + } + + return TextSpan(text: context.innerHtml); + } +} + +class MatrixPill extends StatelessWidget { + final String name; + final BuildContext outerContext; + final Uri? avatar; + final String uri; + final double? fontSize; + final Color? color; + + const MatrixPill({ + super.key, + required this.name, + required this.outerContext, + this.avatar, + required this.uri, + required this.fontSize, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: UrlLauncher(outerContext, uri).launchUrl, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + mxContent: avatar, + name: name, + size: 16, + ), + const SizedBox(width: 6), + Text( + name, + style: TextStyle( + color: color, + decorationColor: color, + decoration: TextDecoration.underline, + fontSize: fontSize, + height: 1.25, + ), + ), + ], + ), ); } } diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart index 27872f3265..a2fcf23b37 100644 --- a/lib/pages/chat/events/image_bubble.dart +++ b/lib/pages/chat/events/image_bubble.dart @@ -1,20 +1,13 @@ -import 'dart:typed_data'; - import 'package:flutter/material.dart'; -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:lottie/lottie.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../../utils/matrix_sdk_extensions.dart/event_extension.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../../widgets/blur_hash.dart'; -class ImageBubble extends StatefulWidget { +class ImageBubble extends StatelessWidget { final Event event; final bool tapToView; final BoxFit fit; @@ -24,464 +17,91 @@ class ImageBubble extends StatefulWidget { final bool animated; final double width; final double height; - final void Function()? onLoaded; final void Function()? onTap; + final BorderRadius? borderRadius; const ImageBubble( this.event, { this.tapToView = true, this.maxSize = true, this.backgroundColor, - this.fit = BoxFit.cover, + this.fit = BoxFit.contain, this.thumbnailOnly = true, - this.onLoaded, this.width = 400, this.height = 300, this.animated = false, this.onTap, - Key? key, - }) : super(key: key); - - @override - _ImageBubbleState createState() => _ImageBubbleState(); -} - -class _ImageBubbleState extends State { - // for plaintext: holds the http URL for the thumbnail - String? thumbnailUrl; - // for plaintext. holds the http URL for the thumbnial, without the animated flag - String? thumbnailUrlNoAnimated; - // for plaintext: holds the http URL of the original - String? attachmentUrl; - MatrixFile? _file; - MatrixFile? _thumbnail; - bool _requestedThumbnailOnFailure = false; - // In case we have animated = false, this will hold the first frame so that we make - // sure that things are never animated - Widget? _firstFrame; - - // the mimetypes that we know how to render, from the flutter Image widget - final _knownMimetypes = { - 'image/jpg', - 'image/jpeg', - 'image/png', - 'image/apng', - 'image/webp', - 'image/gif', - 'image/bmp', - 'image/x-bmp', - }; - - // overrides for certain mimetypes if they need different images to render - // memory are for in-memory renderers (e2ee rooms), network for network url renderers. - // The map values themself are set in initState() as they need to be able to access - // `this`. - final _contentRenderers = {}; - - String getMimetype([bool thumbnail = false]) => thumbnail - ? widget.event.thumbnailMimetype.toLowerCase() - : widget.event.attachmentMimetype.toLowerCase(); - - MatrixFile? get _displayFile => _file ?? _thumbnail; - String? get displayUrl => widget.thumbnailOnly ? thumbnailUrl : attachmentUrl; - - dynamic _error; - - Future _requestFile({bool getThumbnail = false}) async { - try { - final res = await widget.event - .downloadAndDecryptAttachmentCached(getThumbnail: getThumbnail); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (getThumbnail) { - if (mounted) { - setState(() => _thumbnail = res); - } - } else { - if (widget.onLoaded != null) { - widget.onLoaded!(); - } - if (mounted) { - setState(() => _file = res); - } - } - }); - } catch (err) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() => _error = err); - } - }); - } - } - - Widget frameBuilder(_, Widget child, int? frame, __) { - // as servers might return animated gifs as thumbnails and we want them to *not* play - // animated, we'll have to store the first frame in a variable and display that instead - if (widget.animated) { - return child; - } - if (frame == 0) { - _firstFrame = child; - } - return _firstFrame ?? child; - } - - @override - void initState() { - // add the custom renderers for other mimetypes - _contentRenderers['image/svg+xml'] = _ImageBubbleContentRenderer( - memory: (Uint8List bytes, String key) => SvgPicture.memory( - bytes, - key: ValueKey(key), - fit: widget.fit, - ), - network: (String? url) => url == null - ? Container() - : SvgPicture.network( - url, - key: ValueKey(url), - placeholderBuilder: (context) => getPlaceholderWidget(), - fit: widget.fit, - ), - ); - _contentRenderers['image/lottie+json'] = _ImageBubbleContentRenderer( - memory: (Uint8List bytes, String key) => Lottie.memory( - bytes, - key: ValueKey(key), - fit: widget.fit, - errorBuilder: (context, error, stacktrace) => - getErrorWidget(context, error), - animate: widget.animated, + this.borderRadius, + super.key, + }); + + Widget _buildPlaceholder(BuildContext context) { + final String blurHashString = + event.infoMap['xyz.amorgan.blurhash'] is String + ? event.infoMap['xyz.amorgan.blurhash'] + : 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + return SizedBox( + width: width, + height: height, + child: BlurHash( + blurhash: blurHashString, + width: width, + height: height, + fit: fit, ), - network: (String? url) => url == null - ? Container() - : Lottie.network( - url, - key: ValueKey(url), - fit: widget.fit, - errorBuilder: (context, error, stacktrace) => - getErrorWidget(context, error), - animate: widget.animated, - ), ); - - // add all the custom content renderer mimetypes to the known mimetypes set - for (final key in _contentRenderers.keys) { - _knownMimetypes.add(key); - } - - thumbnailUrl = widget.event - .getAttachmentUrl(getThumbnail: true, animated: widget.animated) - ?.toString(); - thumbnailUrlNoAnimated = widget.event - .getAttachmentUrl(getThumbnail: true, animated: false) - ?.toString(); - attachmentUrl = - widget.event.getAttachmentUrl(animated: widget.animated)?.toString(); - if (thumbnailUrl == null) { - _requestFile(getThumbnail: true); - } - if (!widget.thumbnailOnly && attachmentUrl == null) { - _requestFile(); - } else { - // if the full attachment is cached, we might as well fetch it anyways. - // no need to stick with thumbnail only, since we don't do any networking - widget.event.isAttachmentCached().then((cached) { - if (cached) { - _requestFile(); - } - }); - } - super.initState(); } - Widget getErrorWidget(BuildContext context, [dynamic error]) { - final String filename = widget.event.content.containsKey('filename') - ? widget.event.content['filename'] - : widget.event.body; - return getPlaceholderWidget( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - OutlinedButton.icon( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - primary: Theme.of(context).textTheme.bodyText1!.color, - ), - icon: const Icon(Icons.download_outlined), - onPressed: () => widget.event.saveFile(context), - label: Text( - filename, - overflow: TextOverflow.fade, - softWrap: false, - maxLines: 1, - ), - ), - const SizedBox(height: 8), - if (widget.event.sizeString != null) Text(widget.event.sizeString!), - const SizedBox(height: 8), - Text((error ?? _error).toString()), - ], - ), - ); - } - - Widget getPlaceholderWidget({Widget? child}) { - Widget? blurhash; - if (widget.event.infoMap['xyz.amorgan.blurhash'] is String) { - final ratio = - widget.event.infoMap['w'] is int && widget.event.infoMap['h'] is int - ? widget.event.infoMap['w'] / widget.event.infoMap['h'] - : 1.0; - var width = 32; - var height = 32; - if (ratio > 1.0) { - height = (width / ratio).round(); - } else { - width = (height * ratio).round(); - } - blurhash = BlurHash( - hash: widget.event.infoMap['xyz.amorgan.blurhash'], - decodingWidth: width, - decodingHeight: height, - imageFit: widget.fit, - ); + void _onTap(BuildContext context) { + if (onTap != null) { + onTap!(); + return; } - return Stack( - children: [ - if (blurhash != null) blurhash, - Center( - child: - child ?? const CircularProgressIndicator.adaptive(strokeWidth: 2), - ), - ], + if (!tapToView) return; + showDialog( + context: context, + builder: (_) => ImageViewer( + event, + outerContext: context, + ), ); } - // Build a memory file (e2ee) - Widget getMemoryWidget() { - final isOriginal = _file != null || - widget.event.attachmentOrThumbnailMxcUrl(getThumbnail: true) == - widget.event.attachmentMxcUrl; - final key = isOriginal - ? widget.event.attachmentMxcUrl.toString() - : widget.event.thumbnailMxcUrl.toString(); - final mimetype = getMimetype(!isOriginal); - if (_contentRenderers.containsKey(mimetype)) { - return _contentRenderers[mimetype]!.memory!(_displayFile!.bytes, key); - } else { - return Image.memory( - _displayFile!.bytes, - key: ValueKey(key), - fit: widget.fit, - errorBuilder: (context, error, stacktrace) { - if (widget.event.hasThumbnail && !_requestedThumbnailOnFailure) { - _requestedThumbnailOnFailure = true; - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - _file = null; - _requestFile(getThumbnail: true); - }); - }); - return getPlaceholderWidget(); - } - return getErrorWidget(context, error); - }, - frameBuilder: frameBuilder, - ); - } - } - - // build a network file (plaintext) - Widget getNetworkWidget() { - // For network files we try to utilize server-side thumbnailing as much as possible. - // Thus, we do the following logic: - // - try to display our URL - // - on failure: Attempt to display the in-event thumbnail instead - // - on failrue / non-existance: Display button to download or view in-app - final mimetype = getMimetype(_requestedThumbnailOnFailure); - if (displayUrl == attachmentUrl && - _contentRenderers.containsKey(mimetype)) { - return _contentRenderers[mimetype]!.network!(displayUrl); - } else { - return CachedNetworkImage( - // as we change the url on-error we need a key so that the widget actually updates - key: ValueKey(displayUrl), - imageUrl: displayUrl!, - placeholder: (context, url) { - if (!widget.thumbnailOnly && - displayUrl != thumbnailUrl && - displayUrl == attachmentUrl) { - // we have to display the thumbnail while loading - return FutureBuilder( - future: (() async { - return await DefaultCacheManager() - .getFileFromCache(thumbnailUrl!) != - null; - })(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (!snapshot.hasData) { - return getPlaceholderWidget(); - } - final effectiveUrl = snapshot.data == true - ? thumbnailUrl! - : thumbnailUrlNoAnimated!; - return CachedNetworkImage( - key: ValueKey(effectiveUrl), - imageUrl: effectiveUrl, - placeholder: (c, u) => getPlaceholderWidget(), - imageBuilder: (context, imageProvider) => Image( - image: imageProvider, - frameBuilder: frameBuilder, - fit: widget.fit, - ), - ); - }, - ); - } - return getPlaceholderWidget(); - }, - imageBuilder: (context, imageProvider) => Image( - image: imageProvider, - frameBuilder: frameBuilder, - fit: widget.fit, - ), - errorWidget: (context, url, error) { - if (widget.event.hasThumbnail && !_requestedThumbnailOnFailure) { - // the image failed to load but the event has a thumbnail attached....so we can - // try to load this one! - _requestedThumbnailOnFailure = true; - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - thumbnailUrl = widget.event - .getAttachmentUrl( - getThumbnail: true, - useThumbnailMxcUrl: true, - animated: widget.animated) - ?.toString(); - thumbnailUrlNoAnimated = widget.event - .getAttachmentUrl( - getThumbnail: true, - useThumbnailMxcUrl: true, - animated: false) - ?.toString(); - attachmentUrl = widget.event - .getAttachmentUrl( - useThumbnailMxcUrl: true, animated: widget.animated) - ?.toString(); - }); - }); - return getPlaceholderWidget(); - } else if (widget.thumbnailOnly && - displayUrl != attachmentUrl && - _knownMimetypes.contains(mimetype)) { - // Okay, the thumbnail failed to load, but we do know how to render the image - // ourselves. Let's offer the user a button to view it. - return getPlaceholderWidget( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - OutlinedButton( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - primary: Theme.of(context).textTheme.bodyText1!.color, - ), - onPressed: () => onTap(context), - child: Text( - L10n.of(context)!.tapToShowImage, - overflow: TextOverflow.fade, - softWrap: false, - maxLines: 1, - ), - ), - if (widget.event.sizeString != null) ...[ - const SizedBox(height: 8), - Text(widget.event.sizeString!), - ] - ], - )); - } - return getErrorWidget(context, error); - }, - ); - } - } - @override Widget build(BuildContext context) { - Widget content; - String key; - if (_error != null) { - content = getErrorWidget(context); - key = 'error'; - } else if (_displayFile != null) { - content = getMemoryWidget(); - key = 'memory-' + (content.key as ValueKey).value; - } else if (displayUrl != null) { - content = getNetworkWidget(); - key = 'network-' + (content.key as ValueKey).value; - } else { - content = getPlaceholderWidget(); - key = 'placeholder'; - } - if (widget.maxSize) { - content = AspectRatio( - aspectRatio: widget.width / widget.height, - child: content, - ); - } - return InkWell( - onTap: () => onTap(context), - child: Hero( - tag: widget.event.eventId, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 1000), - child: Container( - key: ValueKey(key), - constraints: widget.maxSize - ? BoxConstraints.loose(Size( - widget.width, - widget.height, - )) - : null, - child: content, + final theme = Theme.of(context); + + final borderRadius = + this.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius); + return Material( + color: Colors.transparent, + clipBehavior: Clip.hardEdge, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, + side: BorderSide( + color: event.messageType == MessageTypes.Sticker + ? Colors.transparent + : theme.dividerColor, + ), + ), + child: InkWell( + onTap: () => _onTap(context), + borderRadius: borderRadius, + child: Hero( + tag: event.eventId, + child: MxcImage( + event: event, + width: width, + height: height, + fit: fit, + animated: animated, + isThumbnail: thumbnailOnly, + placeholder: event.messageType == MessageTypes.Sticker + ? null + : _buildPlaceholder, ), ), ), ); } - - void onTap(BuildContext context) { - if (widget.onTap != null) { - widget.onTap!(); - return; - } - if (!widget.tapToView) return; - showDialog( - context: Matrix.of(context).navigatorContext, - useRootNavigator: false, - builder: (_) => ImageViewer(widget.event, onLoaded: () { - // If the original file didn't load yet, we want to do that now. - // This is so that the original file displays after going on the image viewer, - // waiting for it to load, and then hitting back. This ensures that we always - // display the best image available, with requiring as little network as possible - if (_file == null) { - widget.event.isAttachmentCached().then((cached) { - if (cached) { - _requestFile(); - } - }); - } - }), - ); - } -} - -class _ImageBubbleContentRenderer { - final Widget Function(Uint8List, String)? memory; - final Widget Function(String?)? network; - - _ImageBubbleContentRenderer({this.memory, this.network}); } diff --git a/lib/pages/chat/events/map_bubble.dart b/lib/pages/chat/events/map_bubble.dart index 4d7370c71f..4a2befae29 100644 --- a/lib/pages/chat/events/map_bubble.dart +++ b/lib/pages/chat/events/map_bubble.dart @@ -17,11 +17,13 @@ class MapBubble extends StatelessWidget { this.width = 400, this.height = 400, this.radius = 10.0, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return ClipRRect( borderRadius: BorderRadius.circular(radius), child: Container( @@ -32,25 +34,25 @@ class MapBubble extends StatelessWidget { children: [ FlutterMap( options: MapOptions( - center: LatLng(latitude, longitude), - zoom: zoom, + initialCenter: LatLng(latitude, longitude), + initialZoom: zoom, ), - layers: [ - TileLayerOptions( + children: [ + TileLayer( maxZoom: 20, minZoom: 0, urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - subdomains: ['a', 'b', 'c'], + subdomains: const ['a', 'b', 'c'], ), - MarkerLayerOptions( + MarkerLayer( rotate: true, markers: [ Marker( point: LatLng(latitude, longitude), width: 30, height: 30, - builder: (_) => Transform.translate( + child: Transform.translate( // No idea why the offset has to be like this, instead of -15 // It has been determined by trying out, though, that this yields // the tip of the location pin to be static when zooming. @@ -72,11 +74,10 @@ class MapBubble extends StatelessWidget { child: Text( ' © OpenStreetMap contributors ', style: TextStyle( - color: Theme.of(context).brightness == Brightness.dark + color: theme.brightness == Brightness.dark ? Colors.white : Colors.black, - backgroundColor: - Theme.of(context).appBarTheme.backgroundColor, + backgroundColor: theme.appBarTheme.backgroundColor, ), ), ), diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 605e8a091f..c89d617db5 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -1,9 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:swipe_to_action/swipe_to_action.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/events/room_creation_state_event.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -18,46 +21,58 @@ import 'verification_request_content.dart'; class Message extends StatelessWidget { final Event event; final Event? nextEvent; - final void Function(Event)? onSelect; - final void Function(Event)? onAvatarTab; - final void Function(Event)? onInfoTab; - final void Function(String)? scrollToEventId; - final void Function(String) unfold; - final void Function(SwipeDirection) onSwipe; + final Event? previousEvent; + final bool displayReadMarker; + final void Function(Event) onSelect; + final void Function(Event) onAvatarTab; + final void Function(Event) onInfoTab; + final void Function(String) scrollToEventId; + final void Function() onSwipe; final bool longPressSelect; final bool selected; final Timeline timeline; + final bool highlightMarker; + final bool animateIn; + final void Function()? resetAnimateIn; + final bool wallpaperMode; - const Message(this.event, - {this.nextEvent, - this.longPressSelect = false, - this.onSelect, - this.onInfoTab, - this.onAvatarTab, - this.scrollToEventId, - required this.onSwipe, - required this.unfold, - this.selected = false, - required this.timeline, - Key? key}) - : super(key: key); - - /// Indicates wheither the user may use a mouse instead - /// of touchscreen. - static bool useMouse = false; + const Message( + this.event, { + this.nextEvent, + this.previousEvent, + this.displayReadMarker = false, + this.longPressSelect = false, + required this.onSelect, + required this.onInfoTab, + required this.onAvatarTab, + required this.scrollToEventId, + required this.onSwipe, + this.selected = false, + required this.timeline, + this.highlightMarker = false, + this.animateIn = false, + this.resetAnimateIn, + this.wallpaperMode = false, + super.key, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + if (!{ EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted, - EventTypes.CallInvite + EventTypes.CallInvite, }.contains(event.type)) { if (event.type.startsWith('m.call.')) { - return Container(); + return const SizedBox.shrink(); } - return StateMessage(event, unfold: unfold); + if (event.type == EventTypes.RoomCreate) { + return RoomCreationStateEvent(event: event); + } + return StateMessage(event); } if (event.type == EventTypes.Message && @@ -68,225 +83,370 @@ class Message extends StatelessWidget { final client = Matrix.of(context).client; final ownMessage = event.senderId == client.userID; final alignment = ownMessage ? Alignment.topRight : Alignment.topLeft; - var color = Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.black; + + var color = theme.colorScheme.surfaceContainerHigh; final displayTime = event.type == EventTypes.RoomCreate || nextEvent == null || !event.originServerTs.sameEnvironment(nextEvent!.originServerTs); - final sameSender = nextEvent != null && - [ - EventTypes.Message, - EventTypes.Sticker, - EventTypes.Encrypted, - ].contains(nextEvent!.type) - ? nextEvent!.senderId == event.senderId && !displayTime - : false; + final nextEventSameSender = nextEvent != null && + { + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + }.contains(nextEvent!.type) && + nextEvent!.senderId == event.senderId && + !displayTime; + + final previousEventSameSender = previousEvent != null && + { + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + }.contains(previousEvent!.type) && + previousEvent!.senderId == event.senderId && + previousEvent!.originServerTs.sameEnvironment(event.originServerTs); + final textColor = ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground; + ? theme.brightness == Brightness.light + ? theme.colorScheme.onPrimary + : theme.colorScheme.onPrimaryContainer + : theme.colorScheme.onSurface; final rowMainAxisAlignment = ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start; final displayEvent = event.getDisplayEvent(timeline); + const hardCorner = Radius.circular(4); + const roundedCorner = Radius.circular(AppConfig.borderRadius); final borderRadius = BorderRadius.only( - topLeft: !ownMessage - ? const Radius.circular(2) - : const Radius.circular(AppConfig.borderRadius), - topRight: ownMessage - ? const Radius.circular(2) - : const Radius.circular(AppConfig.borderRadius), - bottomLeft: const Radius.circular(AppConfig.borderRadius), - bottomRight: const Radius.circular(AppConfig.borderRadius), + topLeft: !ownMessage && nextEventSameSender ? hardCorner : roundedCorner, + topRight: ownMessage && nextEventSameSender ? hardCorner : roundedCorner, + bottomLeft: + !ownMessage && previousEventSameSender ? hardCorner : roundedCorner, + bottomRight: + ownMessage && previousEventSameSender ? hardCorner : roundedCorner, ); - final noBubble = { - MessageTypes.Video, - MessageTypes.Image, - MessageTypes.Sticker, + final noBubble = ({ + MessageTypes.Video, + MessageTypes.Image, + MessageTypes.Sticker, + }.contains(event.messageType) && + !event.redacted) || + (event.messageType == MessageTypes.Text && + event.relationshipType == null && + event.onlyEmotes && + event.numberEmotes > 0 && + event.numberEmotes <= 3); + final noPadding = { + MessageTypes.File, + MessageTypes.Audio, }.contains(event.messageType); if (ownMessage) { color = displayEvent.status.isError ? Colors.redAccent - : Theme.of(context).colorScheme.primary; + : theme.brightness == Brightness.light + ? theme.colorScheme.primary + : theme.colorScheme.primaryContainer; } - final rowChildren = [ - sameSender || ownMessage - ? SizedBox( - width: Avatar.defaultSize, - child: Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Center( - child: SizedBox( - width: 16 * AppConfig.bubbleSizeFactor, - height: 16 * AppConfig.bubbleSizeFactor, - child: event.status == EventStatus.sending - ? const CircularProgressIndicator.adaptive( - strokeWidth: 2) - : event.status == EventStatus.error - ? const Icon(Icons.error, color: Colors.red) - : null, - ), - ), - )) - : FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final user = snapshot.data ?? event.senderFromMemoryOrFallback; - return Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - onTap: () => onAvatarTab!(event), - ); - }), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (!sameSender) - Padding( - padding: const EdgeInsets.only(left: 8.0, bottom: 4), - child: ownMessage || event.room.isDirectChat - ? const SizedBox(height: 12) - : FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final displayname = - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback - .calcDisplayname(); - return Text( - displayname, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: displayname.color, - ), - ); - }), - ), - Container( - alignment: alignment, - padding: const EdgeInsets.only(left: 8), - child: Material( - color: noBubble ? Colors.transparent : color, - elevation: event.type == EventTypes.Sticker ? 0 : 6, - shadowColor: - Theme.of(context).secondaryHeaderColor.withAlpha(100), - borderRadius: borderRadius, - clipBehavior: Clip.antiAlias, - child: InkWell( - onHover: (b) => useMouse = true, - onTap: !useMouse && longPressSelect - ? () {} - : () => onSelect!(event), - onLongPress: !longPressSelect ? null : () => onSelect!(event), - borderRadius: borderRadius, - child: Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), + final resetAnimateIn = this.resetAnimateIn; + var animateIn = this.animateIn; + + final row = StatefulBuilder( + builder: (context, setState) { + if (animateIn && resetAnimateIn != null) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + animateIn = false; + setState(resetAnimateIn); + }); + } + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.none, + alignment: ownMessage ? Alignment.bottomRight : Alignment.bottomLeft, + child: animateIn + ? const SizedBox(height: 0, width: double.infinity) + : Stack( + children: [ + Positioned( + top: 0, + bottom: 0, + left: 0, + right: 0, + child: InkWell( + onTap: () => onSelect(event), + onLongPress: () => onSelect(event), + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + color: selected + ? theme.colorScheme.secondaryContainer + .withAlpha(100) + : highlightMarker + ? theme.colorScheme.tertiaryContainer + .withAlpha(100) + : Colors.transparent, + ), + ), ), - padding: noBubble - ? EdgeInsets.zero - : EdgeInsets.all(16 * AppConfig.bubbleSizeFactor), - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 1.5), - child: Stack( - children: [ - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (event.relationshipType == - RelationshipTypes.reply) - FutureBuilder( - future: event.getReplyEvent(timeline), - builder: (BuildContext context, snapshot) { - final replyEvent = snapshot.hasData - ? snapshot.data! - : Event( - eventId: event.relationshipEventId!, - content: { - 'msgtype': 'm.text', - 'body': '...' - }, - senderId: event.senderId, - type: 'm.room.message', - room: event.room, - status: EventStatus.sent, - originServerTs: DateTime.now(), - ); - return InkWell( - onTap: () { - if (scrollToEventId != null) { - scrollToEventId!(replyEvent.eventId); - } - }, - child: AbsorbPointer( - child: Container( - margin: EdgeInsets.symmetric( - vertical: 4.0 * - AppConfig.bubbleSizeFactor), - child: ReplyContent(replyEvent, - ownMessage: ownMessage, - timeline: timeline), - ), - ), - ); - }, + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: rowMainAxisAlignment, + children: [ + if (longPressSelect) + SizedBox( + height: 32, + width: Avatar.defaultSize, + child: Checkbox.adaptive( + value: selected, + shape: const CircleBorder(), + onChanged: (_) => onSelect(event), + ), + ) + else if (nextEventSameSender || ownMessage) + SizedBox( + width: Avatar.defaultSize, + child: Center( + child: SizedBox( + width: 16, + height: 16, + child: event.status == EventStatus.error + ? const Icon(Icons.error, color: Colors.red) + : event.fileSendingStatus != null + ? const CircularProgressIndicator + .adaptive( + strokeWidth: 1, + ) + : null, ), - MessageContent( - displayEvent, - textColor: textColor, - onInfoTab: onInfoTab, ), - if (event.hasAggregatedEvents( - timeline, RelationshipTypes.edit)) - Padding( - padding: EdgeInsets.only( - top: 4.0 * AppConfig.bubbleSizeFactor), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.edit_outlined, - color: textColor.withAlpha(164), - size: 14, - ), - Text( - ' - ${displayEvent.originServerTs.localizedTimeShort(context)}', - style: TextStyle( - color: textColor.withAlpha(164), - fontSize: 12, + ) + else + FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final user = snapshot.data ?? + event.senderFromMemoryOrFallback; + return Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + presenceUserId: user.stateKey, + presenceBackgroundColor: + wallpaperMode ? Colors.transparent : null, + onTap: () => onAvatarTab(event), + ); + }, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (!nextEventSameSender) + Padding( + padding: const EdgeInsets.only( + left: 8.0, + bottom: 4, + ), + child: ownMessage || event.room.isDirectChat + ? const SizedBox(height: 12) + : FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final displayname = snapshot.data + ?.calcDisplayname() ?? + event.senderFromMemoryOrFallback + .calcDisplayname(); + return Text( + displayname, + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: (theme.brightness == + Brightness.light + ? displayname.color + : displayname + .lightColorText), + shadows: !wallpaperMode + ? null + : [ + const Shadow( + offset: Offset( + 0.0, + 0.0, + ), + blurRadius: 3, + color: Colors.black, + ), + ], + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + }, + ), + ), + Container( + alignment: alignment, + padding: const EdgeInsets.only(left: 8), + child: GestureDetector( + onLongPress: longPressSelect + ? null + : () { + HapticFeedback.heavyImpact(); + onSelect(event); + }, + child: AnimatedOpacity( + opacity: animateIn + ? 0 + : event.messageType == + MessageTypes.BadEncrypted || + event.status.isSending + ? 0.5 + : 1, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Container( + decoration: BoxDecoration( + color: noBubble + ? Colors.transparent + : color, + borderRadius: borderRadius, + ), + clipBehavior: Clip.antiAlias, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + padding: noBubble || noPadding + ? EdgeInsets.zero + : const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + constraints: const BoxConstraints( + maxWidth: + FluffyThemes.columnWidth * 1.5, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (event.relationshipType == + RelationshipTypes.reply) + FutureBuilder( + future: event + .getReplyEvent(timeline), + builder: ( + BuildContext context, + snapshot, + ) { + final replyEvent = snapshot + .hasData + ? snapshot.data! + : Event( + eventId: event + .relationshipEventId!, + content: { + 'msgtype': 'm.text', + 'body': '...', + }, + senderId: + event.senderId, + type: + 'm.room.message', + room: event.room, + status: + EventStatus.sent, + originServerTs: + DateTime.now(), + ); + return Padding( + padding: + const EdgeInsets.only( + bottom: 4.0, + ), + child: InkWell( + borderRadius: ReplyContent + .borderRadius, + onTap: () => + scrollToEventId( + replyEvent.eventId, + ), + child: AbsorbPointer( + child: ReplyContent( + replyEvent, + ownMessage: + ownMessage, + timeline: timeline, + ), + ), + ), + ); + }, + ), + MessageContent( + displayEvent, + textColor: textColor, + onInfoTab: onInfoTab, + borderRadius: borderRadius, + ), + if (event.hasAggregatedEvents( + timeline, + RelationshipTypes.edit, + )) + Padding( + padding: const EdgeInsets.only( + top: 4.0, + ), + child: Row( + mainAxisSize: + MainAxisSize.min, + children: [ + Icon( + Icons.edit_outlined, + color: textColor + .withAlpha(164), + size: 14, + ), + Text( + ' - ${displayEvent.originServerTs.localizedTimeShort(context)}', + style: TextStyle( + color: textColor + .withAlpha(164), + fontSize: 12, + ), + ), + ], + ), + ), + ], + ), ), ), - ], + ), ), ), - ], + ], + ), ), ], ), - ), + ], ), - ), - ), - ], - ), - ), - ]; - final row = Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: rowMainAxisAlignment, - children: rowChildren, + ); + }, ); Widget container; - if (event.hasAggregatedEvents(timeline, RelationshipTypes.reaction) || - displayTime || - selected) { + final showReceiptsRow = + event.hasAggregatedEvents(timeline, RelationshipTypes.reaction); + if (showReceiptsRow || displayTime || selected || displayReadMarker) { container = Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: @@ -295,34 +455,81 @@ class Message extends StatelessWidget { if (displayTime || selected) Padding( padding: displayTime - ? EdgeInsets.symmetric( - vertical: 8.0 * AppConfig.bubbleSizeFactor) + ? const EdgeInsets.symmetric(vertical: 8.0) : EdgeInsets.zero, child: Center( - child: Material( - color: displayTime - ? Theme.of(context).backgroundColor - : Theme.of(context).backgroundColor.withOpacity(0.33), - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - clipBehavior: Clip.antiAlias, child: Padding( - padding: const EdgeInsets.all(6.0), - child: Text( - event.originServerTs.localizedTime(context), - style: TextStyle(fontSize: 14 * AppConfig.fontSizeFactor), + padding: const EdgeInsets.only(top: 4.0), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius * 2), + color: theme.colorScheme.surface.withAlpha(128), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 2.0, + ), + child: Text( + event.originServerTs.localizedTime(context), + style: TextStyle( + fontSize: 12 * AppConfig.fontSizeFactor, + fontWeight: FontWeight.bold, + color: theme.colorScheme.secondary, + ), + ), + ), ), ), - )), + ), ), row, - if (event.hasAggregatedEvents(timeline, RelationshipTypes.reaction)) - Padding( - padding: EdgeInsets.only( - top: 4.0 * AppConfig.bubbleSizeFactor, - left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, - right: 12.0, - ), - child: MessageReactions(event, timeline), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: !showReceiptsRow + ? const SizedBox.shrink() + : Padding( + padding: EdgeInsets.only( + top: 4.0, + left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, + right: ownMessage ? 0 : 12.0, + ), + child: MessageReactions(event, timeline), + ), + ), + if (displayReadMarker) + Row( + children: [ + Expanded( + child: + Divider(color: theme.colorScheme.surfaceContainerHighest), + ), + Container( + margin: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 16.0, + ), + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 3), + color: theme.colorScheme.surface.withAlpha(128), + ), + child: Text( + L10n.of(context).readUpToHere, + style: TextStyle( + fontSize: 12 * AppConfig.fontSizeFactor, + ), + ), + ), + Expanded( + child: + Divider(color: theme.colorScheme.surfaceContainerHighest), + ), + ], ), ], ); @@ -330,30 +537,30 @@ class Message extends StatelessWidget { container = row; } - return Swipeable( - key: ValueKey(event.eventId), - background: const Padding( - padding: EdgeInsets.symmetric(horizontal: 12.0), - child: Center( - child: Icon(Icons.reply_outlined), + return Center( + child: Swipeable( + key: ValueKey(event.eventId), + background: const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Center( + child: Icon(Icons.check_outlined), + ), ), - ), - direction: SwipeDirection.endToStart, - onSwipe: onSwipe, - child: Center( + direction: AppConfig.swipeRightToLeftToReply + ? SwipeDirection.endToStart + : SwipeDirection.startToEnd, + onSwipe: (_) => onSwipe(), child: Container( - color: selected - ? Theme.of(context).primaryColor.withAlpha(100) - : Theme.of(context).primaryColor.withAlpha(0), - constraints: - const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 4.0 * AppConfig.bubbleSizeFactor, - ), - child: container, + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 2.5, + ), + padding: EdgeInsets.only( + left: 8.0, + right: 8.0, + top: nextEventSameSender ? 1.0 : 4.0, + bottom: previousEventSameSender ? 1.0 : 4.0, ), + child: container, ), ), ); diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 59e4d64996..8f5d474850 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -1,97 +1,162 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; import 'package:fluffychat/pages/chat/events/video_player.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../../config/app_config.dart'; import '../../../utils/platform_infos.dart'; import '../../../utils/url_launcher.dart'; import '../../bootstrap/bootstrap_dialog.dart'; import 'audio_player.dart'; +import 'cute_events.dart'; import 'html_message.dart'; import 'image_bubble.dart'; import 'map_bubble.dart'; import 'message_download_content.dart'; -import 'sticker.dart'; class MessageContent extends StatelessWidget { final Event event; final Color textColor; final void Function(Event)? onInfoTab; + final BorderRadius borderRadius; - const MessageContent(this.event, - {this.onInfoTab, Key? key, required this.textColor}) - : super(key: key); + const MessageContent( + this.event, { + this.onInfoTab, + super.key, + required this.textColor, + required this.borderRadius, + }); void _verifyOrRequestKey(BuildContext context) async { + final l10n = L10n.of(context); if (event.content['can_request_session'] != true) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( content: Text( - event.type == EventTypes.Encrypted - ? L10n.of(context)!.needPantalaimonWarning - : event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - ), - ))); + event.calcLocalizedBodyFallback(MatrixLocals(l10n)), + ), + ), + ); return; } final client = Matrix.of(context).client; if (client.isUnknownSession && client.encryption!.crossSigning.enabled) { - await BootstrapDialog( + final success = await BootstrapDialog( client: Matrix.of(context).client, ).show(context); - final timeline = await event.room.getTimeline(); - timeline.requestKeys(); - timeline.cancelSubscriptions(); - } else { - final success = await showFutureLoadingDialog( - context: context, - future: () => event.requestKey(), - ); - if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(L10n.of(context)!.requestToReadOlderMessages))); - } + if (success != true) return; } + event.requestKey(); + final sender = event.senderFromMemoryOrFallback; + await showAdaptiveBottomSheet( + context: context, + builder: (context) => Scaffold( + appBar: AppBar( + leading: CloseButton(onPressed: Navigator.of(context).pop), + title: Text( + l10n.whyIsThisMessageEncrypted, + style: const TextStyle(fontSize: 16), + ), + ), + body: SafeArea( + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + ListTile( + contentPadding: EdgeInsets.zero, + leading: Avatar( + mxContent: sender.avatarUrl, + name: sender.calcDisplayname(), + presenceUserId: sender.stateKey, + client: event.room.client, + ), + title: Text(sender.calcDisplayname()), + subtitle: Text(event.originServerTs.localizedTime(context)), + trailing: const Icon(Icons.lock_outlined), + ), + const Divider(), + Text( + event.calcLocalizedBodyFallback( + MatrixLocals(l10n), + ), + ), + ], + ), + ), + ), + ); } @override Widget build(BuildContext context) { final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - final buttonTextColor = - event.senderId == Matrix.of(context).client.userID ? textColor : null; + final buttonTextColor = textColor; switch (event.type) { case EventTypes.Message: case EventTypes.Encrypted: case EventTypes.Sticker: switch (event.messageType) { case MessageTypes.Image: + case MessageTypes.Sticker: + if (event.redacted) continue textmessage; + const maxSize = 256.0; + final w = event.content + .tryGetMap('info') + ?.tryGet('w'); + final h = event.content + .tryGetMap('info') + ?.tryGet('h'); + var width = maxSize; + var height = maxSize; + var fit = event.messageType == MessageTypes.Sticker + ? BoxFit.contain + : BoxFit.cover; + if (w != null && h != null) { + fit = BoxFit.contain; + if (w > h) { + width = maxSize; + height = max(32, maxSize * (h / w)); + } else { + height = maxSize; + width = max(32, maxSize * (w / h)); + } + } return ImageBubble( event, - width: 400, - height: 300, - fit: BoxFit.cover, + width: width, + height: height, + fit: fit, + borderRadius: borderRadius, ); - case MessageTypes.Sticker: - return Sticker(event); + case CuteEventContent.eventType: + return CuteContent(event); case MessageTypes.Audio: - if (PlatformInfos.isMobile || PlatformInfos.isMacOS) { + if (PlatformInfos.isMobile || + PlatformInfos.isMacOS || + PlatformInfos.isWeb + // Disabled until https://github.com/bleonard252/just_audio_mpv/issues/3 + // is fixed + // || PlatformInfos.isLinux + ) { return AudioPlayerWidget( event, color: textColor, + fontSize: fontSize, ); } return MessageDownloadContent(event, textColor); case MessageTypes.Video: - if (PlatformInfos.isMobile || PlatformInfos.isWeb) { - return EventVideoPlayer(event); - } - return MessageDownloadContent(event, textColor); + return EventVideoPlayer(event); case MessageTypes.File: return MessageDownloadContent(event, textColor); @@ -105,22 +170,10 @@ class MessageContent extends StatelessWidget { if (event.messageType == MessageTypes.Emote) { html = '* $html'; } - final bigEmotes = event.onlyEmotes && - event.numberEmotes > 0 && - event.numberEmotes <= 10; return HtmlMessage( html: html, - defaultTextStyle: TextStyle( - color: textColor, - fontSize: bigEmotes ? fontSize * 3 : fontSize, - ), - linkStyle: TextStyle( - color: textColor.withAlpha(150), - fontSize: bigEmotes ? fontSize * 3 : fontSize, - decoration: TextDecoration.underline, - ), + textColor: textColor, room: event.room, - emoteSize: bigEmotes ? fontSize * 3 : fontSize * 1.5, ); } // else we fall through to the normal message rendering @@ -130,8 +183,9 @@ class MessageContent extends StatelessWidget { return _ButtonContent( textColor: buttonTextColor, onPressed: () => _verifyOrRequestKey(context), - icon: const Icon(Icons.lock_outline), - label: L10n.of(context)!.encrypted, + icon: '🔒', + label: L10n.of(context).encrypted, + fontSize: fontSize, ); case MessageTypes.Location: final geoUri = @@ -159,7 +213,7 @@ class MessageContent extends StatelessWidget { onPressed: UrlLauncher(context, geoUri.toString()).launchUrl, label: Text( - L10n.of(context)!.openInMaps, + L10n.of(context).openInMaps, style: TextStyle(color: textColor), ), ), @@ -173,72 +227,84 @@ class MessageContent extends StatelessWidget { default: if (event.redacted) { return FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - return _ButtonContent( - label: L10n.of(context)!.redactedAnEvent(snapshot.data - ?.calcDisplayname() ?? - event.senderFromMemoryOrFallback.calcDisplayname()), - icon: const Icon(Icons.delete_outlined), - textColor: buttonTextColor, - onPressed: () => onInfoTab!(event), - ); - }); + future: event.redactedBecause?.fetchSenderUser(), + builder: (context, snapshot) { + final reason = + event.redactedBecause?.content.tryGet('reason'); + final redactedBy = snapshot.data?.calcDisplayname() ?? + event.redactedBecause?.senderId.localpart ?? + L10n.of(context).user; + return _ButtonContent( + label: reason == null + ? L10n.of(context).redactedBy(redactedBy) + : L10n.of(context).redactedByBecause( + redactedBy, + reason, + ), + icon: '🗑️', + textColor: buttonTextColor.withAlpha(128), + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); } final bigEmotes = event.onlyEmotes && event.numberEmotes > 0 && - event.numberEmotes <= 10; - return FutureBuilder( - future: event.calcLocalizedBody(MatrixLocals(L10n.of(context)!), - hideReply: true), - builder: (context, snapshot) { - return LinkText( - text: snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - hideReply: true), - textStyle: TextStyle( - color: textColor, - fontSize: bigEmotes ? fontSize * 3 : fontSize, - decoration: - event.redacted ? TextDecoration.lineThrough : null, - ), - linkStyle: TextStyle( - color: textColor.withAlpha(150), - fontSize: bigEmotes ? fontSize * 3 : fontSize, - decoration: TextDecoration.underline, - ), - onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), - ); - }); + event.numberEmotes <= 3; + return Linkify( + text: event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + hideReply: true, + ), + style: TextStyle( + color: textColor, + fontSize: bigEmotes ? fontSize * 5 : fontSize, + decoration: event.redacted ? TextDecoration.lineThrough : null, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: textColor.withAlpha(150), + fontSize: fontSize, + decoration: TextDecoration.underline, + decorationColor: textColor.withAlpha(150), + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ); } case EventTypes.CallInvite: return FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - return _ButtonContent( - label: L10n.of(context)!.startedACall( - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback.calcDisplayname()), - icon: const Icon(Icons.phone_outlined), - textColor: buttonTextColor, - onPressed: () => onInfoTab!(event), - ); - }); + future: event.fetchSenderUser(), + builder: (context, snapshot) { + return _ButtonContent( + label: L10n.of(context).startedACall( + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback.calcDisplayname(), + ), + icon: '📞', + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); default: return FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - return _ButtonContent( - label: L10n.of(context)!.userSentUnknownEvent( - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback.calcDisplayname(), - event.type), - icon: const Icon(Icons.info_outlined), - textColor: buttonTextColor, - onPressed: () => onInfoTab!(event), - ); - }); + future: event.fetchSenderUser(), + builder: (context, snapshot) { + return _ButtonContent( + label: L10n.of(context).userSentUnknownEvent( + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback.calcDisplayname(), + event.type, + ), + icon: 'ℹ️', + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); } } } @@ -246,26 +312,28 @@ class MessageContent extends StatelessWidget { class _ButtonContent extends StatelessWidget { final void Function() onPressed; final String label; - final Icon icon; + final String icon; final Color? textColor; + final double fontSize; const _ButtonContent({ required this.label, required this.icon, required this.textColor, required this.onPressed, - Key? key, - }) : super(key: key); + required this.fontSize, + }); @override Widget build(BuildContext context) { - return OutlinedButton.icon( - onPressed: onPressed, - icon: icon, - label: Text(label, overflow: TextOverflow.ellipsis), - style: OutlinedButton.styleFrom( - primary: textColor, - backgroundColor: Colors.white.withAlpha(64), + return InkWell( + onTap: onPressed, + child: Text( + '$icon $label', + style: TextStyle( + color: textColor, + fontSize: fontSize, + ), ), ); } diff --git a/lib/pages/chat/events/message_download_content.dart b/lib/pages/chat/events/message_download_content.dart index 28f86953f7..767ea8e7b1 100644 --- a/lib/pages/chat/events/message_download_content.dart +++ b/lib/pages/chat/events/message_download_content.dart @@ -1,17 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/event_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; class MessageDownloadContent extends StatelessWidget { final Event event; final Color textColor; - const MessageDownloadContent(this.event, this.textColor, {Key? key}) - : super(key: key); + const MessageDownloadContent(this.event, this.textColor, {super.key}); @override Widget build(BuildContext context) { @@ -30,45 +27,50 @@ class MessageDownloadContent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - ListTile( - leading: Icon( - Icons.file_download_outlined, - color: textColor, - ), - title: Text( - filename, - maxLines: 1, - style: TextStyle( - color: textColor, - fontWeight: FontWeight.bold, - ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + Icon( + Icons.file_download_outlined, + color: textColor, + ), + const SizedBox(width: 16), + Flexible( + child: Text( + filename, + maxLines: 1, + style: TextStyle( + color: textColor, + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], ), - trailing: PlatformInfos.isAndroid - ? IconButton( - onPressed: () => event.shareFile(context), - tooltip: L10n.of(context)!.share, - icon: Icon(Icons.adaptive.share_outlined), - ) - : null, ), - const Divider(), - Row( - children: [ - Text( - filetype, - style: TextStyle( - color: textColor.withAlpha(150), - ), - ), - const Spacer(), - if (sizeString != null) + const Divider(height: 1), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), + child: Row( + children: [ Text( - sizeString, + filetype, style: TextStyle( color: textColor.withAlpha(150), ), ), - ], + const Spacer(), + if (sizeString != null) + Text( + sizeString, + style: TextStyle( + color: textColor.withAlpha(150), + ), + ), + ], + ), ), ], ), diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 023f757d2c..d91b765b2d 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -1,22 +1,19 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:collection/collection.dart' show IterableExtension; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; class MessageReactions extends StatelessWidget { final Event event; final Timeline timeline; - const MessageReactions(this.event, this.timeline, {Key? key}) - : super(key: key); + const MessageReactions(this.event, this.timeline, {super.key}); @override Widget build(BuildContext context) { @@ -46,123 +43,128 @@ class MessageReactions extends StatelessWidget { final reactionList = reactionMap.values.toList(); reactionList.sort((a, b) => b.count - a.count > 0 ? 1 : -1); - return Wrap(spacing: 4.0, runSpacing: 4.0, children: [ - ...reactionList - .map( - (r) => _Reaction( - reactionKey: r.key, - count: r.count, - reacted: r.reacted, - onTap: () { - if (r.reacted) { - final evt = allReactionEvents.firstWhereOrNull((e) => + final ownMessage = event.senderId == event.room.client.userID; + return Wrap( + spacing: 4.0, + runSpacing: 4.0, + alignment: ownMessage ? WrapAlignment.end : WrapAlignment.start, + children: [ + ...reactionList.map( + (r) => _Reaction( + reactionKey: r.key, + count: r.count, + reacted: r.reacted, + onTap: () { + if (r.reacted) { + final evt = allReactionEvents.firstWhereOrNull( + (e) => e.senderId == e.room.client.userID && - e.content['m.relates_to']['key'] == r.key); - if (evt != null) { - showFutureLoadingDialog( - context: context, - future: () => evt.redactEvent(), - ); - } - } else { + e.content.tryGetMap('m.relates_to')?['key'] == r.key, + ); + if (evt != null) { showFutureLoadingDialog( - context: context, - future: () => - event.room.sendReaction(event.eventId, r.key!)); + context: context, + future: () => evt.redactEvent(), + ); } - }, - onLongPress: () async => await _AdaptableReactorsDialog( - client: client, - reactionEntry: r, - ).show(context), - ), - ) - .toList(), - if (allReactionEvents.any((e) => e.status.isSending)) - const SizedBox( - width: 28, - height: 28, - child: Padding( - padding: EdgeInsets.all(4.0), - child: CircularProgressIndicator.adaptive(strokeWidth: 1), + } else { + event.room.sendReaction(event.eventId, r.key); + } + }, + onLongPress: () async => await _AdaptableReactorsDialog( + client: client, + reactionEntry: r, + ).show(context), ), ), - ]); + if (allReactionEvents.any((e) => e.status.isSending)) + const SizedBox( + width: 24, + height: 24, + child: Padding( + padding: EdgeInsets.all(4.0), + child: CircularProgressIndicator.adaptive(strokeWidth: 1), + ), + ), + ], + ); } } class _Reaction extends StatelessWidget { - final String? reactionKey; - final int? count; + final String reactionKey; + final int count; final bool? reacted; final void Function()? onTap; final void Function()? onLongPress; const _Reaction({ - this.reactionKey, - this.count, - this.reacted, - this.onTap, - this.onLongPress, + required this.reactionKey, + required this.count, + required this.reacted, + required this.onTap, + required this.onLongPress, }); @override Widget build(BuildContext context) { - final textColor = Theme.of(context).brightness == Brightness.dark - ? Colors.white - : Colors.black; - final color = Theme.of(context).scaffoldBackgroundColor; - final fontSize = DefaultTextStyle.of(context).style.fontSize; + final theme = Theme.of(context); + final textColor = + theme.brightness == Brightness.dark ? Colors.white : Colors.black; + final color = theme.colorScheme.surface; Widget content; - if (reactionKey!.startsWith('mxc://')) { - final src = Uri.parse(reactionKey!).getThumbnail( - Matrix.of(context).client, - width: 9999, - height: fontSize! * MediaQuery.of(context).devicePixelRatio, - method: ThumbnailMethod.scale, - ); + if (reactionKey.startsWith('mxc://')) { content = Row( mainAxisSize: MainAxisSize.min, children: [ - CachedNetworkImage( - imageUrl: src.toString(), - height: fontSize, + MxcImage( + uri: Uri.parse(reactionKey), + width: 20, + height: 20, + animated: false, + isThumbnail: false, ), - const SizedBox(width: 4), - Text(count.toString(), + if (count > 1) ...[ + const SizedBox(width: 4), + Text( + count.toString(), style: TextStyle( color: textColor, fontSize: DefaultTextStyle.of(context).style.fontSize, - )), + ), + ), + ], ], ); } else { - var renderKey = Characters(reactionKey!); + var renderKey = Characters(reactionKey); if (renderKey.length > 10) { renderKey = renderKey.getRange(0, 9) + Characters('…'); } - content = Text('$renderKey $count', - style: TextStyle( - color: textColor, - fontSize: DefaultTextStyle.of(context).style.fontSize, - )); + content = Text( + renderKey.toString() + (count > 1 ? ' $count' : ''), + style: TextStyle( + color: textColor, + fontSize: DefaultTextStyle.of(context).style.fontSize, + ), + ); } return InkWell( onTap: () => onTap != null ? onTap!() : null, onLongPress: () => onLongPress != null ? onLongPress!() : null, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), child: Container( decoration: BoxDecoration( color: color, - border: reacted! - ? Border.all( - width: 1, - color: Theme.of(context).primaryColor, - ) - : null, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), + border: Border.all( + width: 1, + color: reacted! + ? theme.colorScheme.primary + : theme.colorScheme.primaryContainer, + ), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), ), - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 3), + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), child: content, ), ); @@ -170,13 +172,13 @@ class _Reaction extends StatelessWidget { } class _ReactionEntry { - String? key; + String key; int count; bool reacted; List? reactors; _ReactionEntry({ - this.key, + required this.key, required this.count, required this.reacted, this.reactors, @@ -188,24 +190,16 @@ class _AdaptableReactorsDialog extends StatelessWidget { final _ReactionEntry? reactionEntry; const _AdaptableReactorsDialog({ - Key? key, this.client, this.reactionEntry, - }) : super(key: key); - - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ); + }); + + Future show(BuildContext context) => showAdaptiveDialog( + context: context, + builder: (context) => this, + barrierDismissible: true, + useRootNavigator: false, + ); @override Widget build(BuildContext context) { @@ -215,12 +209,13 @@ class _AdaptableReactorsDialog extends StatelessWidget { runSpacing: 4.0, alignment: WrapAlignment.center, children: [ - for (var reactor in reactionEntry!.reactors!) + for (final reactor in reactionEntry!.reactors!) Chip( avatar: Avatar( mxContent: reactor.avatarUrl, name: reactor.displayName, client: client, + presenceUserId: reactor.stateKey, ), label: Text(reactor.displayName!), ), @@ -228,16 +223,11 @@ class _AdaptableReactorsDialog extends StatelessWidget { ), ); - final title = Center(child: Text(reactionEntry!.key!)); + final title = Center(child: Text(reactionEntry!.key)); - return PlatformInfos.isCupertinoStyle - ? CupertinoAlertDialog( - title: title, - content: body, - ) - : AlertDialog( - title: title, - content: body, - ); + return AlertDialog.adaptive( + title: title, + content: body, + ); } } diff --git a/lib/pages/chat/events/reply_content.dart b/lib/pages/chat/events/reply_content.dart index cde75eb1ba..de237f004c 100644 --- a/lib/pages/chat/events/reply_content.dart +++ b/lib/pages/chat/events/reply_content.dart @@ -3,110 +3,95 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import '../../../config/app_config.dart'; -import 'html_message.dart'; class ReplyContent extends StatelessWidget { final Event replyEvent; final bool ownMessage; final Timeline? timeline; + final Color? backgroundColor; const ReplyContent( this.replyEvent, { this.ownMessage = false, - Key? key, + super.key, this.timeline, - }) : super(key: key); + this.backgroundColor, + }); + + static const BorderRadius borderRadius = BorderRadius.only( + topRight: Radius.circular(AppConfig.borderRadius / 2), + bottomRight: Radius.circular(AppConfig.borderRadius / 2), + ); @override Widget build(BuildContext context) { - Widget replyBody; + final theme = Theme.of(context); + final timeline = this.timeline; final displayEvent = timeline != null ? replyEvent.getDisplayEvent(timeline) : replyEvent; final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - if (AppConfig.renderHtml && - [EventTypes.Message, EventTypes.Encrypted] - .contains(displayEvent.type) && - [MessageTypes.Text, MessageTypes.Notice, MessageTypes.Emote] - .contains(displayEvent.messageType) && - !displayEvent.redacted && - displayEvent.content['format'] == 'org.matrix.custom.html' && - displayEvent.content['formatted_body'] is String) { - String? html = displayEvent.content['formatted_body']; - if (displayEvent.messageType == MessageTypes.Emote) { - html = '* $html'; - } - replyBody = HtmlMessage( - html: html!, - defaultTextStyle: TextStyle( - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, - fontSize: fontSize, - ), - maxLines: 1, - room: displayEvent.room, - emoteSize: fontSize * 1.5, - ); - } else { - replyBody = Text( - displayEvent.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, - hideReply: true, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - style: TextStyle( - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, - fontSize: fontSize, - ), - ); - } - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 3, - height: fontSize * 2 + 6, - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, - ), - const SizedBox(width: 6), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FutureBuilder( + final color = ownMessage + ? theme.colorScheme.tertiaryContainer + : theme.colorScheme.tertiary; + + return Material( + color: backgroundColor ?? + theme.colorScheme.surface.withAlpha(ownMessage ? 50 : 80), + borderRadius: borderRadius, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 3, + height: fontSize * 2 + 16, + color: color, + ), + const SizedBox(width: 6), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FutureBuilder( + initialData: displayEvent.senderFromMemoryOrFallback, future: displayEvent.fetchSenderUser(), builder: (context, snapshot) { return Text( - (snapshot.data?.calcDisplayname() ?? - displayEvent.senderFromMemoryOrFallback - .calcDisplayname()) + - ':', + '${snapshot.data?.calcDisplayname() ?? displayEvent.senderFromMemoryOrFallback.calcDisplayname()}:', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontWeight: FontWeight.bold, - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, + color: color, fontSize: fontSize, ), ); - }), - replyBody, - ], + }, + ), + Text( + displayEvent.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + color: ownMessage + ? theme.colorScheme.onTertiary + : theme.colorScheme.onSurface, + fontSize: fontSize, + ), + ), + ], + ), ), - ), - ], + const SizedBox(width: 6), + ], + ), ); } } diff --git a/lib/pages/chat/events/room_creation_state_event.dart b/lib/pages/chat/events/room_creation_state_event.dart new file mode 100644 index 0000000000..398afc59fd --- /dev/null +++ b/lib/pages/chat/events/room_creation_state_event.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; + +class RoomCreationStateEvent extends StatelessWidget { + final Event event; + const RoomCreationStateEvent({required this.event, super.key}); + + @override + Widget build(BuildContext context) { + final l10n = L10n.of(context); + final matrixLocals = MatrixLocals(l10n); + final theme = Theme.of(context); + final roomName = event.room.getLocalizedDisplayname(matrixLocals); + return Padding( + padding: const EdgeInsets.only(bottom: 32.0), + child: Center( + child: Material( + color: theme.colorScheme.surface.withAlpha(128), + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + mxContent: event.room.avatar, + name: roomName, + size: Avatar.defaultSize * 2, + ), + Text( + roomName, + style: theme.textTheme.headlineSmall, + ), + Text( + '${event.originServerTs.localizedTime(context)} | ${l10n.countParticipants((event.room.summary.mJoinedMemberCount ?? 1) + (event.room.summary.mInvitedMemberCount ?? 0))}', + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/events/state_message.dart b/lib/pages/chat/events/state_message.dart index 6e270ae6db..28f1147b3c 100644 --- a/lib/pages/chat/events/state_message.dart +++ b/lib/pages/chat/events/state_message.dart @@ -3,69 +3,40 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import '../../../config/app_config.dart'; class StateMessage extends StatelessWidget { final Event event; - final void Function(String) unfold; - const StateMessage(this.event, {required this.unfold, Key? key}) - : super(key: key); + const StateMessage(this.event, {super.key}); @override Widget build(BuildContext context) { - if (event.unsigned!['im.fluffychat.collapsed_state_event'] == true) { - return Container(); - } - final int counter = - event.unsigned!['im.fluffychat.collapsed_state_event_count'] ?? 0; + final theme = Theme.of(context); return Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 4.0, - ), + padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Center( - child: InkWell( - onTap: counter != 0 ? () => unfold(event.eventId) : null, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - child: Container( - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - color: Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.grey.shade900, - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - FutureBuilder( - future: event - .calcLocalizedBody(MatrixLocals(L10n.of(context)!)), - builder: (context, snapshot) { - return Text( - snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!)), - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 14 * AppConfig.fontSizeFactor, - color: Theme.of(context).textTheme.bodyText2!.color, - decoration: event.redacted - ? TextDecoration.lineThrough - : null, - ), - ); - }), - if (counter != 0) - Text( - L10n.of(context)!.moreEvents(counter), - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14 * AppConfig.fontSizeFactor, - ), - ), - ], + child: Padding( + padding: const EdgeInsets.all(4), + child: Material( + color: theme.colorScheme.surface.withAlpha(128), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 3), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + child: Text( + event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + ), + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12 * AppConfig.fontSizeFactor, + decoration: + event.redacted ? TextDecoration.lineThrough : null, + ), + ), ), ), ), diff --git a/lib/pages/chat/events/sticker.dart b/lib/pages/chat/events/sticker.dart deleted file mode 100644 index 4e1618e6f7..0000000000 --- a/lib/pages/chat/events/sticker.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import '../../../config/app_config.dart'; -import 'image_bubble.dart'; - -class Sticker extends StatefulWidget { - final Event event; - - const Sticker(this.event, {Key? key}) : super(key: key); - - @override - _StickerState createState() => _StickerState(); -} - -class _StickerState extends State { - bool? animated; - - @override - Widget build(BuildContext context) { - return ImageBubble( - widget.event, - width: 400, - height: 400, - fit: BoxFit.contain, - onTap: () { - setState(() => animated = true); - showOkAlertDialog( - context: context, - message: widget.event.body, - okLabel: L10n.of(context)!.ok, - ); - }, - animated: animated ?? AppConfig.autoplayImages, - ); - } -} diff --git a/lib/pages/chat/events/verification_request_content.dart b/lib/pages/chat/events/verification_request_content.dart index 423e418d36..9b085114f2 100644 --- a/lib/pages/chat/events/verification_request_content.dart +++ b/lib/pages/chat/events/verification_request_content.dart @@ -9,12 +9,16 @@ class VerificationRequestContent extends StatelessWidget { final Event event; final Timeline timeline; - const VerificationRequestContent( - {required this.event, required this.timeline, Key? key}) - : super(key: key); + const VerificationRequestContent({ + required this.event, + required this.timeline, + super.key, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final events = event.aggregatedEvents(timeline, 'm.reference'); final done = events.where((e) => e.type == EventTypes.KeyVerificationDone); final start = @@ -34,27 +38,31 @@ class VerificationRequestContent extends StatelessWidget { padding: const EdgeInsets.all(8), decoration: BoxDecoration( border: Border.all( - color: Theme.of(context).dividerColor, + color: theme.dividerColor, ), borderRadius: BorderRadius.circular(AppConfig.borderRadius), - color: Theme.of(context).backgroundColor, + color: theme.colorScheme.surface, ), child: Row( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Icon(Icons.lock_outlined, - color: canceled - ? Colors.red - : (fullyDone ? Colors.green : Colors.grey)), + Icon( + Icons.lock_outlined, + color: canceled + ? Colors.red + : (fullyDone ? Colors.green : Colors.grey), + ), const SizedBox(width: 8), - Text(canceled - ? 'Error ${cancel.first.content.tryGet('code')}: ${cancel.first.content.tryGet('reason')}' - : (fullyDone - ? L10n.of(context)!.verifySuccess - : (started - ? L10n.of(context)!.loadingPleaseWait - : L10n.of(context)!.newVerificationRequest))) + Text( + canceled + ? 'Error ${cancel.first.content.tryGet('code')}: ${cancel.first.content.tryGet('reason')}' + : (fullyDone + ? L10n.of(context).verifySuccess + : (started + ? L10n.of(context).loadingPleaseWait + : L10n.of(context).newVerificationRequest)), + ), ], ), ), diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart index 9cbcb9bc8b..3f2b3d0cca 100644 --- a/lib/pages/chat/events/video_player.dart +++ b/lib/pages/chat/events/video_player.dart @@ -4,33 +4,39 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:chewie/chewie.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; import 'package:universal_html/html.dart' as html; import 'package:video_player/video_player.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat/events/image_bubble.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/event_extension.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/blur_hash.dart'; +import '../../../utils/error_reporter.dart'; class EventVideoPlayer extends StatefulWidget { final Event event; - const EventVideoPlayer(this.event, {Key? key}) : super(key: key); + const EventVideoPlayer(this.event, {super.key}); @override - _EventVideoPlayerState createState() => _EventVideoPlayerState(); + EventVideoPlayerState createState() => EventVideoPlayerState(); } -class _EventVideoPlayerState extends State { +class EventVideoPlayerState extends State { ChewieController? _chewieManager; bool _isDownloading = false; String? _networkUri; File? _tmpFile; void _downloadAction() async { + if (PlatformInfos.isDesktop) { + widget.event.saveFile(context); + return; + } setState(() => _isDownloading = true); try { final videoFile = await widget.event.downloadAndDecryptAttachment(); @@ -40,7 +46,8 @@ class _EventVideoPlayerState extends State { } else { final tempDir = await getTemporaryDirectory(); final fileName = Uri.encodeComponent( - widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last); + widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, + ); final file = File('${tempDir.path}/${fileName}_${videoFile.name}'); if (await file.exists() == false) { await file.writeAsBytes(videoFile.bytes); @@ -51,26 +58,27 @@ class _EventVideoPlayerState extends State { final networkUri = _networkUri; if (kIsWeb && networkUri != null && _chewieManager == null) { _chewieManager ??= ChewieController( - videoPlayerController: VideoPlayerController.network(networkUri), + videoPlayerController: + VideoPlayerController.networkUrl(Uri.parse(networkUri)), autoPlay: true, autoInitialize: true, ); } else if (!kIsWeb && tmpFile != null && _chewieManager == null) { _chewieManager ??= ChewieController( + useRootNavigator: false, videoPlayerController: VideoPlayerController.file(tmpFile), autoPlay: true, autoInitialize: true, ); } - } on MatrixConnectionException catch (e) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(e.toLocalizedString(context)), - )); + } on IOException catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(e.toLocalizedString(context)), + ), + ); } catch (e, s) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(e.toLocalizedString(context)), - )); - SentryController.captureException(e, s); + ErrorReporter(context, 'Unable to play video').onErrorCallback(e, s); } finally { // Workaround for Chewie needs time to get the aspectRatio await Future.delayed(const Duration(milliseconds: 100)); @@ -88,6 +96,8 @@ class _EventVideoPlayerState extends State { @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final hasThumbnail = widget.event.hasThumbnail; final blurHash = (widget.event.infoMap as Map) .tryGet('xyz.amorgan.blurhash') ?? @@ -96,6 +106,7 @@ class _EventVideoPlayerState extends State { final chewieManager = _chewieManager; return Material( color: Colors.black, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), child: SizedBox( height: 300, child: chewieManager != null @@ -110,26 +121,26 @@ class _EventVideoPlayerState extends State { ), ) else - BlurHash(hash: blurHash), + BlurHash(blurhash: blurHash, width: 300, height: 300), Center( - child: OutlinedButton.icon( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.surface, + child: IconButton( + style: IconButton.styleFrom( + backgroundColor: theme.colorScheme.surface, ), icon: _isDownloading ? const SizedBox( width: 24, height: 24, child: CircularProgressIndicator.adaptive( - strokeWidth: 2), + strokeWidth: 2, + ), ) - : const Icon(Icons.download_outlined), - label: Text( - _isDownloading - ? L10n.of(context)!.loadingPleaseWait - : L10n.of(context)!.videoWithSize( - widget.event.sizeString ?? '?MB'), - ), + : const Icon(Icons.play_circle_outlined), + tooltip: _isDownloading + ? L10n.of(context).loadingPleaseWait + : L10n.of(context).videoWithSize( + widget.event.sizeString ?? '?MB', + ), onPressed: _isDownloading ? null : _downloadAction, ), ), diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index b2ffb156fe..150a7ebc0b 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -1,14 +1,17 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:cached_network_image/cached_network_image.dart'; +import 'package:emojis/emoji.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:matrix/matrix.dart'; +import 'package:pasteboard/pasteboard.dart'; import 'package:slugify/slugify.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/markdown_context_builder.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import '../../widgets/avatar.dart'; import '../../widgets/matrix.dart'; import 'command_hints.dart'; @@ -20,6 +23,7 @@ class InputBar extends StatelessWidget { final TextInputType? keyboardType; final TextInputAction? textInputAction; final ValueChanged? onSubmitted; + final ValueChanged? onSubmitImage; final FocusNode? focusNode; final TextEditingController? controller; final InputDecoration? decoration; @@ -33,6 +37,7 @@ class InputBar extends StatelessWidget { this.maxLines, this.keyboardType, this.onSubmitted, + this.onSubmitImage, this.focusNode, this.controller, this.decoration, @@ -40,8 +45,8 @@ class InputBar extends StatelessWidget { this.autofocus, this.textInputAction, this.readOnly = false, - Key? key, - }) : super(key: key); + super.key, + }); List> getSuggestions(String text) { if (controller!.selection.baseOffset != @@ -51,10 +56,10 @@ class InputBar extends StatelessWidget { } final searchText = controller!.text.substring(0, controller!.selection.baseOffset); - final List> ret = >[]; + final ret = >[]; const maxResults = 30; - final commandMatch = RegExp(r'^\/([\w]*)$').firstMatch(searchText); + final commandMatch = RegExp(r'^/(\w*)$').firstMatch(searchText); if (commandMatch != null) { final commandSearch = commandMatch[1]!.toLowerCase(); for (final command in room.client.commands.keys) { @@ -114,6 +119,41 @@ class InputBar extends StatelessWidget { } } } + // aside of emote packs, also propose normal (tm) unicode emojis + final matchingUnicodeEmojis = Emoji.all() + .where( + (element) => [element.name, ...element.keywords] + .any((element) => element.toLowerCase().contains(emoteSearch)), + ) + .toList(); + // sort by the index of the search term in the name in order to have + // best matches first + // (thanks for the hint by github.com/nextcloud/circles devs) + matchingUnicodeEmojis.sort((a, b) { + final indexA = a.name.indexOf(emoteSearch); + final indexB = b.name.indexOf(emoteSearch); + if (indexA == -1 || indexB == -1) { + if (indexA == indexB) return 0; + if (indexA == -1) { + return 1; + } else { + return 0; + } + } + return indexA.compareTo(indexB); + }); + for (final emoji in matchingUnicodeEmojis) { + ret.add({ + 'type': 'emoji', + 'emoji': emoji.char, + // don't include sub-group names, splitting at `:` hence + 'label': '${emoji.char} - ${emoji.name.split(':').first}', + 'current_word': ':$emoteSearch', + }); + if (ret.length > maxResults) { + break; + } + } } final userMatch = RegExp(r'(?:\s|^)@([-\w]+)$').firstMatch(searchText); if (userMatch != null) { @@ -147,22 +187,25 @@ class InputBar extends StatelessWidget { final state = r.getState(EventTypes.RoomCanonicalAlias); if ((state != null && ((state.content['alias'] is String && - state.content['alias'] + state.content + .tryGet('alias')! .split(':')[0] .toLowerCase() .contains(roomSearch)) || (state.content['alt_aliases'] is List && - state.content['alt_aliases'].any((l) => - l is String && - l - .split(':')[0] - .toLowerCase() - .contains(roomSearch))))) || + (state.content['alt_aliases'] as List).any( + (l) => + l is String && + l + .split(':')[0] + .toLowerCase() + .contains(roomSearch), + )))) || (r.name.toLowerCase().contains(roomSearch))) { ret.add({ 'type': 'room', 'mxid': (r.canonicalAlias.isNotEmpty) ? r.canonicalAlias : r.id, - 'displayname': r.displayname, + 'displayname': r.getLocalizedDisplayname(), 'avatar_url': r.avatar?.toString(), }); } @@ -179,11 +222,12 @@ class InputBar extends StatelessWidget { Map suggestion, Client? client, ) { + final theme = Theme.of(context); const size = 30.0; const padding = EdgeInsets.all(4.0); if (suggestion['type'] == 'command') { final command = suggestion['name']!; - final hint = commandHint(L10n.of(context)!, command); + final hint = commandHint(L10n.of(context), command); return Tooltip( message: hint, waitDuration: const Duration(days: 1), // don't show on hover @@ -192,37 +236,47 @@ class InputBar extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('/' + command, - style: const TextStyle(fontFamily: 'monospace')), + Text( + commandExample(command), + style: const TextStyle(fontFamily: 'monospace'), + ), Text( hint, maxLines: 1, overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.caption, + style: theme.textTheme.bodySmall, ), ], ), ), ); } - if (suggestion['type'] == 'emote') { - final ratio = MediaQuery.of(context).devicePixelRatio; - final url = Uri.parse(suggestion['mxc'] ?? '').getThumbnail( - room.client, - width: size * ratio, - height: size * ratio, - method: ThumbnailMethod.scale, - animated: true, + if (suggestion['type'] == 'emoji') { + final label = suggestion['label']!; + return Tooltip( + message: label, + waitDuration: const Duration(days: 1), // don't show on hover + child: Container( + padding: padding, + child: Text(label, style: const TextStyle(fontFamily: 'monospace')), + ), ); + } + if (suggestion['type'] == 'emote') { return Container( padding: padding, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - CachedNetworkImage( - imageUrl: url.toString(), + MxcImage( + // ensure proper ordering ... + key: ValueKey(suggestion['name']), + uri: suggestion['mxc'] is String + ? Uri.parse(suggestion['mxc'] ?? '') + : null, width: size, height: size, + isThumbnail: false, ), const SizedBox(width: 6), Text(suggestion['name']!), @@ -234,8 +288,8 @@ class InputBar extends StatelessWidget { child: suggestion['pack_avatar_url'] != null ? Avatar( mxContent: Uri.tryParse( - suggestion.tryGet('pack_avatar_url') ?? - ''), + suggestion.tryGet('pack_avatar_url') ?? '', + ), name: suggestion.tryGet('pack_display_name'), size: size * 0.9, client: client, @@ -268,7 +322,7 @@ class InputBar extends StatelessWidget { ), ); } - return Container(); + return const SizedBox.shrink(); } void insertSuggestion(_, Map suggestion) { @@ -280,10 +334,17 @@ class InputBar extends StatelessWidget { : controller!.text.substring(controller!.selection.baseOffset + 1); var insertText = ''; if (suggestion['type'] == 'command') { - insertText = suggestion['name']! + ' '; + insertText = '${suggestion['name']!} '; + startText = replaceText.replaceAllMapped( + RegExp(r'^(/\w*)$'), + (Match m) => '/$insertText', + ); + } + if (suggestion['type'] == 'emoji') { + insertText = '${suggestion['emoji']!} '; startText = replaceText.replaceAllMapped( - RegExp(r'^(\/[\w]*)$'), - (Match m) => '/' + insertText, + suggestion['current_word']!, + (Match m) => insertText, ); } if (suggestion['type'] == 'emote') { @@ -305,21 +366,21 @@ class InputBar extends StatelessWidget { break; } } - insertText = ':${isUnique ? '' : insertPack! + '~'}$insertEmote: '; + insertText = ':${isUnique ? '' : '${insertPack!}~'}$insertEmote: '; startText = replaceText.replaceAllMapped( RegExp(r'(\s|^)(:(?:[-\w]+~)?[-\w]+)$'), (Match m) => '${m[1]}$insertText', ); } if (suggestion['type'] == 'user') { - insertText = suggestion['mention']! + ' '; + insertText = '${suggestion['mention']!} '; startText = replaceText.replaceAllMapped( RegExp(r'(\s|^)(@[-\w]+)$'), (Match m) => '${m[1]}$insertText', ); } if (suggestion['type'] == 'room') { - insertText = suggestion['mxid']! + ' '; + insertText = '${suggestion['mxid']!} '; startText = replaceText.replaceAllMapped( RegExp(r'(\s|^)(#[-\w]+)$'), (Match m) => '${m[1]}$insertText', @@ -336,9 +397,7 @@ class InputBar extends StatelessWidget { @override Widget build(BuildContext context) { - final useShortCuts = (PlatformInfos.isWeb || - PlatformInfos.isDesktop || - AppConfig.sendOnEnter); + final useShortCuts = (AppConfig.sendOnEnter ?? !PlatformInfos.isMobile); return Shortcuts( shortcuts: !useShortCuts ? {} @@ -346,54 +405,91 @@ class InputBar extends StatelessWidget { LogicalKeySet(LogicalKeyboardKey.shift, LogicalKeyboardKey.enter): NewLineIntent(), LogicalKeySet(LogicalKeyboardKey.enter): SubmitLineIntent(), + LogicalKeySet( + LogicalKeyboardKey.controlLeft, + LogicalKeyboardKey.keyM, + ): PasteLineIntent(), }, child: Actions( actions: !useShortCuts ? {} : { - NewLineIntent: CallbackAction(onInvoke: (i) { - final val = controller!.value; - final selection = val.selection.start; - final messageWithoutNewLine = - controller!.text.substring(0, val.selection.start) + - '\n' + - controller!.text.substring(val.selection.end); - controller!.value = TextEditingValue( - text: messageWithoutNewLine, - selection: TextSelection.fromPosition( - TextPosition(offset: selection + 1), - ), - ); - return null; - }), - SubmitLineIntent: CallbackAction(onInvoke: (i) { - onSubmitted!(controller!.text); - return null; - }), + NewLineIntent: CallbackAction( + onInvoke: (i) { + final val = controller!.value; + final selection = val.selection.start; + final messageWithoutNewLine = + '${controller!.text.substring(0, val.selection.start)}\n${controller!.text.substring(val.selection.end)}'; + controller!.value = TextEditingValue( + text: messageWithoutNewLine, + selection: TextSelection.fromPosition( + TextPosition(offset: selection + 1), + ), + ); + return null; + }, + ), + SubmitLineIntent: CallbackAction( + onInvoke: (i) { + onSubmitted!(controller!.text); + return null; + }, + ), + PasteLineIntent: CallbackAction( + onInvoke: (i) async { + final image = await Pasteboard.image; + if (image != null) { + onSubmitImage!(image); + return null; + } + return null; + }, + ), }, child: TypeAheadField>( - direction: AxisDirection.up, + direction: VerticalDirection.up, hideOnEmpty: true, hideOnLoading: true, - keepSuggestionsOnSuggestionSelected: true, + controller: controller, + focusNode: focusNode, + hideOnSelect: false, + debounceDuration: const Duration(milliseconds: 50), + // show suggestions after 50ms idle time (default is 300) + builder: (context, controller, focusNode) => TextField( + controller: controller, + focusNode: focusNode, + contextMenuBuilder: (c, e) => + markdownContextBuilder(c, e, controller), + contentInsertionConfiguration: ContentInsertionConfiguration( + onContentInserted: (KeyboardInsertedContent content) { + final data = content.data; + if (data == null) return; - debounceDuration: const Duration( - milliseconds: - 50), // show suggestions after 50ms idle time (default is 300) - textFieldConfiguration: TextFieldConfiguration( + final file = MatrixFile( + mimeType: content.mimeType, + bytes: data, + name: content.uri.split('/').last, + ); + room.sendFileEvent( + file, + shrinkImageMaxDimension: 1600, + ); + }, + ), minLines: minLines, maxLines: maxLines, keyboardType: keyboardType!, textInputAction: textInputAction, autofocus: autofocus!, + inputFormatters: [ + LengthLimitingTextInputFormatter((maxPDUSize / 3).floor()), + ], onSubmitted: (text) { // fix for library for now // it sets the types for the callback incorrectly onSubmitted!(text); }, - controller: controller, decoration: decoration!, - focusNode: focusNode, onChanged: (text) { // fix for the library for now // it sets the types for the callback incorrectly @@ -404,13 +500,14 @@ class InputBar extends StatelessWidget { suggestionsCallback: getSuggestions, itemBuilder: (c, s) => buildSuggestion(c, s, Matrix.of(context).client), - onSuggestionSelected: (Map suggestion) => + onSelected: (Map suggestion) => insertSuggestion(context, suggestion), - errorBuilder: (BuildContext context, Object? error) => Container(), - loadingBuilder: (BuildContext context) => - Container(), // fix loading briefly flickering a dark box - noItemsFoundBuilder: (BuildContext context) => - Container(), // fix loading briefly showing no suggestions + errorBuilder: (BuildContext context, Object? error) => + const SizedBox.shrink(), + loadingBuilder: (BuildContext context) => const SizedBox.shrink(), + // fix loading briefly flickering a dark box + emptyBuilder: (BuildContext context) => const SizedBox + .shrink(), // fix loading briefly showing no suggestions ), ), ); @@ -420,3 +517,5 @@ class InputBar extends StatelessWidget { class NewLineIntent extends Intent {} class SubmitLineIntent extends Intent {} + +class PasteLineIntent extends Intent {} diff --git a/lib/pages/chat/pinned_events.dart b/lib/pages/chat/pinned_events.dart index 02e72c8fe9..c27f606fae 100644 --- a/lib/pages/chat/pinned_events.dart +++ b/lib/pages/chat/pinned_events.dart @@ -2,135 +2,91 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat/chat.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; -import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; class PinnedEvents extends StatelessWidget { final ChatController controller; - const PinnedEvents(this.controller, {Key? key}) : super(key: key); + const PinnedEvents(this.controller, {super.key}); + + Future _displayPinnedEventsDialog(BuildContext context) async { + final eventsResult = await showFutureLoadingDialog( + context: context, + future: () => Future.wait( + controller.room.pinnedEventIds.map( + (eventId) => controller.room.getEventById(eventId), + ), + ), + ); + final events = eventsResult.result; + if (events == null) return; - Future _displayPinnedEventsDialog( - BuildContext context, List events) async { final eventId = events.length == 1 ? events.single?.eventId - : await showModalActionSheet( + : await showModalActionPopup( context: context, + title: L10n.of(context).pin, + cancelLabel: L10n.of(context).cancel, actions: events - .map((event) => SheetAction( - key: event?.eventId ?? '', - label: event?.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true, - hideReply: true, - ) ?? - 'UNKNOWN', - )) - .toList()); + .map( + (event) => AdaptiveModalAction( + value: event?.eventId ?? '', + icon: const Icon(Icons.push_pin_outlined), + label: event?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + hideReply: true, + ) ?? + 'UNKNOWN', + ), + ) + .toList(), + ); if (eventId != null) controller.scrollToEventId(eventId); } @override Widget build(BuildContext context) { - final pinnedEventIds = controller.room!.pinnedEventIds; + final theme = Theme.of(context); + + final pinnedEventIds = controller.room.pinnedEventIds; if (pinnedEventIds.isEmpty) { - return Container(); + return const SizedBox.shrink(); } - final completers = pinnedEventIds.map>((e) { - final completer = Completer(); - controller.room! - .getEventById(e) - .then((value) => completer.complete(value)); - return completer; - }); - return FutureBuilder>( - future: Future.wait(completers.map((e) => e.future).toList()), - builder: (context, snapshot) { - final pinnedEvents = snapshot.data; - final event = (pinnedEvents != null && pinnedEvents.isNotEmpty) - ? snapshot.data?.last - : null; - if (event == null || pinnedEvents == null) { - return Container(); - } - - final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - return Material( - color: Theme.of(context).colorScheme.surfaceVariant, - child: InkWell( - onTap: () => _displayPinnedEventsDialog( - context, - pinnedEvents, - ), - child: Row( - children: [ - IconButton( - splashRadius: 20, - iconSize: 20, - color: Theme.of(context).colorScheme.onSurfaceVariant, - icon: const Icon(Icons.push_pin), - tooltip: L10n.of(context)!.unpin, - onPressed: controller.room - ?.canSendEvent(EventTypes.RoomPinnedEvents) ?? - false - ? () => controller.unpinEvent(event.eventId) - : null, - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: FutureBuilder( - future: event.calcLocalizedBody( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true, - hideReply: true, - ), - builder: (context, snapshot) { - return LinkText( - text: snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true, - hideReply: true, - ), - maxLines: 2, - textStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurfaceVariant, - overflow: TextOverflow.ellipsis, - fontSize: fontSize, - decoration: event.redacted - ? TextDecoration.lineThrough - : null, - ), - linkStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurfaceVariant, - fontSize: fontSize, - decoration: TextDecoration.underline, - ), - onLinkTap: (url) => - UrlLauncher(context, url).launchUrl(), - ); - }), - ), - ), - ], - ), - ), - ); - }); + return FutureBuilder( + future: controller.room.getEventById(pinnedEventIds.last), + builder: (context, snapshot) { + final event = snapshot.data; + return ChatAppBarListTile( + title: event?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + hideReply: true, + ) ?? + L10n.of(context).loadingPleaseWait, + leading: IconButton( + splashRadius: 18, + iconSize: 18, + color: theme.colorScheme.onSurfaceVariant, + icon: const Icon(Icons.push_pin), + tooltip: L10n.of(context).unpin, + onPressed: controller.room.canSendEvent(EventTypes.RoomPinnedEvents) + ? () => controller.unpinEvent(event!.eventId) + : null, + ), + onTap: () => _displayPinnedEventsDialog(context), + ); + }, + ); } } diff --git a/lib/pages/chat/reactions_picker.dart b/lib/pages/chat/reactions_picker.dart index ab70d548d7..2610a0d509 100644 --- a/lib/pages/chat/reactions_picker.dart +++ b/lib/pages/chat/reactions_picker.dart @@ -5,48 +5,60 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/app_emojis.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import '../../config/themes.dart'; class ReactionsPicker extends StatelessWidget { final ChatController controller; - const ReactionsPicker(this.controller, {Key? key}) : super(key: key); + + const ReactionsPicker(this.controller, {super.key}); @override Widget build(BuildContext context) { - if (controller.showEmojiPicker) return Container(); + final theme = Theme.of(context); + + if (controller.showEmojiPicker) return const SizedBox.shrink(); final display = controller.editEvent == null && controller.replyEvent == null && - controller.room!.canSendDefaultMessages && + controller.room.canSendDefaultMessages && controller.selectedEvents.isNotEmpty; return AnimatedContainer( - duration: const Duration(milliseconds: 300), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, height: (display) ? 56 : 0, child: Material( color: Colors.transparent, - child: Builder(builder: (context) { - if (!display) { - return Container(); - } - final emojis = List.from(AppEmojis.emojis); - final allReactionEvents = controller.selectedEvents.first - .aggregatedEvents( - controller.timeline!, RelationshipTypes.reaction) - .where((event) => - event.senderId == event.room.client.userID && - event.type == 'm.reaction'); + child: Builder( + builder: (context) { + if (!display) { + return const SizedBox.shrink(); + } + final emojis = List.from(AppEmojis.emojis); + final allReactionEvents = controller.selectedEvents.first + .aggregatedEvents( + controller.timeline!, + RelationshipTypes.reaction, + ) + .where( + (event) => + event.senderId == event.room.client.userID && + event.type == 'm.reaction', + ); - for (final event in allReactionEvents) { - try { - emojis.remove(event.content['m.relates_to']['key']); - } catch (_) {} - } - return Row(children: [ - Expanded( - child: Container( + for (final event in allReactionEvents) { + try { + emojis.remove(event.content.tryGetMap('m.relates_to')!['key']); + } catch (_) {} + } + return Row( + children: [ + Expanded( + child: Container( decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: const BorderRadius.only( - bottomRight: - Radius.circular(AppConfig.borderRadius))), + color: theme.colorScheme.onInverseSurface, + borderRadius: const BorderRadius.only( + bottomRight: Radius.circular(AppConfig.borderRadius), + ), + ), padding: const EdgeInsets.only(right: 1), child: ListView.builder( scrollDirection: Axis.horizontal, @@ -64,23 +76,28 @@ class ReactionsPicker extends StatelessWidget { ), ), ), - ))), - InkWell( - borderRadius: BorderRadius.circular(8), - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 8), - width: 36, - height: 56, - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - shape: BoxShape.circle, + ), + ), + ), + InkWell( + borderRadius: BorderRadius.circular(8), + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 8), + width: 36, + height: 56, + decoration: BoxDecoration( + color: theme.colorScheme.onInverseSurface, + shape: BoxShape.circle, + ), + child: const Icon(Icons.add_outlined), ), - child: const Icon(Icons.add_outlined), + onTap: () => + controller.pickEmojiReactionAction(allReactionEvents), ), - onTap: () => - controller.pickEmojiReactionAction(allReactionEvents)) - ]); - }), + ], + ); + }, + ), ), ); } diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart index 1958860d07..68e86fa119 100644 --- a/lib/pages/chat/recording_dialog.dart +++ b/lib/pages/chat/recording_dialog.dart @@ -1,56 +1,78 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:path/path.dart' as path_lib; import 'package:path_provider/path_provider.dart'; import 'package:record/record.dart'; -import 'package:wakelock/wakelock.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; import 'events/audio_player.dart'; class RecordingDialog extends StatefulWidget { - static const String recordingFileType = 'm4a'; const RecordingDialog({ - Key? key, - }) : super(key: key); + super.key, + }); @override - _RecordingDialogState createState() => _RecordingDialogState(); + RecordingDialogState createState() => RecordingDialogState(); } -class _RecordingDialogState extends State { +class RecordingDialogState extends State { Timer? _recorderSubscription; Duration _duration = Duration.zero; bool error = false; - String? _recordedPath; - final _audioRecorder = Record(); + + final _audioRecorder = AudioRecorder(); final List amplitudeTimeline = []; + String? fileName; + static const int bitRate = 64000; - static const int samplingRate = 22050; + static const int samplingRate = 44100; Future startRecording() async { try { - final tempDir = await getTemporaryDirectory(); - _recordedPath = - '${tempDir.path}/recording${DateTime.now().microsecondsSinceEpoch}.${RecordingDialog.recordingFileType}'; + final codec = kIsWeb + // Web seems to create webm instead of ogg when using opus encoder + // which does not play on iOS right now. So we use wav for now: + ? AudioEncoder.wav + // Everywhere else we use opus if supported by the platform: + : await _audioRecorder.isEncoderSupported(AudioEncoder.opus) + ? AudioEncoder.opus + : AudioEncoder.aacLc; + fileName = + 'recording${DateTime.now().microsecondsSinceEpoch}.${codec.fileExtension}'; + String? path; + if (!kIsWeb) { + final tempDir = await getTemporaryDirectory(); + path = path_lib.join(tempDir.path, fileName); + } final result = await _audioRecorder.hasPermission(); if (result != true) { setState(() => error = true); return; } - await Wakelock.enable(); + await WakelockPlus.enable(); + await _audioRecorder.start( - path: _recordedPath, - bitRate: bitRate, - samplingRate: samplingRate, + RecordConfig( + bitRate: bitRate, + sampleRate: samplingRate, + numChannels: 1, + autoGain: true, + echoCancel: true, + noiseSuppress: true, + encoder: codec, + ), + path: path ?? '', ); setState(() => _duration = Duration.zero); _recorderSubscription?.cancel(); @@ -64,9 +86,9 @@ class _RecordingDialogState extends State { _duration += const Duration(milliseconds: 100); }); }); - } catch (e, s) { - SentryController.captureException(e, s); + } catch (_) { setState(() => error = true); + rethrow; } } @@ -78,7 +100,7 @@ class _RecordingDialogState extends State { @override void dispose() { - Wakelock.disable(); + WakelockPlus.disable(); _recorderSubscription?.cancel(); _audioRecorder.stop(); super.dispose(); @@ -86,8 +108,8 @@ class _RecordingDialogState extends State { void _stopAndSend() async { _recorderSubscription?.cancel(); - await _audioRecorder.stop(); - final path = _recordedPath; + final path = await _audioRecorder.stop(); + if (path == null) throw ('Recording failed!'); const waveCount = AudioPlayerWidget.wavesCount; final step = amplitudeTimeline.length < waveCount @@ -102,17 +124,20 @@ class _RecordingDialogState extends State { path: path, duration: _duration.inMilliseconds, waveform: waveform, + fileName: fileName, ), ); } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + const maxDecibalWidth = 64.0; final time = '${_duration.inMinutes.toString().padLeft(2, '0')}:${(_duration.inSeconds % 60).toString().padLeft(2, '0')}'; final content = error - ? Text(L10n.of(context)!.oopsSomethingWentWrong) + ? Text(L10n.of(context).oopsSomethingWentWrong) : Row( children: [ Container( @@ -131,15 +156,18 @@ class _RecordingDialogState extends State { .take(26) .toList() .reversed - .map((amplitude) => Container( + .map( + (amplitude) => Container( margin: const EdgeInsets.only(left: 2), width: 4, decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, + color: theme.colorScheme.primary, borderRadius: BorderRadius.circular(AppConfig.borderRadius), ), - height: maxDecibalWidth * (amplitude / 100))) + height: maxDecibalWidth * (amplitude / 100), + ), + ) .toList(), ), ), @@ -157,20 +185,16 @@ class _RecordingDialogState extends State { CupertinoDialogAction( onPressed: () => Navigator.of(context, rootNavigator: false).pop(), child: Text( - L10n.of(context)!.cancel.toUpperCase(), + L10n.of(context).cancel.toUpperCase(), style: TextStyle( - color: Theme.of(context) - .textTheme - .bodyText2 - ?.color - ?.withAlpha(150), + color: theme.textTheme.bodyMedium?.color?.withAlpha(150), ), ), ), if (error != true) CupertinoDialogAction( onPressed: _stopAndSend, - child: Text(L10n.of(context)!.send.toUpperCase()), + child: Text(L10n.of(context).send.toUpperCase()), ), ], ); @@ -181,10 +205,9 @@ class _RecordingDialogState extends State { TextButton( onPressed: () => Navigator.of(context, rootNavigator: false).pop(), child: Text( - L10n.of(context)!.cancel.toUpperCase(), + L10n.of(context).cancel.toUpperCase(), style: TextStyle( - color: - Theme.of(context).textTheme.bodyText2?.color?.withAlpha(150), + color: theme.textTheme.bodyMedium?.color?.withAlpha(150), ), ), ), @@ -194,7 +217,7 @@ class _RecordingDialogState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text(L10n.of(context)!.send.toUpperCase()), + Text(L10n.of(context).send.toUpperCase()), const SizedBox(width: 4), const Icon(Icons.send_outlined, size: 15), ], @@ -209,23 +232,32 @@ class RecordingResult { final String path; final int duration; final List waveform; + final String? fileName; const RecordingResult({ required this.path, required this.duration, required this.waveform, + required this.fileName, }); +} - factory RecordingResult.fromJson(Map json) => - RecordingResult( - path: json['path'], - duration: json['duration'], - waveform: List.from(json['waveform']), - ); - - Map toJson() => { - 'path': path, - 'duration': duration, - 'waveform': waveform, - }; +extension on AudioEncoder { + String get fileExtension { + switch (this) { + case AudioEncoder.aacLc: + case AudioEncoder.aacEld: + case AudioEncoder.aacHe: + return 'm4a'; + case AudioEncoder.opus: + return 'ogg'; + case AudioEncoder.wav: + return 'wav'; + case AudioEncoder.amrNb: + case AudioEncoder.amrWb: + case AudioEncoder.flac: + case AudioEncoder.pcm16bits: + throw UnsupportedError('Not yet used'); + } + } } diff --git a/lib/pages/chat/reply_display.dart b/lib/pages/chat/reply_display.dart index ccb6e6a739..ec607e1ac6 100644 --- a/lib/pages/chat/reply_display.dart +++ b/lib/pages/chat/reply_display.dart @@ -3,41 +3,48 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import '../../config/themes.dart'; import 'chat.dart'; import 'events/reply_content.dart'; class ReplyDisplay extends StatelessWidget { final ChatController controller; - const ReplyDisplay(this.controller, {Key? key}) : super(key: key); + const ReplyDisplay(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return AnimatedContainer( - duration: const Duration(milliseconds: 300), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, height: controller.editEvent != null || controller.replyEvent != null ? 56 : 0, clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: Material( - color: Theme.of(context).secondaryHeaderColor, - child: Row( - children: [ - IconButton( - tooltip: L10n.of(context)!.close, - icon: const Icon(Icons.close), - onPressed: controller.cancelReplyEventAction, - ), - Expanded( - child: controller.replyEvent != null - ? ReplyContent(controller.replyEvent!, - timeline: controller.timeline!) - : _EditContent(controller.editEvent - ?.getDisplayEvent(controller.timeline!)), - ), - ], - ), + decoration: BoxDecoration( + color: theme.colorScheme.onInverseSurface, + ), + child: Row( + children: [ + IconButton( + tooltip: L10n.of(context).close, + icon: const Icon(Icons.close), + onPressed: controller.cancelReplyEventAction, + ), + Expanded( + child: controller.replyEvent != null + ? ReplyContent( + controller.replyEvent!, + timeline: controller.timeline!, + backgroundColor: Colors.transparent, + ) + : _EditContent( + controller.editEvent?.getDisplayEvent(controller.timeline!), + ), + ), + ], ), ); } @@ -50,38 +57,30 @@ class _EditContent extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = Theme.of(context); final event = this.event; if (event == null) { - return Container(); + return const SizedBox.shrink(); } return Row( children: [ Icon( Icons.edit, - color: Theme.of(context).primaryColor, + color: theme.colorScheme.primary, ), Container(width: 15.0), - FutureBuilder( - future: event.calcLocalizedBody( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, - hideReply: true, - ), - builder: (context, snapshot) { - return Text( - snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, - hideReply: true, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - style: TextStyle( - color: Theme.of(context).textTheme.bodyText2!.color, - ), - ); - }), + Text( + event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + color: theme.textTheme.bodyMedium!.color, + ), + ), ], ); } diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index 2a3ac52ad8..76fa7106f0 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -8,15 +8,13 @@ import 'package:fluffychat/widgets/matrix.dart'; class SeenByRow extends StatelessWidget { final ChatController controller; - const SeenByRow(this.controller, {Key? key}) : super(key: key); + const SeenByRow(this.controller, {super.key}); @override Widget build(BuildContext context) { - final seenByUsers = controller.room!.getSeenByUsers( - controller.timeline!, - controller.filteredEvents, - controller.unfolded, - ); + final theme = Theme.of(context); + + final seenByUsers = controller.room.getSeenByUsers(controller.timeline!); const maxAvatars = 7; return Container( width: double.infinity, @@ -26,10 +24,11 @@ class SeenByRow extends StatelessWidget { const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), height: seenByUsers.isEmpty ? 0 : 24, duration: seenByUsers.isEmpty - ? const Duration(milliseconds: 0) - : const Duration(milliseconds: 300), - alignment: controller.filteredEvents.isNotEmpty && - controller.filteredEvents.first.senderId == + ? Duration.zero + : FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: controller.timeline!.events.isNotEmpty && + controller.timeline!.events.first.senderId == Matrix.of(context).client.userID ? Alignment.topRight : Alignment.topLeft, @@ -41,20 +40,18 @@ class SeenByRow extends StatelessWidget { ? seenByUsers.sublist(0, maxAvatars) : seenByUsers) .map( - (user) => Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - size: 16, - fontSize: 9, - ), - ) - .toList(), + (user) => Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + size: 16, + ), + ), if (seenByUsers.length > maxAvatars) SizedBox( width: 16, height: 16, child: Material( - color: Theme.of(context).backgroundColor, + color: theme.colorScheme.surface, borderRadius: BorderRadius.circular(32), child: Center( child: Text( diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart index 3383c00162..bb524b8d05 100644 --- a/lib/pages/chat/send_file_dialog.dart +++ b/lib/pages/chat/send_file_dialog.dart @@ -1,112 +1,359 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:cross_file/cross_file.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; +import 'package:mime/mime.dart'; -import '../../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; -import '../../utils/resize_image.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import '../../utils/resize_video.dart'; class SendFileDialog extends StatefulWidget { final Room room; - final MatrixFile file; + final List files; + final BuildContext outerContext; const SendFileDialog({ required this.room, - required this.file, - Key? key, - }) : super(key: key); + required this.files, + required this.outerContext, + super.key, + }); @override - _SendFileDialogState createState() => _SendFileDialogState(); + SendFileDialogState createState() => SendFileDialogState(); } -class _SendFileDialogState extends State { - bool origImage = false; +class SendFileDialogState extends State { + bool compress = true; /// Images smaller than 20kb don't need compression. - static const int minSizeToCompress = 20 * 1024; + static const int minSizeToCompress = 20 * 1000; Future _send() async { - var file = widget.file; - MatrixImageFile? thumbnail; - if (file is MatrixVideoFile && file.bytes.length > minSizeToCompress) { - await showFutureLoadingDialog( - context: context, - future: () async { - file = await file.resizeVideo(); - thumbnail = await file.getVideoThumbnail(); - }); - } - final scaffoldMessenger = ScaffoldMessenger.of(context); - widget.room - .sendFileEvent( - file, - thumbnail: thumbnail, - shrinkImageMaxDimension: origImage ? null : 1600, - ) - .catchError((e) { + final scaffoldMessenger = ScaffoldMessenger.of(widget.outerContext); + final l10n = L10n.of(context); + + try { + scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment); + Navigator.of(context, rootNavigator: false).pop(); + final clientConfig = await widget.room.client.getConfig(); + final maxUploadSize = clientConfig.mUploadSize ?? 100 * 1000 * 1000; + + for (final xfile in widget.files) { + final MatrixFile file; + MatrixImageFile? thumbnail; + final length = await xfile.length(); + final mimeType = xfile.mimeType ?? lookupMimeType(xfile.path); + + // If file is a video, shrink it! + if (PlatformInfos.isMobile && + mimeType != null && + mimeType.startsWith('video') && + length > minSizeToCompress && + compress) { + scaffoldMessenger.showLoadingSnackBar(l10n.compressVideo); + file = await xfile.resizeVideo(); + scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail); + thumbnail = await xfile.getVideoThumbnail(); + } else { + if (length > maxUploadSize) { + throw FileTooBigMatrixException(length, maxUploadSize); + } + // Else we just create a MatrixFile + file = MatrixFile( + bytes: await xfile.readAsBytes(), + name: xfile.name, + mimeType: mimeType, + ).detectFileType; + } + + if (file.bytes.length > maxUploadSize) { + throw FileTooBigMatrixException(length, maxUploadSize); + } + + if (widget.files.length > 1) { + scaffoldMessenger.showLoadingSnackBar( + l10n.sendingAttachmentCountOfCount( + widget.files.indexOf(xfile) + 1, + widget.files.length, + ), + ); + } else { + scaffoldMessenger.clearSnackBars(); + } + + try { + await widget.room.sendFileEvent( + file, + thumbnail: thumbnail, + shrinkImageMaxDimension: compress ? 1600 : null, + ); + } on MatrixException catch (e) { + final retryAfterMs = e.retryAfterMs; + if (e.error != MatrixError.M_LIMIT_EXCEEDED || retryAfterMs == null) { + rethrow; + } + final retryAfterDuration = + Duration(milliseconds: retryAfterMs + 1000); + + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text( + l10n.serverLimitReached(retryAfterDuration.inSeconds), + ), + ), + ); + await Future.delayed(retryAfterDuration); + + scaffoldMessenger.showLoadingSnackBar(l10n.sendingAttachment); + + await widget.room.sendFileEvent( + file, + thumbnail: thumbnail, + shrinkImageMaxDimension: compress ? null : 1600, + ); + } + } + scaffoldMessenger.clearSnackBars(); + } catch (e) { + scaffoldMessenger.clearSnackBars(); scaffoldMessenger.showSnackBar( - SnackBar(content: Text(e.toLocalizedString())), + SnackBar( + content: Text(e.toLocalizedString(widget.outerContext)), + duration: const Duration(seconds: 30), + showCloseIcon: true, + ), ); - }); + rethrow; + } - Navigator.of(context, rootNavigator: false).pop(); return; } + Future _calcCombinedFileSize() async { + final lengths = + await Future.wait(widget.files.map((file) => file.length())); + return lengths.fold(0, (p, length) => p + length).sizeString; + } + @override Widget build(BuildContext context) { - var sendStr = L10n.of(context)!.sendFile; - if (widget.file is MatrixImageFile) { - sendStr = L10n.of(context)!.sendImage; - } else if (widget.file is MatrixAudioFile) { - sendStr = L10n.of(context)!.sendAudio; - } else if (widget.file is MatrixVideoFile) { - sendStr = L10n.of(context)!.sendVideo; + final theme = Theme.of(context); + + var sendStr = L10n.of(context).sendFile; + final uniqueMimeType = widget.files + .map((file) => file.mimeType ?? lookupMimeType(file.name)) + .toSet() + .singleOrNull; + + final fileName = widget.files.length == 1 + ? widget.files.single.name + : L10n.of(context).countFiles(widget.files.length.toString()); + final fileTypes = widget.files + .map((file) => file.name.split('.').last) + .toSet() + .join(', ') + .toUpperCase(); + + if (uniqueMimeType?.startsWith('image') ?? false) { + if (widget.files.length == 1) { + sendStr = L10n.of(context).sendImage; + } else { + sendStr = L10n.of(context).sendImages(widget.files.length); + } + } else if (uniqueMimeType?.startsWith('audio') ?? false) { + sendStr = L10n.of(context).sendAudio; + } else if (uniqueMimeType?.startsWith('video') ?? false) { + sendStr = L10n.of(context).sendVideo; } - Widget contentWidget; - if (widget.file is MatrixImageFile) { - contentWidget = Column(mainAxisSize: MainAxisSize.min, children: [ - Flexible( - child: Image.memory( - widget.file.bytes, - fit: BoxFit.contain, + + return FutureBuilder( + future: _calcCombinedFileSize(), + builder: (context, snapshot) { + final sizeString = + snapshot.data ?? L10n.of(context).calculatingFileSize; + + return AlertDialog.adaptive( + title: Text(sendStr), + content: SizedBox( + width: 256, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 12), + if (uniqueMimeType?.startsWith('image') ?? false) + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: SizedBox( + height: 256, + child: Center( + child: ListView.builder( + shrinkWrap: true, + itemCount: widget.files.length, + scrollDirection: Axis.horizontal, + itemBuilder: (context, i) => Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + clipBehavior: Clip.hardEdge, + child: kIsWeb + ? Image.network( + widget.files[i].path, + height: 256, + ) + : Image.file( + File(widget.files[i].path), + height: 256, + ), + ), + ), + ), + ), + ), + ), + if (uniqueMimeType?.startsWith('image') != true) + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Row( + children: [ + Icon( + uniqueMimeType == null + ? Icons.description_outlined + : uniqueMimeType.startsWith('video') + ? Icons.video_file_outlined + : uniqueMimeType.startsWith('audio') + ? Icons.audio_file_outlined + : Icons.description_outlined, + size: 32, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + fileName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Text( + '$sizeString - $fileTypes', + style: theme.textTheme.labelSmall, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ], + ), + ), + // Workaround for SwitchListTile.adaptive crashes in CupertinoDialog + if (uniqueMimeType != null && + (uniqueMimeType.startsWith('image') || + uniqueMimeType.startsWith('video'))) + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if ({TargetPlatform.iOS, TargetPlatform.macOS} + .contains(theme.platform)) + CupertinoSwitch( + value: compress, + onChanged: uniqueMimeType.startsWith('video') && + !PlatformInfos.isMobile + ? null + : (v) => setState(() => compress = v), + ) + else + Switch.adaptive( + value: compress, + onChanged: uniqueMimeType.startsWith('video') && + !PlatformInfos.isMobile + ? null + : (v) => setState(() => compress = v), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + L10n.of(context).compress, + style: theme.textTheme.titleMedium, + textAlign: TextAlign.left, + ), + ], + ), + if (!compress) + Text( + ' ($sizeString)', + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ], + ), + ], + ), ), - ), - Row( - children: [ - Checkbox( - value: origImage, - onChanged: (v) => setState(() => origImage = v ?? false), + actions: [ + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(), + child: Text(L10n.of(context).cancel), ), - InkWell( - onTap: () => setState(() => origImage = !origImage), - child: Text(L10n.of(context)!.sendOriginal + - ' (${widget.file.sizeString})'), + AdaptiveDialogAction( + onPressed: _send, + child: Text(L10n.of(context).send), ), ], - ) - ]); - } else { - contentWidget = Text('${widget.file.name} (${widget.file.sizeString})'); - } - return AlertDialog( - title: Text(sendStr), - content: contentWidget, - actions: [ - TextButton( - onPressed: () { - // just close the dialog - Navigator.of(context, rootNavigator: false).pop(); - }, - child: Text(L10n.of(context)!.cancel), - ), - TextButton( - onPressed: _send, - child: Text(L10n.of(context)!.send), + ); + }, + ); + } +} + +extension on ScaffoldMessengerState { + ScaffoldFeatureController showLoadingSnackBar( + String title, + ) { + clearSnackBars(); + return showSnackBar( + SnackBar( + duration: const Duration(minutes: 5), + dismissDirection: DismissDirection.none, + content: Row( + children: [ + const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + const SizedBox(width: 16), + Text(title), + ], ), - ], + ), ); } } diff --git a/lib/pages/chat/send_location_dialog.dart b/lib/pages/chat/send_location_dialog.dart index 4c82eaaa93..58c44db2d1 100644 --- a/lib/pages/chat/send_location_dialog.dart +++ b/lib/pages/chat/send_location_dialog.dart @@ -4,26 +4,26 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:geolocator/geolocator.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/chat/events/map_bubble.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; class SendLocationDialog extends StatefulWidget { final Room room; const SendLocationDialog({ required this.room, - Key? key, - }) : super(key: key); + super.key, + }); @override - _SendLocationDialogState createState() => _SendLocationDialogState(); + SendLocationDialogState createState() => SendLocationDialogState(); } -class _SendLocationDialogState extends State { +class SendLocationDialogState extends State { bool disabled = false; bool denied = false; bool isSending = false; @@ -54,19 +54,23 @@ class _SendLocationDialogState extends State { return; } try { - Position _position; + Position position; try { - _position = await Geolocator.getCurrentPosition( - desiredAccuracy: LocationAccuracy.best, - timeLimit: const Duration(seconds: 30), + position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.best, + timeLimit: Duration(seconds: 30), + ), ); } on TimeoutException { - _position = await Geolocator.getCurrentPosition( - desiredAccuracy: LocationAccuracy.medium, - timeLimit: const Duration(seconds: 30), + position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.medium, + timeLimit: Duration(seconds: 30), + ), ); } - setState(() => position = _position); + setState(() => this.position = position); } catch (e) { setState(() => error = e); } @@ -94,12 +98,12 @@ class _SendLocationDialogState extends State { longitude: position!.longitude, ); } else if (disabled) { - contentWidget = Text(L10n.of(context)!.locationDisabledNotice); + contentWidget = Text(L10n.of(context).locationDisabledNotice); } else if (denied) { - contentWidget = Text(L10n.of(context)!.locationPermissionDeniedNotice); + contentWidget = Text(L10n.of(context).locationPermissionDeniedNotice); } else if (error != null) { contentWidget = - Text(L10n.of(context)!.errorObtainingLocation(error.toString())); + Text(L10n.of(context).errorObtainingLocation(error.toString())); } else { contentWidget = Row( mainAxisSize: MainAxisSize.min, @@ -107,38 +111,22 @@ class _SendLocationDialogState extends State { children: [ const CupertinoActivityIndicator(), const SizedBox(width: 12), - Text(L10n.of(context)!.obtainingLocation), - ], - ); - } - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: Text(L10n.of(context)!.shareLocation), - content: contentWidget, - actions: [ - CupertinoDialogAction( - onPressed: Navigator.of(context, rootNavigator: false).pop, - child: Text(L10n.of(context)!.cancel), - ), - CupertinoDialogAction( - onPressed: isSending ? null : sendAction, - child: Text(L10n.of(context)!.send), - ), + Text(L10n.of(context).obtainingLocation), ], ); } - return AlertDialog( - title: Text(L10n.of(context)!.shareLocation), + return AlertDialog.adaptive( + title: Text(L10n.of(context).shareLocation), content: contentWidget, actions: [ - TextButton( + AdaptiveDialogAction( onPressed: Navigator.of(context, rootNavigator: false).pop, - child: Text(L10n.of(context)!.cancel), + child: Text(L10n.of(context).cancel), ), if (position != null) - TextButton( + AdaptiveDialogAction( onPressed: isSending ? null : sendAction, - child: Text(L10n.of(context)!.send), + child: Text(L10n.of(context).send), ), ], ); diff --git a/lib/pages/chat/sticker_picker_dialog.dart b/lib/pages/chat/sticker_picker_dialog.dart index d76f772c10..96f62b3d42 100644 --- a/lib/pages/chat/sticker_picker_dialog.dart +++ b/lib/pages/chat/sticker_picker_dialog.dart @@ -3,13 +3,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import '../../widgets/avatar.dart'; -import 'events/image_bubble.dart'; class StickerPickerDialog extends StatefulWidget { final Room room; + final void Function(ImagePackImageContent) onSelected; - const StickerPickerDialog({required this.room, Key? key}) : super(key: key); + const StickerPickerDialog({ + required this.onSelected, + required this.room, + super.key, + }); @override StickerPickerDialogState createState() => StickerPickerDialogState(); @@ -20,25 +27,28 @@ class StickerPickerDialogState extends State { @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final stickerPacks = widget.room.getImagePacks(ImagePackUsage.sticker); final packSlugs = stickerPacks.keys.toList(); // ignore: prefer_function_declarations_over_variables - final _packBuilder = (BuildContext context, int packIndex) { + final packBuilder = (BuildContext context, int packIndex) { final pack = stickerPacks[packSlugs[packIndex]]!; final filteredImagePackImageEntried = pack.images.entries.toList(); if (searchFilter?.isNotEmpty ?? false) { - filteredImagePackImageEntried.removeWhere((e) => - !(e.key.toLowerCase().contains(searchFilter!.toLowerCase()) || - (e.value.body - ?.toLowerCase() - .contains(searchFilter!.toLowerCase()) ?? - false))); + filteredImagePackImageEntried.removeWhere( + (e) => !(e.key.toLowerCase().contains(searchFilter!.toLowerCase()) || + (e.value.body + ?.toLowerCase() + .contains(searchFilter!.toLowerCase()) ?? + false)), + ); } final imageKeys = filteredImagePackImageEntried.map((e) => e.key).toList(); if (imageKeys.isEmpty) { - return Container(); + return const SizedBox.shrink(); } final packName = pack.pack.displayName ?? packSlugs[packIndex]; return Column( @@ -57,23 +67,14 @@ class StickerPickerDialogState extends State { GridView.builder( itemCount: imageKeys.length, gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 100), + maxCrossAxisExtent: 128, + ), shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemBuilder: (BuildContext context, int imageIndex) { final image = pack.images[imageKeys[imageIndex]]!; - final fakeEvent = Event( - type: EventTypes.Sticker, - content: { - 'url': image.url.toString(), - 'info': image.info, - }, - originServerTs: DateTime.now(), - room: widget.room, - eventId: 'fake_event', - senderId: widget.room.client.userID!, - ); return InkWell( + radius: AppConfig.borderRadius, key: ValueKey(image.url.toString()), onTap: () { // copy the image @@ -81,17 +82,17 @@ class StickerPickerDialogState extends State { ImagePackImageContent.fromJson(image.toJson().copy()); // set the body, if it doesn't exist, to the key imageCopy.body ??= imageKeys[imageIndex]; - Navigator.of(context, rootNavigator: false) - .pop(imageCopy); + widget.onSelected(imageCopy); }, child: AbsorbPointer( absorbing: true, - child: ImageBubble( - fakeEvent, - tapToView: false, + child: MxcImage( + uri: image.url, fit: BoxFit.contain, - width: 100, - height: 100, + width: 128, + height: 128, + animated: true, + isThumbnail: false, ), ), ); @@ -102,6 +103,7 @@ class StickerPickerDialogState extends State { }; return Scaffold( + backgroundColor: theme.colorScheme.onInverseSurface, body: SizedBox( width: double.maxFinite, child: CustomScrollView( @@ -110,27 +112,47 @@ class StickerPickerDialogState extends State { floating: true, pinned: true, automaticallyImplyLeading: false, - titleSpacing: 0, - backgroundColor: Theme.of(context).dialogBackgroundColor, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context, rootNavigator: false).pop, - ), - title: TextField( - autofocus: false, - decoration: InputDecoration( - hintText: L10n.of(context)!.search, - suffix: const Icon(Icons.search_outlined), - contentPadding: const EdgeInsets.symmetric(horizontal: 16), + backgroundColor: Colors.transparent, + title: SizedBox( + height: 42, + child: TextField( + autofocus: false, + decoration: InputDecoration( + hintText: L10n.of(context).search, + prefixIcon: const Icon(Icons.search_outlined), + contentPadding: EdgeInsets.zero, + ), + onChanged: (s) => setState(() => searchFilter = s), ), - onChanged: (s) => setState(() => searchFilter = s), ), ), - SliverList( + if (packSlugs.isEmpty) + SliverFillRemaining( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(L10n.of(context).noEmotesFound), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: () => UrlLauncher( + context, + 'https://matrix.to/#/#fluffychat-stickers:janian.de', + ).launchUrl(), + icon: const Icon(Icons.explore_outlined), + label: Text(L10n.of(context).discover), + ), + ], + ), + ), + ) + else + SliverList( delegate: SliverChildBuilderDelegate( - _packBuilder, - childCount: packSlugs.length, - )), + packBuilder, + childCount: packSlugs.length, + ), + ), ], ), ), diff --git a/lib/pages/chat/tombstone_display.dart b/lib/pages/chat/tombstone_display.dart deleted file mode 100644 index ad8b971bc2..0000000000 --- a/lib/pages/chat/tombstone_display.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'chat.dart'; - -class TombstoneDisplay extends StatelessWidget { - final ChatController controller; - const TombstoneDisplay(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - if (controller.room!.getState(EventTypes.RoomTombstone) == null) { - return Container(); - } - return SizedBox( - height: 72, - child: Material( - color: Theme.of(context).colorScheme.surfaceVariant, - elevation: 1, - child: ListTile( - leading: CircleAvatar( - foregroundColor: Theme.of(context).colorScheme.onSecondary, - backgroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.upgrade_outlined), - ), - title: Text( - controller.room! - .getState(EventTypes.RoomTombstone)! - .parsedTombstoneContent - .body, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - ), - subtitle: Text(L10n.of(context)!.goToTheNewRoom), - onTap: controller.goToNewRoomAction, - ), - ), - ); - } -} diff --git a/lib/pages/chat/typing_indicators.dart b/lib/pages/chat/typing_indicators.dart index 1466040fc5..7710ee0b60 100644 --- a/lib/pages/chat/typing_indicators.dart +++ b/lib/pages/chat/typing_indicators.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:fluffychat/config/app_config.dart'; @@ -8,89 +10,155 @@ import 'package:fluffychat/widgets/matrix.dart'; class TypingIndicators extends StatelessWidget { final ChatController controller; - const TypingIndicators(this.controller, {Key? key}) : super(key: key); + const TypingIndicators(this.controller, {super.key}); @override Widget build(BuildContext context) { - final typingUsers = controller.room!.typingUsers - ..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID); - const topPadding = 20.0; - const bottomPadding = 4.0; - - return Container( - width: double.infinity, - alignment: Alignment.center, - child: AnimatedContainer( - constraints: - const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), - height: typingUsers.isEmpty ? 0 : Avatar.defaultSize + bottomPadding, - duration: const Duration(milliseconds: 300), - curve: Curves.bounceInOut, - alignment: controller.filteredEvents.isNotEmpty && - controller.filteredEvents.first.senderId == - Matrix.of(context).client.userID - ? Alignment.topRight - : Alignment.topLeft, - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - padding: const EdgeInsets.only( - left: 8.0, - bottom: bottomPadding, - ), - child: Row( - children: [ - SizedBox( - height: Avatar.defaultSize, - width: typingUsers.length < 2 - ? Avatar.defaultSize - : Avatar.defaultSize + 16, - child: Stack( - children: [ - if (typingUsers.isNotEmpty) - Avatar( - mxContent: typingUsers.first.avatarUrl, - name: typingUsers.first.calcDisplayname(), - ), - if (typingUsers.length == 2) - Padding( - padding: const EdgeInsets.only(left: 16), - child: Avatar( - mxContent: typingUsers.length == 2 - ? typingUsers.last.avatarUrl - : null, - name: typingUsers.length == 2 - ? typingUsers.last.calcDisplayname() - : '+${typingUsers.length - 1}', - ), - ), - ], - ), + final theme = Theme.of(context); + + const avatarSize = Avatar.defaultSize / 2; + + return StreamBuilder( + stream: controller.room.client.onSync.stream.where( + (syncUpdate) => + syncUpdate.rooms?.join?[controller.room.id]?.ephemeral + ?.any((ephemeral) => ephemeral.type == 'm.typing') ?? + false, + ), + builder: (context, _) { + final typingUsers = controller.room.typingUsers + ..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID); + + return Container( + width: double.infinity, + alignment: Alignment.center, + child: AnimatedContainer( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), + height: typingUsers.isEmpty ? 0 : avatarSize + 8, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: controller.timeline!.events.isNotEmpty && + controller.timeline!.events.first.senderId == + Matrix.of(context).client.userID + ? Alignment.topRight + : Alignment.topLeft, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 4.0, ), - const SizedBox(width: 8), - Padding( - padding: const EdgeInsets.only(top: topPadding), - child: Material( - color: Theme.of(context).appBarTheme.backgroundColor, - elevation: 6, - shadowColor: - Theme.of(context).secondaryHeaderColor.withAlpha(100), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(2), - topRight: Radius.circular(AppConfig.borderRadius), - bottomLeft: Radius.circular(AppConfig.borderRadius), - bottomRight: Radius.circular(AppConfig.borderRadius), + child: Row( + children: [ + Container( + alignment: Alignment.center, + height: avatarSize, + width: Avatar.defaultSize, + child: Stack( + children: [ + if (typingUsers.isNotEmpty) + Avatar( + size: avatarSize, + mxContent: typingUsers.first.avatarUrl, + name: typingUsers.first.calcDisplayname(), + ), + if (typingUsers.length == 2) + Padding( + padding: const EdgeInsets.only(left: 16), + child: Avatar( + size: avatarSize, + mxContent: typingUsers.length == 2 + ? typingUsers.last.avatarUrl + : null, + name: typingUsers.length == 2 + ? typingUsers.last.calcDisplayname() + : '+${typingUsers.length - 1}', + ), + ), + ], + ), ), - child: Padding( - padding: const EdgeInsets.all(8), - child: typingUsers.isEmpty - ? null - : Image.asset('assets/typing.gif', height: 12), + const SizedBox(width: 8), + Material( + color: theme.colorScheme.surfaceContainerHigh, + borderRadius: const BorderRadius.all( + Radius.circular(AppConfig.borderRadius), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: typingUsers.isEmpty ? null : const _TypingDots(), + ), ), - ), + ], ), - ], - ), - ), + ), + ); + }, + ); + } +} + +class _TypingDots extends StatefulWidget { + const _TypingDots(); + + @override + State<_TypingDots> createState() => __TypingDotsState(); +} + +class __TypingDotsState extends State<_TypingDots> { + int _tick = 0; + + late final Timer _timer; + + static const Duration animationDuration = Duration(milliseconds: 300); + + @override + void initState() { + _timer = Timer.periodic( + animationDuration, + (_) { + if (!mounted) { + return; + } + setState(() { + _tick = (_tick + 1) % 4; + }); + }, + ); + super.initState(); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + const size = 8.0; + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + for (var i = 1; i <= 3; i++) + AnimatedContainer( + duration: animationDuration * 1.5, + curve: FluffyThemes.animationCurve, + width: size, + height: _tick == i ? size * 2 : size, + margin: EdgeInsets.symmetric( + horizontal: 2, + vertical: _tick == i ? 4 : 8, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(size * 2), + color: theme.colorScheme.secondary, + ), + ), + ], ); } } diff --git a/lib/pages/chat/widgets_bottom_sheet.dart b/lib/pages/chat/widgets_bottom_sheet.dart deleted file mode 100644 index 7a52929cef..0000000000 --- a/lib/pages/chat/widgets_bottom_sheet.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/link.dart'; - -import 'edit_widgets_dialog.dart'; - -class WidgetsBottomSheet extends StatelessWidget { - final Room room; - - const WidgetsBottomSheet({Key? key, required this.room}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ListView.builder( - shrinkWrap: true, - itemBuilder: (context, index) { - if (index == room.widgets.length) { - return ListTile( - leading: const Icon(Icons.edit), - title: Text(L10n.of(context)!.editWidgets), - onTap: () { - Navigator.of(context).pop(); - showDialog( - context: context, - builder: (context) => EditWidgetsDialog(room: room), - useRootNavigator: false, - ); - }, - ); - } - final widget = room.widgets[index]; - return Link( - builder: (context, callback) { - return ListTile( - title: Text(widget.name ?? widget.url), - subtitle: Text(widget.type), - onTap: callback, - ); - }, - target: LinkTarget.blank, - uri: Uri.parse(widget.url), - ); - }, - itemCount: room.widgets.length + 1, - ); - } -} diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart new file mode 100644 index 0000000000..bf60017720 --- /dev/null +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -0,0 +1,296 @@ +import 'package:flutter/material.dart' hide Visibility; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ChatAccessSettings extends StatefulWidget { + final String roomId; + const ChatAccessSettings({required this.roomId, super.key}); + + @override + State createState() => ChatAccessSettingsController(); +} + +class ChatAccessSettingsController extends State { + bool joinRulesLoading = false; + bool visibilityLoading = false; + bool historyVisibilityLoading = false; + bool guestAccessLoading = false; + Room get room => Matrix.of(context).client.getRoomById(widget.roomId)!; + + String get roomVersion => + room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version') ?? + 'Unknown'; + + /// Calculates which join rules are available based on the information on + /// https://spec.matrix.org/v1.11/rooms/#feature-matrix + List get availableJoinRules { + final joinRules = Set.from(JoinRules.values); + + final roomVersionInt = int.tryParse(roomVersion); + + // Knock is only supported for rooms up from version 7: + if (roomVersionInt != null && roomVersionInt <= 6) { + joinRules.remove(JoinRules.knock); + } + + // Not yet supported in FluffyChat: + joinRules.remove(JoinRules.restricted); + joinRules.remove(JoinRules.knockRestricted); + + // If an unsupported join rule is the current join rule, display it: + final currentJoinRule = room.joinRules; + if (currentJoinRule != null) joinRules.add(currentJoinRule); + + return joinRules.toList(); + } + + void setJoinRule(JoinRules? newJoinRules) async { + if (newJoinRules == null) return; + setState(() { + joinRulesLoading = true; + }); + + try { + await room.setJoinRules(newJoinRules); + } catch (e, s) { + Logs().w('Unable to change join rules', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + joinRulesLoading = false; + }); + } + } + } + + void setHistoryVisibility(HistoryVisibility? historyVisibility) async { + if (historyVisibility == null) return; + setState(() { + historyVisibilityLoading = true; + }); + + try { + await room.setHistoryVisibility(historyVisibility); + } catch (e, s) { + Logs().w('Unable to change history visibility', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + historyVisibilityLoading = false; + }); + } + } + } + + void setGuestAccess(GuestAccess? guestAccess) async { + if (guestAccess == null) return; + setState(() { + guestAccessLoading = true; + }); + + try { + await room.setGuestAccess(guestAccess); + } catch (e, s) { + Logs().w('Unable to change guest access', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + guestAccessLoading = false; + }); + } + } + } + + void updateRoomAction() async { + final roomVersion = room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version'); + final capabilitiesResult = await showFutureLoadingDialog( + context: context, + future: () => room.client.getCapabilities(), + ); + final capabilities = capabilitiesResult.result; + if (capabilities == null) return; + final newVersion = await showModalActionPopup( + context: context, + title: L10n.of(context).replaceRoomWithNewerVersion, + cancelLabel: L10n.of(context).cancel, + actions: capabilities.mRoomVersions!.available.entries + .where((r) => r.key != roomVersion) + .map( + (version) => AdaptiveModalAction( + value: version.key, + label: + '${version.key} (${version.value.toString().split('.').last})', + ), + ) + .toList(), + ); + if (newVersion == null || + OkCancelResult.cancel == + await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + title: L10n.of(context).areYouSure, + message: L10n.of(context).roomUpgradeDescription, + isDestructive: true, + )) { + return; + } + await showFutureLoadingDialog( + context: context, + future: () => room.client.upgradeRoom(room.id, newVersion), + ); + } + + Future addAlias() async { + final domain = room.client.userID?.domain; + if (domain == null) { + throw Exception('userID or domain is null! This should never happen.'); + } + + final input = await showTextInputDialog( + context: context, + title: L10n.of(context).editRoomAliases, + prefixText: '#', + suffixText: domain, + hintText: L10n.of(context).alias, + ); + final aliasLocalpart = input?.trim(); + if (aliasLocalpart == null || aliasLocalpart.isEmpty) return; + final alias = '#$aliasLocalpart:$domain'; + + final result = await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomAlias(alias, room.id), + ); + if (result.error != null) return; + setState(() {}); + + if (!room.canChangeStateEvent(EventTypes.RoomCanonicalAlias)) return; + + final canonicalAliasConsent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).setAsCanonicalAlias, + message: alias, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + ); + + final altAliases = room + .getState(EventTypes.RoomCanonicalAlias) + ?.content + .tryGetList('alt_aliases') + ?.toSet() ?? + {}; + if (room.canonicalAlias.isNotEmpty) altAliases.add(room.canonicalAlias); + altAliases.add(alias); + if (canonicalAliasConsent == OkCancelResult.ok) { + altAliases.remove(alias); + } else { + altAliases.remove(room.canonicalAlias); + } + + await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomStateWithKey( + room.id, + EventTypes.RoomCanonicalAlias, + '', + { + 'alias': canonicalAliasConsent == OkCancelResult.ok + ? alias + : room.canonicalAlias, + if (altAliases.isNotEmpty) 'alt_aliases': altAliases.toList(), + }, + ), + ); + } + + void deleteAlias(String alias) async { + await showFutureLoadingDialog( + context: context, + future: () => room.client.deleteRoomAlias(alias), + ); + setState(() {}); + } + + void setChatVisibilityOnDirectory(bool? visibility) async { + if (visibility == null) return; + setState(() { + visibilityLoading = true; + }); + + try { + await room.client.setRoomVisibilityOnDirectory( + room.id, + visibility: visibility == true ? Visibility.public : Visibility.private, + ); + setState(() {}); + } catch (e, s) { + Logs().w('Unable to change visibility', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + visibilityLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return ChatAccessSettingsPageView(this); + } +} diff --git a/lib/pages/chat_access_settings/chat_access_settings_page.dart b/lib/pages/chat_access_settings/chat_access_settings_page.dart new file mode 100644 index 0000000000..7bea621a7c --- /dev/null +++ b/lib/pages/chat_access_settings/chat_access_settings_page.dart @@ -0,0 +1,279 @@ +import 'package:flutter/material.dart' hide Visibility; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class ChatAccessSettingsPageView extends StatelessWidget { + final ChatAccessSettingsController controller; + const ChatAccessSettingsPageView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = controller.room; + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).accessAndVisibility), + ), + body: MaxWidthBody( + child: StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id), + builder: (context, snapshot) { + final canonicalAlias = room.canonicalAlias; + final altAliases = room + .getState(EventTypes.RoomCanonicalAlias) + ?.content + .tryGetList('alt_aliases') ?? + []; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text( + L10n.of(context).visibilityOfTheChatHistory, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final historyVisibility in HistoryVisibility.values) + RadioListTile.adaptive( + title: Text( + historyVisibility + .getLocalizedString(MatrixLocals(L10n.of(context))), + ), + value: historyVisibility, + groupValue: room.historyVisibility, + onChanged: controller.historyVisibilityLoading || + !room.canChangeHistoryVisibility + ? null + : controller.setHistoryVisibility, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).whoIsAllowedToJoinThisGroup, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final joinRule in controller.availableJoinRules) + if (joinRule != JoinRules.private) + RadioListTile.adaptive( + title: Text( + joinRule.localizedString(L10n.of(context)), + ), + value: joinRule, + groupValue: room.joinRules, + onChanged: controller.joinRulesLoading || + !room.canChangeJoinRules + ? null + : controller.setJoinRule, + ), + Divider(color: theme.dividerColor), + if ({JoinRules.public, JoinRules.knock} + .contains(room.joinRules)) ...[ + ListTile( + title: Text( + L10n.of(context).areGuestsAllowedToJoin, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final guestAccess in GuestAccess.values) + RadioListTile.adaptive( + title: Text( + guestAccess.getLocalizedString( + MatrixLocals(L10n.of(context)), + ), + ), + value: guestAccess, + groupValue: room.guestAccess, + onChanged: controller.guestAccessLoading || + !room.canChangeGuestAccess + ? null + : controller.setGuestAccess, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).publicChatAddresses, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + trailing: IconButton( + icon: const Icon(Icons.add_outlined), + tooltip: L10n.of(context).createNewAddress, + onPressed: controller.addAlias, + ), + ), + if (canonicalAlias.isNotEmpty) + _AliasListTile( + alias: canonicalAlias, + onDelete: room.canChangeStateEvent( + EventTypes.RoomCanonicalAlias, + ) + ? () => controller.deleteAlias(canonicalAlias) + : null, + isCanonicalAlias: true, + ), + for (final alias in altAliases) + _AliasListTile( + alias: alias, + onDelete: room.canChangeStateEvent( + EventTypes.RoomCanonicalAlias, + ) + ? () => controller.deleteAlias(alias) + : null, + ), + FutureBuilder( + future: room.client.getLocalAliases(room.id), + builder: (context, snapshot) { + final localAddresses = snapshot.data; + if (localAddresses == null) { + return const SizedBox.shrink(); + } + localAddresses.remove(room.canonicalAlias); + localAddresses + .removeWhere((alias) => altAliases.contains(alias)); + return Column( + mainAxisSize: MainAxisSize.min, + children: localAddresses + .map( + (alias) => _AliasListTile( + alias: alias, + published: false, + onDelete: () => controller.deleteAlias(alias), + ), + ) + .toList(), + ); + }, + ), + Divider(color: theme.dividerColor), + FutureBuilder( + future: room.client.getRoomVisibilityOnDirectory(room.id), + builder: (context, snapshot) => SwitchListTile.adaptive( + value: snapshot.data == Visibility.public, + title: Text( + L10n.of(context).chatCanBeDiscoveredViaSearchOnServer( + room.client.userID!.domain!, + ), + ), + onChanged: controller.setChatVisibilityOnDirectory, + ), + ), + ], + ListTile( + title: Text(L10n.of(context).globalChatId), + subtitle: SelectableText(room.id), + trailing: IconButton( + icon: const Icon(Icons.copy_outlined), + onPressed: () => FluffyShare.share(room.id, context), + ), + ), + ListTile( + title: Text(L10n.of(context).roomVersion), + subtitle: SelectableText( + room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version') ?? + 'Unknown', + ), + trailing: room.canSendEvent(EventTypes.RoomTombstone) + ? IconButton( + icon: const Icon(Icons.upgrade_outlined), + onPressed: controller.updateRoomAction, + ) + : null, + ), + ], + ); + }, + ), + ), + ); + } +} + +class _AliasListTile extends StatelessWidget { + const _AliasListTile({ + required this.alias, + required this.onDelete, + this.isCanonicalAlias = false, + this.published = true, + }); + + final String alias; + final void Function()? onDelete; + final bool isCanonicalAlias; + final bool published; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ListTile( + leading: isCanonicalAlias + ? const Icon(Icons.star) + : const Icon(Icons.link_outlined), + title: InkWell( + onTap: () => FluffyShare.share( + 'https://matrix.to/#/$alias', + context, + ), + child: SelectableText( + alias, + style: TextStyle( + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + color: theme.colorScheme.primary, + fontSize: 14, + ), + ), + ), + trailing: onDelete != null + ? IconButton( + color: theme.colorScheme.error, + icon: const Icon(Icons.delete_outlined), + onPressed: onDelete, + ) + : null, + ); + } +} + +extension JoinRulesDisplayString on JoinRules { + String localizedString(L10n l10n) { + switch (this) { + case JoinRules.public: + return l10n.anyoneCanJoin; + case JoinRules.invite: + return l10n.invitedUsersOnly; + case JoinRules.knock: + return l10n.usersMustKnock; + case JoinRules.private: + return l10n.noOneCanJoin; + case JoinRules.restricted: + return l10n.restricted; + case JoinRules.knockRestricted: + return l10n.knockRestricted; + } + } +} diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 655f61f51b..5d5ef30691 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -1,247 +1,96 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; +import 'package:collection/collection.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/chat_details/chat_details_view.dart'; import 'package:fluffychat/pages/settings/settings.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; enum AliasActions { copy, delete, setCanonical } class ChatDetails extends StatefulWidget { - const ChatDetails({Key? key}) : super(key: key); + final String roomId; + final Widget? embeddedCloseButton; + + const ChatDetails({ + super.key, + required this.roomId, + this.embeddedCloseButton, + }); @override ChatDetailsController createState() => ChatDetailsController(); } class ChatDetailsController extends State { - List? members; bool displaySettings = false; void toggleDisplaySettings() => setState(() => displaySettings = !displaySettings); - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => widget.roomId; void setDisplaynameAction() async { final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.changeTheNameOfTheGroup, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - initialText: room.getLocalizedDisplayname( - MatrixLocals( - L10n.of(context)!, - ), - ), - ) - ], + title: L10n.of(context).changeTheNameOfTheGroup, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + initialText: room.getLocalizedDisplayname( + MatrixLocals( + L10n.of(context), + ), + ), ); if (input == null) return; final success = await showFutureLoadingDialog( context: context, - future: () => room.setName(input.single), + future: () => room.setName(input), ); if (success.error == null) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.displaynameHasBeenChanged))); - } - } - - void editAliases() async { - final room = Matrix.of(context).client.getRoomById(roomId!); - - // The current endpoint doesnt seem to be implemented in Synapse. This may - // change in the future and then we just need to switch to this api call: - // - // final aliases = await showFutureLoadingDialog( - // context: context, - // future: () => room.client.requestRoomAliases(room.id), - // ); - // - // While this is not working we use the unstable api: - final aliases = await showFutureLoadingDialog( - context: context, - future: () => room!.client - .request( - RequestType.GET, - '/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases', - ) - .then((response) => List.from(response['aliases'])), - ); - // Switch to the stable api once it is implemented. - - if (aliases.error != null) return; - final adminMode = room!.canSendEvent('m.room.canonical_alias'); - if (aliases.result!.isEmpty && (room.canonicalAlias.isNotEmpty)) { - aliases.result!.add(room.canonicalAlias); - } - if (aliases.result!.isEmpty && adminMode) { - return setAliasAction(); - } - final select = await showConfirmationDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.editRoomAliases, - actions: [ - if (adminMode) - AlertDialogAction(label: L10n.of(context)!.create, key: 'new'), - ...aliases.result! - .map((alias) => AlertDialogAction(key: alias, label: alias)) - .toList(), - ], - ); - if (select == null) return; - if (select == 'new') { - return setAliasAction(); - } - final option = await showConfirmationDialog( - context: context, - title: select, - actions: [ - AlertDialogAction( - label: L10n.of(context)!.copyToClipboard, - key: AliasActions.copy, - isDefaultAction: true, - ), - if (adminMode) ...{ - AlertDialogAction( - label: L10n.of(context)!.setAsCanonicalAlias, - key: AliasActions.setCanonical, - isDestructiveAction: true, - ), - AlertDialogAction( - label: L10n.of(context)!.delete, - key: AliasActions.delete, - isDestructiveAction: true, - ), - }, - ], - ); - if (option == null) return; - switch (option) { - case AliasActions.copy: - await Clipboard.setData(ClipboardData(text: select)); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.copiedToClipboard)), - ); - break; - case AliasActions.delete: - await showFutureLoadingDialog( - context: context, - future: () => room.client.deleteRoomAlias(select), - ); - break; - case AliasActions.setCanonical: - await showFutureLoadingDialog( - context: context, - future: () => room.client.setRoomStateWithKey( - room.id, - EventTypes.RoomCanonicalAlias, - '', - { - 'alias': select, - }, - ), - ); - break; + SnackBar(content: Text(L10n.of(context).displaynameHasBeenChanged)), + ); } } - void setAliasAction() async { - final room = Matrix.of(context).client.getRoomById(roomId!)!; - final domain = room.client.userID!.domain; - - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.setInvitationLink, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - prefixText: '#', - suffixText: domain, - hintText: L10n.of(context)!.alias, - initialText: room.canonicalAlias.localpart, - ) - ], - ); - if (input == null) return; - await showFutureLoadingDialog( - context: context, - future: () => - room.client.setRoomAlias('#' + input.single + ':' + domain!, room.id), - ); - } - void setTopicAction() async { final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.setGroupDescription, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.setGroupDescription, - initialText: room.topic, - minLines: 1, - maxLines: 4, - ) - ], + title: L10n.of(context).setChatDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).noChatDescriptionYet, + initialText: room.topic, + minLines: 4, + maxLines: 8, ); if (input == null) return; final success = await showFutureLoadingDialog( context: context, - future: () => room.setDescription(input.single), + future: () => room.setDescription(input), ); if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(L10n.of(context)!.groupDescriptionHasBeenChanged))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context).chatDescriptionHasBeenChanged), + ), + ); } } - void setGuestAccessAction(GuestAccess guestAccess) => showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .getRoomById(roomId!)! - .setGuestAccess(guestAccess), - ); - - void setHistoryVisibilityAction(HistoryVisibility historyVisibility) => - showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .getRoomById(roomId!)! - .setHistoryVisibility(historyVisibility), - ); - - void setJoinRulesAction(JoinRules joinRule) => showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .getRoomById(roomId!)! - .setJoinRules(joinRule), - ); - void goToEmoteSettings() async { final room = Matrix.of(context).client.getRoomById(roomId!)!; // okay, we need to test if there are any emote state events other than the default one @@ -250,9 +99,9 @@ class ChatDetailsController extends State { if ((room.states['im.ponies.room_emotes'] ?? {}) .keys .any((String s) => s.isNotEmpty)) { - VRouter.of(context).to('multiple_emotes'); + context.push('/rooms/${room.id}/details/multiple_emotes'); } else { - VRouter.of(context).to('emotes'); + context.push('/rooms/${room.id}/details/emotes'); } } @@ -260,30 +109,31 @@ class ChatDetailsController extends State { final room = Matrix.of(context).client.getRoomById(roomId!); final actions = [ if (PlatformInfos.isMobile) - SheetAction( - key: AvatarAction.camera, - label: L10n.of(context)!.openCamera, + AdaptiveModalAction( + value: AvatarAction.camera, + label: L10n.of(context).openCamera, isDefaultAction: true, - icon: Icons.camera_alt_outlined, + icon: const Icon(Icons.camera_alt_outlined), ), - SheetAction( - key: AvatarAction.file, - label: L10n.of(context)!.openGallery, - icon: Icons.photo_outlined, + AdaptiveModalAction( + value: AvatarAction.file, + label: L10n.of(context).openGallery, + icon: const Icon(Icons.photo_outlined), ), if (room?.avatar != null) - SheetAction( - key: AvatarAction.remove, - label: L10n.of(context)!.delete, - isDestructiveAction: true, - icon: Icons.delete_outlined, + AdaptiveModalAction( + value: AvatarAction.remove, + label: L10n.of(context).delete, + isDestructive: true, + icon: const Icon(Icons.delete_outlined), ), ]; final action = actions.length == 1 - ? actions.single.key - : await showModalActionSheet( + ? actions.single.value + : await showModalActionPopup( context: context, - title: L10n.of(context)!.editRoomAvatar, + title: L10n.of(context).editRoomAvatar, + cancelLabel: L10n.of(context).cancel, actions: actions, ); if (action == null) return; @@ -308,12 +158,16 @@ class ChatDetailsController extends State { name: result.path, ); } else { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; + final picked = await selectFiles( + context, + allowMultiple: false, + type: FileSelectorType.images, + ); + final pickedFile = picked.firstOrNull; + if (pickedFile == null) return; file = MatrixFile( - bytes: result.toUint8List(), - name: result.fileName!, + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, ); } await showFutureLoadingDialog( @@ -322,24 +176,8 @@ class ChatDetailsController extends State { ); } - void requestMoreMembersAction() async { - final room = Matrix.of(context).client.getRoomById(roomId!); - final participants = await showFutureLoadingDialog( - context: context, future: () => room!.requestParticipants()); - if (participants.error == null) { - setState(() => members = participants.result); - } - } - static const fixedWidth = 360.0; @override - Widget build(BuildContext context) { - members ??= - Matrix.of(context).client.getRoomById(roomId!)!.getParticipants(); - return SizedBox( - width: fixedWidth, - child: ChatDetailsView(this), - ); - } + Widget build(BuildContext context) => ChatDetailsView(this); } diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index 116c4fa7f7..0108ac7ff9 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -1,395 +1,344 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pages/chat_details/participant_list_item.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; -import 'package:fluffychat/widgets/content_banner.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/url_launcher.dart'; +import '../../widgets/qr_code_viewer.dart'; class ChatDetailsView extends StatelessWidget { final ChatDetailsController controller; - const ChatDetailsView(this.controller, {Key? key}) : super(key: key); + const ChatDetailsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final room = Matrix.of(context).client.getRoomById(controller.roomId!); if (room == null) { return Scaffold( appBar: AppBar( - title: Text(L10n.of(context)!.oopsSomethingWentWrong), + title: Text(L10n.of(context).oopsSomethingWentWrong), ), body: Center( - child: Text(L10n.of(context)!.youAreNoLongerParticipatingInThisChat), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), ), ); } - controller.members!.removeWhere((u) => u.membership == Membership.leave); - final actualMembersCount = (room.summary.mInvitedMemberCount ?? 0) + - (room.summary.mJoinedMemberCount ?? 0); - final canRequestMoreMembers = - controller.members!.length < actualMembersCount; - final iconColor = Theme.of(context).textTheme.bodyText1!.color; return StreamBuilder( - stream: room.onUpdate.stream, - builder: (context, snapshot) { - return Scaffold( - body: NestedScrollView( - headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) => [ - SliverAppBar( - leading: IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => - VRouter.of(context).path.startsWith('/spaces/') - ? VRouter.of(context).pop() - : VRouter.of(context) - .toSegments(['rooms', controller.roomId!]), - ), - elevation: Theme.of(context).appBarTheme.elevation, - expandedHeight: 300.0, - floating: true, - pinned: true, - actions: [ - if (room.canonicalAlias.isNotEmpty) - IconButton( - tooltip: L10n.of(context)!.share, - icon: Icon(Icons.adaptive.share_outlined), - onPressed: () => FluffyShare.share( - AppConfig.inviteLinkPrefix + room.canonicalAlias, - context), - ), - ChatSettingsPopupMenu(room, false) - ], - title: Text( - room.getLocalizedDisplayname( - MatrixLocals(L10n.of(context)!)), - ), - backgroundColor: - Theme.of(context).appBarTheme.backgroundColor, - flexibleSpace: FlexibleSpaceBar( - background: ContentBanner( - mxContent: room.avatar, - onEdit: room.canSendEvent('m.room.avatar') - ? controller.setAvatarAction - : null, - defaultIcon: Icons.group_outlined, - ), + stream: room.client.onRoomState.stream + .where((update) => update.roomId == room.id), + builder: (context, snapshot) { + var members = room.getParticipants().toList() + ..sort((b, a) => a.powerLevel.compareTo(b.powerLevel)); + members = members.take(10).toList(); + final actualMembersCount = (room.summary.mInvitedMemberCount ?? 0) + + (room.summary.mJoinedMemberCount ?? 0); + final canRequestMoreMembers = members.length < actualMembersCount; + final iconColor = theme.textTheme.bodyLarge!.color; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + return Scaffold( + appBar: AppBar( + leading: controller.widget.embeddedCloseButton ?? + const Center(child: BackButton()), + elevation: theme.appBarTheme.elevation, + actions: [ + if (room.canonicalAlias.isNotEmpty) ...[ + IconButton( + tooltip: L10n.of(context).share, + icon: const Icon(Icons.qr_code_rounded), + onPressed: () => showQrCodeViewer( + context, + room.canonicalAlias, ), ), ], - body: MaxWidthBody( - child: ListView.builder( - itemCount: controller.members!.length + - 1 + - (canRequestMoreMembers ? 1 : 0), - itemBuilder: (BuildContext context, int i) => i == 0 - ? Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ListTile( - leading: room.canSendEvent('m.room.topic') - ? CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - radius: Avatar.defaultSize / 2, - child: const Icon(Icons.edit_outlined), - ) - : null, - title: Text( - '${L10n.of(context)!.groupDescription}:', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold)), - subtitle: LinkText( - text: room.topic.isEmpty - ? L10n.of(context)!.addGroupDescription - : room.topic, - linkStyle: - const TextStyle(color: Colors.blueAccent), - textStyle: TextStyle( - fontSize: 14, - color: Theme.of(context) - .textTheme - .bodyText2! - .color, - ), - onLinkTap: (url) => - UrlLauncher(context, url).launchUrl(), - ), - onTap: room.canSendEvent('m.room.topic') - ? controller.setTopicAction - : null, - ), - const SizedBox(height: 8), - const Divider(height: 1), - ListTile( - title: Text( - L10n.of(context)!.settings, - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - trailing: Icon(controller.displaySettings - ? Icons.keyboard_arrow_down_outlined - : Icons.keyboard_arrow_right_outlined), - onTap: controller.toggleDisplaySettings, - ), - if (controller.displaySettings) ...[ - if (room.canSendEvent('m.room.name')) - ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.people_outline_outlined), - ), - title: Text(L10n.of(context)! - .changeTheNameOfTheGroup), - subtitle: Text(room.getLocalizedDisplayname( - MatrixLocals(L10n.of(context)!))), - onTap: controller.setDisplaynameAction, - ), - if (room.joinRules == JoinRules.public) - ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon(Icons.link_outlined), - ), - onTap: controller.editAliases, - title: - Text(L10n.of(context)!.editRoomAliases), - subtitle: Text( - (room.canonicalAlias.isNotEmpty) - ? room.canonicalAlias - : L10n.of(context)!.none), - ), - ListTile( - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.insert_emoticon_outlined), - ), - title: Text(L10n.of(context)!.emoteSettings), - subtitle: - Text(L10n.of(context)!.setCustomEmotes), - onTap: controller.goToEmoteSettings, - ), - PopupMenuButton( - onSelected: controller.setJoinRulesAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeJoinRules) - PopupMenuItem( - value: JoinRules.public, - child: Text(JoinRules.public - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + if (controller.widget.embeddedCloseButton == null) + ChatSettingsPopupMenu(room, false), + ], + title: Text(L10n.of(context).chatDetails), + backgroundColor: theme.appBarTheme.backgroundColor, + ), + body: MaxWidthBody( + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: members.length + 1 + (canRequestMoreMembers ? 1 : 0), + itemBuilder: (BuildContext context, int i) => i == 0 + ? Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Hero( + tag: + controller.widget.embeddedCloseButton != + null + ? 'embedded_content_banner' + : 'content_banner', + child: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, ), - if (room.canChangeJoinRules) - PopupMenuItem( - value: JoinRules.invite, - child: Text(JoinRules.invite - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + ), + if (!room.isDirectChat && + room.canChangeStateEvent( + EventTypes.RoomAvatar, + )) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon( + Icons.camera_alt_outlined, + ), + ), ), ], - child: ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon(Icons.shield_outlined)), - title: Text(L10n.of(context)! - .whoIsAllowedToJoinThisGroup), - subtitle: Text( - room.joinRules!.getLocalizedString( - MatrixLocals(L10n.of(context)!)), - ), - ), ), - PopupMenuButton( - onSelected: - controller.setHistoryVisibilityAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.invited, - child: Text(HistoryVisibility.invited - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), - ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.joined, - child: Text(HistoryVisibility.joined - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? controller.setDisplaynameAction() + : FluffyShare.share( + displayname, + context, + copyOnly: true, + ), + icon: Icon( + room.isDirectChat + ? Icons.chat_bubble_outline + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? Icons.edit_outlined + : Icons.copy_outlined, + size: 16, ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.shared, - child: Text(HistoryVisibility.shared - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.onSurface, ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.worldReadable, - child: Text(HistoryVisibility - .worldReadable - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + label: Text( + room.isDirectChat + ? L10n.of(context).directChat + : displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 18), ), - ], - child: ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: - const Icon(Icons.visibility_outlined), - ), - title: Text(L10n.of(context)! - .visibilityOfTheChatHistory), - subtitle: Text( - room.historyVisibility!.getLocalizedString( - MatrixLocals(L10n.of(context)!)), ), - ), - ), - if (room.joinRules == JoinRules.public) - PopupMenuButton( - onSelected: controller.setGuestAccessAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeGuestAccess) - PopupMenuItem( - value: GuestAccess.canJoin, - child: Text( - GuestAccess.canJoin - .getLocalizedString(MatrixLocals( - L10n.of(context)!)), - ), - ), - if (room.canChangeGuestAccess) - PopupMenuItem( - value: GuestAccess.forbidden, - child: Text( - GuestAccess.forbidden - .getLocalizedString(MatrixLocals( - L10n.of(context)!)), - ), - ), - ], - child: ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.person_add_alt_1_outlined), + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : context.push( + '/rooms/${controller.roomId}/details/members', + ), + icon: const Icon( + Icons.group_outlined, + size: 14, ), - title: Text(L10n.of(context)! - .areGuestsAllowedToJoin), - subtitle: Text( - room.guestAccess.getLocalizedString( - MatrixLocals(L10n.of(context)!)), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.secondary, + ), + label: Text( + L10n.of(context).countParticipants( + actualMembersCount, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), ), ), - ), - ListTile( - title: - Text(L10n.of(context)!.editChatPermissions), - subtitle: Text( - L10n.of(context)!.whoCanPerformWhichAction), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.edit_attributes_outlined), - ), - onTap: () => - VRouter.of(context).to('permissions'), - ), - ], - const Divider(height: 1), - ListTile( - title: Text( - actualMembersCount > 1 - ? L10n.of(context)!.countParticipants( - actualMembersCount.toString()) - : L10n.of(context)!.emptyChat, - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), + ], ), ), - room.canInvite - ? ListTile( - title: - Text(L10n.of(context)!.inviteContact), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).primaryColor, - foregroundColor: Colors.white, - radius: Avatar.defaultSize / 2, - child: const Icon(Icons.add_outlined), - ), - onTap: () => - VRouter.of(context).to('invite'), - ) - : Container(), ], - ) - : i < controller.members!.length + 1 - ? ParticipantListItem(controller.members![i - 1]) - : ListTile( - title: Text(L10n.of(context)! - .loadCountMoreParticipants( - (actualMembersCount - - controller.members!.length) - .toString())), - leading: CircleAvatar( + ), + Divider(color: theme.dividerColor), + if (!room.canChangeStateEvent(EventTypes.RoomTopic)) + ListTile( + title: Text( + L10n.of(context).chatDescription, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ) + else + Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + onPressed: controller.setTopicAction, + label: Text(L10n.of(context).setChatDescription), + icon: const Icon(Icons.edit_outlined), + style: TextButton.styleFrom( backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - child: const Icon( - Icons.refresh, - color: Colors.grey, - ), + theme.colorScheme.secondaryContainer, + foregroundColor: + theme.colorScheme.onSecondaryContainer, ), - onTap: controller.requestMoreMembersAction, ), - ), - ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + ), + child: SelectableLinkify( + text: room.topic.isEmpty + ? L10n.of(context).noChatDescriptionYet + : room.topic, + options: const LinkifyOptions(humanize: false), + linkStyle: const TextStyle( + color: Colors.blueAccent, + decorationColor: Colors.blueAccent, + ), + style: TextStyle( + fontSize: 14, + fontStyle: room.topic.isEmpty + ? FontStyle.italic + : FontStyle.normal, + color: theme.textTheme.bodyMedium!.color, + decorationColor: + theme.textTheme.bodyMedium!.color, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ), + const SizedBox(height: 16), + Divider(color: theme.dividerColor), + ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon( + Icons.insert_emoticon_outlined, + ), + ), + title: Text(L10n.of(context).customEmojisAndStickers), + subtitle: Text(L10n.of(context).setCustomEmotes), + onTap: controller.goToEmoteSettings, + trailing: const Icon(Icons.chevron_right_outlined), + ), + if (!room.isDirectChat) + ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon(Icons.shield_outlined), + ), + title: Text( + L10n.of(context).accessAndVisibility, + ), + subtitle: Text( + L10n.of(context).accessAndVisibilityDescription, + ), + onTap: () => context + .push('/rooms/${room.id}/details/access'), + trailing: const Icon(Icons.chevron_right_outlined), + ), + if (!room.isDirectChat) + ListTile( + title: Text(L10n.of(context).chatPermissions), + subtitle: Text( + L10n.of(context).whoCanPerformWhichAction, + ), + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon( + Icons.edit_attributes_outlined, + ), + ), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: () => context + .push('/rooms/${room.id}/details/permissions'), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).countParticipants( + actualMembersCount.toString(), + ), + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + if (!room.isDirectChat && room.canInvite) + ListTile( + title: Text(L10n.of(context).inviteContact), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.primaryContainer, + foregroundColor: + theme.colorScheme.onPrimaryContainer, + radius: Avatar.defaultSize / 2, + child: const Icon(Icons.add_outlined), + ), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: () => context.go('/rooms/${room.id}/invite'), + ), + ], + ) + : i < members.length + 1 + ? ParticipantListItem(members[i - 1]) + : ListTile( + title: Text( + L10n.of(context).loadCountMoreParticipants( + (actualMembersCount - members.length).toString(), + ), + ), + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + child: const Icon( + Icons.group_outlined, + color: Colors.grey, + ), + ), + onTap: () => context.push( + '/rooms/${controller.roomId!}/details/members', + ), + trailing: const Icon(Icons.chevron_right_outlined), + ), ), - ); - }); + ), + ); + }, + ); } } diff --git a/lib/pages/chat_details/participant_list_item.dart b/lib/pages/chat_details/participant_list_item.dart index 20499b1d52..2be366a7c9 100644 --- a/lib/pages/chat_details/participant_list_item.dart +++ b/lib/pages/chat_details/participant_list_item.dart @@ -3,32 +3,38 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import '../../widgets/avatar.dart'; import '../user_bottom_sheet/user_bottom_sheet.dart'; class ParticipantListItem extends StatelessWidget { final User user; - const ParticipantListItem(this.user, {Key? key}) : super(key: key); + const ParticipantListItem(this.user, {super.key}); @override Widget build(BuildContext context) { - final membershipBatch = { - Membership.join: '', - Membership.ban: L10n.of(context)!.banned, - Membership.invite: L10n.of(context)!.invited, - Membership.leave: L10n.of(context)!.leftTheChat, + final theme = Theme.of(context); + + final membershipBatch = switch (user.membership) { + Membership.ban => L10n.of(context).banned, + Membership.invite => L10n.of(context).invited, + Membership.join => null, + Membership.knock => L10n.of(context).knocking, + Membership.leave => L10n.of(context).leftTheChat, }; - final permissionBatch = user.powerLevel == 100 - ? L10n.of(context)!.admin + + final permissionBatch = user.powerLevel >= 100 + ? L10n.of(context).admin : user.powerLevel >= 50 - ? L10n.of(context)!.moderator + ? L10n.of(context).moderator : ''; return Opacity( opacity: user.membership == Membership.join ? 1 : 0.5, child: ListTile( - onTap: () => showModalBottomSheet( + onTap: () => showAdaptiveBottomSheet( context: context, builder: (c) => UserBottomSheet( user: user, @@ -37,35 +43,59 @@ class ParticipantListItem extends StatelessWidget { ), title: Row( children: [ - Text(user.calcDisplayname()), - permissionBatch.isEmpty - ? Container() - : Container( - padding: const EdgeInsets.all(4), - margin: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: BorderRadius.circular(8), - ), - child: Center(child: Text(permissionBatch)), + Expanded( + child: Text( + user.calcDisplayname(), + overflow: TextOverflow.ellipsis, + ), + ), + if (permissionBatch.isNotEmpty) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: user.powerLevel >= 100 + ? theme.colorScheme.tertiary + : theme.colorScheme.tertiaryContainer, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + child: Text( + permissionBatch, + style: theme.textTheme.labelSmall?.copyWith( + color: user.powerLevel >= 100 + ? theme.colorScheme.onTertiary + : theme.colorScheme.onTertiaryContainer, ), - membershipBatch[user.membership]!.isEmpty - ? Container() + ), + ), + membershipBatch == null + ? const SizedBox.shrink() : Container( padding: const EdgeInsets.all(4), margin: const EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, + color: theme.secondaryHeaderColor, borderRadius: BorderRadius.circular(8), ), - child: - Center(child: Text(membershipBatch[user.membership]!)), + child: Center( + child: Text( + membershipBatch, + style: theme.textTheme.labelSmall, + ), + ), ), ], ), subtitle: Text(user.id), - leading: - Avatar(mxContent: user.avatarUrl, name: user.calcDisplayname()), + leading: Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + presenceUserId: user.stateKey, + ), ), ); } diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index 5892cf9bc4..8d0d53c76f 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -1,15 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../key_verification/key_verification_dialog.dart'; class ChatEncryptionSettings extends StatefulWidget { - const ChatEncryptionSettings({Key? key}) : super(key: key); + const ChatEncryptionSettings({super.key}); @override ChatEncryptionSettingsController createState() => @@ -17,7 +20,9 @@ class ChatEncryptionSettings extends StatefulWidget { } class ChatEncryptionSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + + Room get room => Matrix.of(context).client.getRoomById(roomId!)!; Future unblock(DeviceKeys key) async { if (key.blocked) { @@ -25,43 +30,68 @@ class ChatEncryptionSettingsController extends State { } } - Future onSelected( - BuildContext context, String action, DeviceKeys key) async { - final room = Matrix.of(context).client.getRoomById(roomId!); - switch (action) { - case 'verify': - await unblock(key); - final req = key.startVerification(); - req.onUpdate = () { - if (req.state == KeyVerificationState.done) { - setState(() {}); - } - }; - await KeyVerificationDialog(request: req).show(context); - break; - case 'verify_user': - await unblock(key); - final req = - await room!.client.userDeviceKeys[key.userId]!.startVerification(); - req.onUpdate = () { - if (req.state == KeyVerificationState.done) { - setState(() {}); - } - }; - await KeyVerificationDialog(request: req).show(context); - break; - case 'block': - if (key.directVerified) { - await key.setVerified(false); - } - await key.setBlocked(true); - setState(() {}); - break; - case 'unblock': - await unblock(key); - setState(() {}); - break; + void enableEncryption(_) async { + if (room.encrypted) { + showOkAlertDialog( + context: context, + title: L10n.of(context).sorryThatsNotPossible, + message: L10n.of(context).disableEncryptionWarning, + ); + return; + } + if (room.joinRules == JoinRules.public) { + showOkAlertDialog( + context: context, + title: L10n.of(context).sorryThatsNotPossible, + message: L10n.of(context).noEncryptionForPublicRooms, + ); + return; + } + if (!room.canChangeStateEvent(EventTypes.Encryption)) { + showOkAlertDialog( + context: context, + title: L10n.of(context).sorryThatsNotPossible, + message: L10n.of(context).noPermission, + ); + return; } + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).enableEncryptionWarning, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + await showFutureLoadingDialog( + context: context, + future: () => room.enableEncryption(), + ); + } + + void startVerification() async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).verifyOtherUser, + message: L10n.of(context).verifyOtherUserDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + final req = await room.client.userDeviceKeys[room.directChatMatrixID]! + .startVerification(); + req.onUpdate = () { + if (req.state == KeyVerificationState.done) { + setState(() {}); + } + }; + await KeyVerificationDialog(request: req).show(context); + } + + void toggleDeviceKey(DeviceKeys key) { + setState(() { + key.setBlocked(!key.blocked); + }); } @override diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart index 581bff85ae..2c39a942e1 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart @@ -1,202 +1,199 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; -import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/utils/beautify_string_extension.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/device_extension.dart'; class ChatEncryptionSettingsView extends StatelessWidget { final ChatEncryptionSettingsController controller; - const ChatEncryptionSettingsView(this.controller, {Key? key}) - : super(key: key); + const ChatEncryptionSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { - final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; + final theme = Theme.of(context); - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => - VRouter.of(context).toSegments(['rooms', controller.roomId!]), - ), - title: Text(L10n.of(context)!.tapOnDeviceToVerify), - elevation: 0, + final room = controller.room; + return StreamBuilder( + stream: room.client.onSync.stream.where( + (s) => s.rooms?.join?[room.id] != null || s.deviceLists != null, ), - body: MaxWidthBody( - withScrolling: true, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - title: Text(L10n.of(context)!.deviceVerifyDescription), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), - ), + builder: (context, _) => Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.close_outlined), + onPressed: () => context.go('/rooms/${controller.roomId!}'), + ), + title: Text(L10n.of(context).encryption), + actions: [ + TextButton( + onPressed: () => launchUrlString(AppConfig.encryptionTutorial), + child: Text(L10n.of(context).help), ), - const Divider(height: 1), - StreamBuilder( - stream: room.onUpdate.stream, - builder: (context, snapshot) { - return FutureBuilder>( + ], + ), + body: MaxWidthBody( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SwitchListTile( + secondary: CircleAvatar( + foregroundColor: theme.colorScheme.onPrimaryContainer, + backgroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.lock_outlined), + ), + title: Text(L10n.of(context).encryptThisChat), + value: room.encrypted, + onChanged: controller.enableEncryption, + ), + Icon( + CupertinoIcons.lock_shield, + size: 128, + color: theme.colorScheme.onInverseSurface, + ), + const Divider(), + if (room.isDirectChat) + Padding( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + onPressed: controller.startVerification, + icon: const Icon(Icons.verified_outlined), + label: Text(L10n.of(context).verifyStart), + ), + ), + ), + if (room.encrypted) ...[ + const SizedBox(height: 16), + ListTile( + title: Text( + L10n.of(context).deviceKeys, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id), + builder: (context, snapshot) => + FutureBuilder>( future: room.getUserDeviceKeys(), builder: (BuildContext context, snapshot) { if (snapshot.hasError) { return Center( - child: Text(L10n.of(context)!.oopsSomethingWentWrong + - ': ' + - snapshot.error.toString()), + child: Text( + '${L10n.of(context).oopsSomethingWentWrong}: ${snapshot.error}', + ), ); } if (!snapshot.hasData) { return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); } final deviceKeys = snapshot.data!; return ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: deviceKeys.length, - itemBuilder: (BuildContext context, int i) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (i == 0 || - deviceKeys[i].userId != - deviceKeys[i - 1].userId) ...{ - const Divider(height: 1, thickness: 1), - PopupMenuButton( - onSelected: (dynamic action) => controller - .onSelected(context, action, deviceKeys[i]), - itemBuilder: (c) { - final items = >[]; - if (room - .client - .userDeviceKeys[deviceKeys[i].userId]! - .verified == - UserVerifiedStatus.unknown) { - items.add(PopupMenuItem( - value: 'verify_user', - child: Text(L10n.of(context)!.verifyUser), - )); - } - return items; - }, - child: ListTile( - leading: Avatar( - mxContent: room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .avatarUrl, - name: room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .calcDisplayname(), - ), - title: Text( - room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .calcDisplayname(), - ), - subtitle: Text( - deviceKeys[i].userId, - style: const TextStyle( - fontWeight: FontWeight.w300), - ), - ), + itemBuilder: (BuildContext context, int i) => + SwitchListTile( + value: !deviceKeys[i].blocked, + activeColor: deviceKeys[i].verified + ? Colors.green + : Colors.orange, + onChanged: (_) => + controller.toggleDeviceKey(deviceKeys[i]), + title: Row( + children: [ + Icon( + deviceKeys[i].verified + ? Icons.verified_outlined + : deviceKeys[i].blocked + ? Icons.block_outlined + : Icons.info_outlined, + color: deviceKeys[i].verified + ? Colors.green + : deviceKeys[i].blocked + ? Colors.red + : Colors.orange, + size: 20, ), - }, - PopupMenuButton( - onSelected: (dynamic action) => controller - .onSelected(context, action, deviceKeys[i]), - itemBuilder: (c) { - final items = >[]; - if (deviceKeys[i].blocked || - !deviceKeys[i].verified) { - items.add(PopupMenuItem( - value: deviceKeys[i].userId == - room.client.userID - ? 'verify' - : 'verify_user', - child: Text(L10n.of(context)!.verifyStart), - )); - } - if (deviceKeys[i].blocked) { - items.add(PopupMenuItem( - value: 'unblock', - child: - Text(L10n.of(context)!.unblockDevice), - )); - } - if (!deviceKeys[i].blocked) { - items.add(PopupMenuItem( - value: 'block', - child: Text(L10n.of(context)!.blockDevice), - )); - } - return items; - }, - child: ListTile( - leading: CircleAvatar( - foregroundColor: Colors.white, - backgroundColor: deviceKeys[i].color, - child: Icon(deviceKeys[i].icon), - ), - title: Text( - deviceKeys[i].displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - subtitle: Row( - children: [ - Text( - deviceKeys[i].deviceId!, - style: const TextStyle( - fontWeight: FontWeight.w300), + const SizedBox(width: 4), + Text( + deviceKeys[i].deviceId ?? + L10n.of(context).unknownDevice, + ), + const SizedBox(width: 4), + Flexible( + fit: FlexFit.loose, + child: Material( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + side: BorderSide( + color: theme.colorScheme.primary, ), - const Spacer(), - Text( - deviceKeys[i].blocked - ? L10n.of(context)!.blocked - : deviceKeys[i].verified - ? L10n.of(context)!.verified - : L10n.of(context)!.unverified, + ), + color: theme.colorScheme.primaryContainer, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + deviceKeys[i].userId, + maxLines: 1, + overflow: TextOverflow.ellipsis, style: TextStyle( - fontSize: 14, - color: deviceKeys[i].color, + color: theme.colorScheme.primary, + fontSize: 12, + fontStyle: FontStyle.italic, ), ), - ], + ), ), ), + ], + ), + subtitle: Text( + deviceKeys[i].ed25519Key?.beautified ?? + L10n.of(context).unknownEncryptionAlgorithm, + style: TextStyle( + fontFamily: 'RobotoMono', + color: theme.colorScheme.secondary, ), - ], + ), ), ); }, - ); - }), - ], + ), + ), + ] else + Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: Text( + L10n.of(context).encryptionNotEnabled, + style: const TextStyle( + fontStyle: FontStyle.italic, + ), + ), + ), + ), + ], + ), ), ), ); } } - -extension on DeviceKeys { - Color get color => blocked - ? Colors.red - : verified - ? Colors.green - : Colors.orange; -} diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index f2d265f697..5c494acb1c 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,31 +1,41 @@ import 'dart:async'; -import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:cross_file/cross_file.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:flutter_shortcuts/flutter_shortcuts.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; import 'package:matrix/matrix.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; -import 'package:snapping_sheet/snapping_sheet.dart'; import 'package:uni_links/uni_links.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; -import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; -import 'package:fluffychat/utils/famedlysdk_store.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/utils/show_update_snackbar.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; import '../../../utils/account_bundles.dart'; -import '../../main.dart'; -import '../../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; +import '../../config/setting_keys.dart'; import '../../utils/url_launcher.dart'; +import '../../utils/voip/callkeep_manager.dart'; +import '../../widgets/fluffy_chat_app.dart'; import '../../widgets/matrix.dart'; import '../bootstrap/bootstrap_dialog.dart'; -enum SelectMode { normal, share, select } +import 'package:fluffychat/utils/tor_stub.dart' + if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; enum PopupMenuAction { settings, @@ -36,21 +46,132 @@ enum PopupMenuAction { archive, } +enum ActiveFilter { + allChats, + messages, + groups, + unread, + spaces, +} + +extension LocalizedActiveFilter on ActiveFilter { + String toLocalizedString(BuildContext context) { + switch (this) { + case ActiveFilter.allChats: + return L10n.of(context).all; + case ActiveFilter.messages: + return L10n.of(context).messages; + case ActiveFilter.unread: + return L10n.of(context).unread; + case ActiveFilter.groups: + return L10n.of(context).groups; + case ActiveFilter.spaces: + return L10n.of(context).spaces; + } + } +} + class ChatList extends StatefulWidget { - const ChatList({Key? key}) : super(key: key); + static BuildContext? contextForVoip; + final String? activeChat; + final bool displayNavigationRail; + + const ChatList({ + super.key, + required this.activeChat, + this.displayNavigationRail = false, + }); @override ChatListController createState() => ChatListController(); } -class ChatListController extends State with TickerProviderStateMixin { +class ChatListController extends State + with TickerProviderStateMixin, RouteAware { StreamSubscription? _intentDataStreamSubscription; StreamSubscription? _intentFileStreamSubscription; StreamSubscription? _intentUriStreamSubscription; - SpacesEntry? _activeSpacesEntry; + ActiveFilter activeFilter = AppConfig.separateChatTypes + ? ActiveFilter.messages + : ActiveFilter.allChats; + + String? _activeSpaceId; + String? get activeSpaceId => _activeSpaceId; + + void setActiveSpace(String spaceId) async { + await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); + + setState(() { + _activeSpaceId = spaceId; + }); + } + + void clearActiveSpace() => setState(() { + _activeSpaceId = null; + }); + + void onChatTap(Room room) async { + if (room.membership == Membership.invite) { + final joinResult = await showFutureLoadingDialog( + context: context, + future: () async { + final waitForRoom = room.client.waitForRoomInSync( + room.id, + join: true, + ); + await room.join(); + await waitForRoom; + }, + exceptionContext: ExceptionContext.joinRoom, + ); + if (joinResult.error != null) return; + } + + if (room.membership == Membership.ban) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context).youHaveBeenBannedFromThisChat), + ), + ); + return; + } + + if (room.membership == Membership.leave) { + context.go('/rooms/archive/${room.id}'); + return; + } + + if (room.isSpace) { + setActiveSpace(room.id); + return; + } + + context.go('/rooms/${room.id}'); + } + + bool Function(Room) getRoomFilterByActiveFilter(ActiveFilter activeFilter) { + switch (activeFilter) { + case ActiveFilter.allChats: + return (room) => true; + case ActiveFilter.messages: + return (room) => !room.isSpace && room.isDirectChat; + case ActiveFilter.groups: + return (room) => !room.isSpace && !room.isDirectChat; + case ActiveFilter.unread: + return (room) => room.isUnreadOrInvited; + case ActiveFilter.spaces: + return (room) => room.isSpace; + } + } + + List get filteredRooms => Matrix.of(context) + .client + .rooms + .where(getRoomFilterByActiveFilter(activeFilter)) + .toList(); bool isSearchMode = false; Future? publicRoomsResponse; @@ -64,28 +185,31 @@ class ChatListController extends State with TickerProviderStateMixin { void setServer() async { final newServer = await showTextInputDialog( - useRootNavigator: false, - title: L10n.of(context)!.changeTheHomeserver, - context: context, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - prefixText: 'https://', - hintText: Matrix.of(context).client.homeserver?.host, - initialText: searchServer, - keyboardType: TextInputType.url, - autocorrect: false) - ]); + useRootNavigator: false, + title: L10n.of(context).changeTheHomeserver, + context: context, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + prefixText: 'https://', + hintText: Matrix.of(context).client.homeserver?.host, + initialText: searchServer, + keyboardType: TextInputType.url, + autocorrect: false, + validator: (server) => server.contains('.') == true + ? null + : L10n.of(context).invalidServerName, + ); if (newServer == null) return; - Store().setItem(_serverStoreNamespace, newServer.single); + Matrix.of(context).store.setString(_serverStoreNamespace, newServer); setState(() { - searchServer = newServer.single; + searchServer = newServer; }); - onSearchEnter(searchController.text); + _coolDown?.cancel(); + _coolDown = Timer(const Duration(milliseconds: 500), _search); } final TextEditingController searchController = TextEditingController(); + final FocusNode searchFocusNode = FocusNode(); void _search() async { final client = Matrix.of(context).client; @@ -96,12 +220,34 @@ class ChatListController extends State with TickerProviderStateMixin { } SearchUserDirectoryResponse? userSearchResult; QueryPublicRoomsResponse? roomSearchResult; + final searchQuery = searchController.text.trim(); try { roomSearchResult = await client.queryPublicRooms( server: searchServer, - filter: PublicRoomQueryFilter(genericSearchTerm: searchController.text), + filter: PublicRoomQueryFilter(genericSearchTerm: searchQuery), limit: 20, ); + + if (searchQuery.isValidMatrixId && + searchQuery.sigil == '#' && + roomSearchResult.chunk + .any((room) => room.canonicalAlias == searchQuery) == + false) { + final response = await client.getRoomIdByAlias(searchQuery); + final roomId = response.roomId; + if (roomId != null) { + roomSearchResult.chunk.add( + PublicRoomsChunk( + name: searchQuery, + guestCanJoin: false, + numJoinedMembers: 0, + roomId: roomId, + worldReadable: false, + canonicalAlias: searchQuery, + ), + ); + } + } userSearchResult = await client.searchUserDirectory( searchController.text, limit: 20, @@ -116,6 +262,7 @@ class ChatListController extends State with TickerProviderStateMixin { ), ); } + if (!isSearchMode) return; setState(() { isSearching = false; this.roomSearchResult = roomSearchResult; @@ -123,9 +270,9 @@ class ChatListController extends State with TickerProviderStateMixin { }); } - void onSearchEnter(String text) { + void onSearchEnter(String text, {bool globalSearch = true}) { if (text.isEmpty) { - cancelSearch(); + cancelSearch(unfocus: false); return; } @@ -133,136 +280,92 @@ class ChatListController extends State with TickerProviderStateMixin { isSearchMode = true; }); _coolDown?.cancel(); - _coolDown = Timer(const Duration(milliseconds: 500), _search); + if (globalSearch) { + _coolDown = Timer(const Duration(milliseconds: 500), _search); + } } - void cancelSearch() => setState(() { - searchController.clear(); - isSearchMode = false; - roomSearchResult = userSearchResult = null; - isSearching = false; - }); + void startSearch() { + setState(() { + isSearchMode = true; + }); + searchFocusNode.requestFocus(); + _coolDown?.cancel(); + _coolDown = Timer(const Duration(milliseconds: 500), _search); + } - SpacesEntry get activeSpacesEntry { - final id = _activeSpacesEntry; - return (id == null || !id.stillValid(context)) ? defaultSpacesEntry : id; + void cancelSearch({bool unfocus = true}) { + setState(() { + searchController.clear(); + isSearchMode = false; + roomSearchResult = userSearchResult = null; + isSearching = false; + }); + if (unfocus) searchFocusNode.unfocus(); } - BoxConstraints? snappingSheetContainerSize; + bool isTorBrowser = false; - String? get activeSpaceId => activeSpacesEntry.getSpace(context)?.id; + BoxConstraints? snappingSheetContainerSize; final ScrollController scrollController = ScrollController(); - bool scrolledToTop = true; + final ValueNotifier scrolledToTop = ValueNotifier(true); final StreamController _clientStream = StreamController.broadcast(); - SnappingSheetController snappingSheetController = SnappingSheetController(); - - ScrollController snappingSheetScrollContentController = ScrollController(); - Stream get clientStream => _clientStream.stream; - void addAccountAction() => VRouter.of(context).to('/settings/account'); + void addAccountAction() => context.go('/rooms/settings/account'); void _onScroll() { final newScrolledToTop = scrollController.position.pixels <= 0; - if (newScrolledToTop != scrolledToTop) { - setState(() { - scrolledToTop = newScrolledToTop; - }); + if (newScrolledToTop != scrolledToTop.value) { + scrolledToTop.value = newScrolledToTop; } } - void setActiveSpacesEntry(BuildContext context, SpacesEntry? spaceId) { - Scaffold.of(context).closeDrawer(); - setState(() => _activeSpacesEntry = spaceId); - } - void editSpace(BuildContext context, String spaceId) async { await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); - VRouter.of(context).toSegments(['spaces', spaceId]); + if (mounted) { + context.push('/rooms/$spaceId/details'); + } } // Needs to match GroupsSpacesEntry for 'separate group' checking. List get spaces => Matrix.of(context).client.rooms.where((r) => r.isSpace).toList(); - // Note that this could change due to configuration, etc. - // Also be aware that _activeSpacesEntry = null is the expected reset method. - SpacesEntry get defaultSpacesEntry => AppConfig.separateChatTypes - ? DirectChatsSpacesEntry() - : AllRoomsSpacesEntry(); - - List get spacesEntries { - if (AppConfig.separateChatTypes) { - return [ - defaultSpacesEntry, - GroupsSpacesEntry(), - ...spaces.map((space) => SpaceSpacesEntry(space)).toList() - ]; - } - return [ - defaultSpacesEntry, - ...spaces.map((space) => SpaceSpacesEntry(space)).toList() - ]; - } - - final selectedRoomIds = {}; - bool? crossSigningCached; - bool showChatBackupBanner = false; - - void firstRunBootstrapAction() async { - setState(() { - showChatBackupBanner = false; - }); - - await BootstrapDialog( - client: Matrix.of(context).client, - ).show(context); - VRouter.of(context).to('/rooms'); - } - - String? get activeChat => VRouter.of(context).pathParameters['roomid']; + String? get activeChat => widget.activeChat; - SelectMode get selectMode => Matrix.of(context).shareContent != null - ? SelectMode.share - : selectedRoomIds.isEmpty - ? SelectMode.normal - : SelectMode.select; - - void _processIncomingSharedFiles(List files) { + void _processIncomingSharedMedia(List files) { if (files.isEmpty) return; - final file = File(files.first.path.replaceFirst('file://', '')); - - Matrix.of(context).shareContent = { - 'msgtype': 'chat.fluffy.shared_file', - 'file': MatrixFile( - bytes: file.readAsBytesSync(), - name: file.path, - ).detectFileType, - }; - VRouter.of(context).to('/rooms'); - } - void _processIncomingSharedText(String? text) { - if (text == null) return; - if (text.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || - text.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || - (text.toLowerCase().startsWith(AppConfig.schemePrefix) && - !RegExp(r'\s').hasMatch(text))) { - return _processIncomingUris(text); - } - Matrix.of(context).shareContent = { - 'msgtype': 'm.text', - 'body': text, - }; - VRouter.of(context).to('/rooms'); + showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: files.map( + (file) { + if ({ + SharedMediaType.text, + SharedMediaType.url, + }.contains(file.type)) { + return TextShareItem(file.path); + } + return FileShareItem( + XFile( + file.path.replaceFirst('file://', ''), + mimeType: file.mimeType, + ), + ); + }, + ).toList(), + ), + ); } void _processIncomingUris(String? text) async { if (text == null) return; - VRouter.of(context).to('/rooms'); + context.go('/rooms'); WidgetsBinding.instance.addPostFrameCallback((_) { UrlLauncher(context, text).openMatrixToUrl(); }); @@ -272,18 +375,14 @@ class ChatListController extends State with TickerProviderStateMixin { if (!PlatformInfos.isMobile) return; // For sharing images coming from outside the app while the app is in the memory - _intentFileStreamSubscription = ReceiveSharingIntent.getMediaStream() - .listen(_processIncomingSharedFiles, onError: print); + _intentFileStreamSubscription = ReceiveSharingIntent.instance + .getMediaStream() + .listen(_processIncomingSharedMedia, onError: print); // For sharing images coming from outside the app while the app is closed - ReceiveSharingIntent.getInitialMedia().then(_processIncomingSharedFiles); - - // For sharing or opening urls/text coming from outside the app while the app is in the memory - _intentDataStreamSubscription = ReceiveSharingIntent.getTextStream() - .listen(_processIncomingSharedText, onError: print); - - // For sharing or opening urls/text coming from outside the app while the app is closed - ReceiveSharingIntent.getInitialText().then(_processIncomingSharedText); + ReceiveSharingIntent.instance + .getInitialMedia() + .then(_processIncomingSharedMedia); // For receiving shared Uris _intentUriStreamSubscription = linkStream.listen(_processIncomingUris); @@ -291,6 +390,16 @@ class ChatListController extends State with TickerProviderStateMixin { FluffyChatApp.gotInitialLink = true; getInitialLink().then(_processIncomingUris); } + + if (PlatformInfos.isAndroid) { + final shortcuts = FlutterShortcuts(); + shortcuts.initialize().then( + (_) => shortcuts.listenAction((action) { + if (!mounted) return; + UrlLauncher(context, action).launchUrl(); + }), + ); + } } @override @@ -300,29 +409,24 @@ class ChatListController extends State with TickerProviderStateMixin { scrollController.addListener(_onScroll); _waitForFirstSync(); _hackyWebRTCFixForWeb(); - + CallKeepManager().initialize(); WidgetsBinding.instance.addPostFrameCallback((_) async { - searchServer = await Store().getItem(_serverStoreNamespace); + if (mounted) { + searchServer = + Matrix.of(context).store.getString(_serverStoreNamespace); + Matrix.of(context).backgroundPush?.setupPush(); + UpdateNotifier.showUpdateSnackBar(context); + } + + // Workaround for system UI overlay style not applied on app start + SystemChrome.setSystemUIOverlayStyle( + Theme.of(context).appBarTheme.systemOverlayStyle!, + ); }); - super.initState(); - } - void checkBootstrap() async { - if (!Matrix.of(context).client.encryptionEnabled) return; - await Matrix.of(context).client.accountDataLoading; - await Matrix.of(context).client.userDeviceKeysLoading; - final crossSigning = - await Matrix.of(context).client.encryption?.crossSigning.isCached() ?? - false; - final needsBootstrap = - Matrix.of(context).client.encryption?.crossSigning.enabled == false || - crossSigning == false; - final isUnknownSession = Matrix.of(context).client.isUnknownSession; - if (needsBootstrap || isUnknownSession) { - setState(() { - showChatBackupBanner = true; - }); - } + _checkTorBrowser(); + + super.initState(); } @override @@ -334,246 +438,381 @@ class ChatListController extends State with TickerProviderStateMixin { super.dispose(); } - void toggleSelection(String roomId) { - setState(() => selectedRoomIds.contains(roomId) - ? selectedRoomIds.remove(roomId) - : selectedRoomIds.add(roomId)); - } - - Future toggleUnread() async { - await showFutureLoadingDialog( - context: context, - future: () async { - final markUnread = anySelectedRoomNotMarkedUnread; - final client = Matrix.of(context).client; - for (final roomId in selectedRoomIds) { - final room = client.getRoomById(roomId)!; - if (room.markedUnread == markUnread) continue; - await client.getRoomById(roomId)!.markUnread(markUnread); - } - }, - ); - cancelAction(); - } - - Future toggleFavouriteRoom() async { - await showFutureLoadingDialog( - context: context, - future: () async { - final makeFavorite = anySelectedRoomNotFavorite; - final client = Matrix.of(context).client; - for (final roomId in selectedRoomIds) { - final room = client.getRoomById(roomId)!; - if (room.isFavourite == makeFavorite) continue; - await client.getRoomById(roomId)!.setFavourite(makeFavorite); - } - }, - ); - cancelAction(); - } + void chatContextAction( + Room room, + BuildContext posContext, [ + Room? space, + ]) async { + final overlay = + Overlay.of(posContext).context.findRenderObject() as RenderBox; - Future toggleMuted() async { - await showFutureLoadingDialog( - context: context, - future: () async { - final newState = anySelectedRoomNotMuted - ? PushRuleState.mentionsOnly - : PushRuleState.notify; - final client = Matrix.of(context).client; - for (final roomId in selectedRoomIds) { - final room = client.getRoomById(roomId)!; - if (room.pushRuleState == newState) continue; - await client.getRoomById(roomId)!.setPushRuleState(newState); - } - }, - ); - cancelAction(); - } + final button = posContext.findRenderObject() as RenderBox; - Future archiveAction() async { - final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok; - if (!confirmed) return; - await showFutureLoadingDialog( - context: context, - future: () => _archiveSelectedRooms(), + final position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(const Offset(0, -65), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero) + const Offset(-50, 0), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, ); - setState(() {}); - } - void setStatus() async { - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.setStatus, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.statusExampleMessage, + final displayname = + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))); + + final spacesWithPowerLevels = room.client.rooms + .where( + (space) => + space.isSpace && + space.canChangeStateEvent(EventTypes.SpaceChild) && + !space.spaceChildren.any((c) => c.roomId == room.id), + ) + .toList(); + + final action = await showMenu( + context: posContext, + position: position, + items: [ + PopupMenuItem( + value: ChatContextAction.open, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + mxContent: room.avatar, + size: Avatar.defaultSize / 2, + name: displayname, + ), + const SizedBox(width: 12), + Text( + displayname, + style: + TextStyle(color: Theme.of(context).colorScheme.onSurface), + ), + ], ), - ]); - if (input == null) return; - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.setPresence( - Matrix.of(context).client.userID!, - PresenceType.online, - statusMsg: input.single, + ), + const PopupMenuDivider(), + if (space != null) + PopupMenuItem( + value: ChatContextAction.goToSpace, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + mxContent: space.avatar, + size: Avatar.defaultSize / 2, + name: space.getLocalizedDisplayname(), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + L10n.of(context).goToSpace(space.getLocalizedDisplayname()), + ), + ), + ], + ), + ), + if (room.membership == Membership.join) ...[ + PopupMenuItem( + value: ChatContextAction.mute, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + room.pushRuleState == PushRuleState.notify + ? Icons.notifications_off_outlined + : Icons.notifications_off, + ), + const SizedBox(width: 12), + Text( + room.pushRuleState == PushRuleState.notify + ? L10n.of(context).muteChat + : L10n.of(context).unmuteChat, + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.markUnread, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + room.markedUnread + ? Icons.mark_as_unread + : Icons.mark_as_unread_outlined, + ), + const SizedBox(width: 12), + Text( + room.markedUnread + ? L10n.of(context).markAsRead + : L10n.of(context).markAsUnread, + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.favorite, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined, + ), + const SizedBox(width: 12), + Text( + room.isFavourite + ? L10n.of(context).unpin + : L10n.of(context).pin, + ), + ], + ), + ), + if (spacesWithPowerLevels.isNotEmpty) + PopupMenuItem( + value: ChatContextAction.addToSpace, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.group_work_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).addToSpace), + ], + ), + ), + ], + if (room.membership == Membership.invite) + PopupMenuItem( + value: ChatContextAction.block, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.block_outlined, + color: Theme.of(context).colorScheme.error, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).block, + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + ], + ), ), + PopupMenuItem( + value: ChatContextAction.leave, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.delete_outlined, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + room.membership == Membership.invite + ? L10n.of(context).delete + : L10n.of(context).leave, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], + ), + ), + ], ); - } - - Future _archiveSelectedRooms() async { - final client = Matrix.of(context).client; - while (selectedRoomIds.isNotEmpty) { - final roomId = selectedRoomIds.first; - try { - await client.getRoomById(roomId)!.leave(); - } finally { - toggleSelection(roomId); - } - } - } - Future addOrRemoveToSpace() async { - final id = activeSpaceId; - if (id != null) { - final consent = await showOkCancelAlertDialog( - context: context, - title: L10n.of(context)!.removeFromSpace, - message: L10n.of(context)!.removeFromSpaceDescription, - okLabel: L10n.of(context)!.remove, - cancelLabel: L10n.of(context)!.cancel, - isDestructiveAction: true, - fullyCapitalizedForMaterial: false, - ); - if (consent != OkCancelResult.ok) return; + if (action == null) return; + if (!mounted) return; - final space = Matrix.of(context).client.getRoomById(id); - final result = await showFutureLoadingDialog( - context: context, - future: () async { - for (final roomId in selectedRoomIds) { - await space!.removeSpaceChild(roomId); - } - }, - ); - if (result.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.chatHasBeenRemovedFromThisSpace), + switch (action) { + case ChatContextAction.open: + onChatTap(room); + return; + case ChatContextAction.goToSpace: + setActiveSpace(space!.id); + return; + case ChatContextAction.favorite: + await showFutureLoadingDialog( + context: context, + future: () => room.setFavourite(!room.isFavourite), + ); + return; + case ChatContextAction.markUnread: + await showFutureLoadingDialog( + context: context, + future: () => room.markUnread(!room.markedUnread), + ); + return; + case ChatContextAction.mute: + await showFutureLoadingDialog( + context: context, + future: () => room.setPushRuleState( + room.pushRuleState == PushRuleState.notify + ? PushRuleState.mentionsOnly + : PushRuleState.notify, ), ); - } - } else { - final selectedSpace = await showConfirmationDialog( + return; + case ChatContextAction.leave: + final confirmed = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).archiveRoomDescription, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ); + if (confirmed == OkCancelResult.cancel) return; + if (!mounted) return; + + await showFutureLoadingDialog(context: context, future: room.leave); + + return; + case ChatContextAction.addToSpace: + final space = await showModalActionPopup( context: context, - title: L10n.of(context)!.addToSpace, - message: L10n.of(context)!.addToSpaceDescription, - fullyCapitalizedForMaterial: false, - actions: Matrix.of(context) - .client - .rooms - .where((r) => r.isSpace) + title: L10n.of(context).space, + actions: spacesWithPowerLevels .map( - (space) => AlertDialogAction( - key: space.id, - label: space.displayname, + (space) => AdaptiveModalAction( + value: space, + label: space + .getLocalizedDisplayname(MatrixLocals(L10n.of(context))), ), ) - .toList()); - if (selectedSpace == null) return; - final result = await showFutureLoadingDialog( - context: context, - future: () async { - final space = Matrix.of(context).client.getRoomById(selectedSpace)!; - if (space.canSendDefaultStates) { - for (final roomId in selectedRoomIds) { - await space.setSpaceChild(roomId); - } - } - }, - ); - if (result.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.chatHasBeenAddedToThisSpace), - ), + .toList(), ); - } + if (space == null) return; + await showFutureLoadingDialog( + context: context, + future: () => space.setSpaceChild(room.id), + ); + case ChatContextAction.block: + final userId = + room.getState(EventTypes.RoomMember, room.client.userID!)?.senderId; + context.go('/rooms/settings/security/ignorelist', extra: userId); } - setState(() => selectedRoomIds.clear()); } - bool get anySelectedRoomNotMarkedUnread => selectedRoomIds.any( - (roomId) => !Matrix.of(context).client.getRoomById(roomId)!.markedUnread); - - bool get anySelectedRoomNotFavorite => selectedRoomIds.any( - (roomId) => !Matrix.of(context).client.getRoomById(roomId)!.isFavourite); + void dismissStatusList() async { + final result = await showOkCancelAlertDialog( + title: L10n.of(context).hidePresences, + context: context, + ); + if (result == OkCancelResult.ok) { + await Matrix.of(context).store.setBool(SettingKeys.showPresences, false); + AppConfig.showPresences = false; + setState(() {}); + } + } - bool get anySelectedRoomNotMuted => selectedRoomIds.any((roomId) => - Matrix.of(context).client.getRoomById(roomId)!.pushRuleState == - PushRuleState.notify); + void setStatus() async { + final client = Matrix.of(context).client; + final currentPresence = await client.fetchCurrentPresence(client.userID!); + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).setStatus, + message: L10n.of(context).leaveEmptyToClearStatus, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).statusExampleMessage, + maxLines: 6, + minLines: 1, + maxLength: 255, + initialText: currentPresence.statusMsg, + ); + if (input == null) return; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => client.setPresence( + client.userID!, + PresenceType.online, + statusMsg: input, + ), + ); + } bool waitForFirstSync = false; Future _waitForFirstSync() async { + final router = GoRouter.of(context); final client = Matrix.of(context).client; await client.roomsLoading; await client.accountDataLoading; - if (client.onSync.value == null) { + await client.userDeviceKeysLoading; + if (client.prevBatch == null) { await client.onSync.stream.first; - } - // Load space members to display DM rooms - final spaceId = activeSpaceId; - if (spaceId != null) { - final space = client.getRoomById(spaceId)!; - final localMembers = space.getParticipants().length; - final actualMembersCount = (space.summary.mInvitedMemberCount ?? 0) + - (space.summary.mJoinedMemberCount ?? 0); - if (localMembers < actualMembersCount) { - await space.requestParticipants(); + + // Display first login bootstrap if enabled + if (client.encryption?.keyManager.enabled == true) { + if (await client.encryption?.keyManager.isCached() == false || + await client.encryption?.crossSigning.isCached() == false || + client.isUnknownSession && !mounted) { + await BootstrapDialog(client: client).show(context); + } } } + if (!mounted) return; setState(() { waitForFirstSync = true; }); - WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap()); - return; - } - void cancelAction() { - if (selectMode == SelectMode.share) { - setState(() => Matrix.of(context).shareContent = null); - } else { - setState(() => selectedRoomIds.clear()); + if (client.userDeviceKeys[client.userID!]?.deviceKeys.values + .any((device) => !device.verified && !device.blocked) ?? + false) { + late final ScaffoldFeatureController controller; + final theme = Theme.of(context); + controller = ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: const Duration(seconds: 15), + backgroundColor: theme.colorScheme.errorContainer, + content: Text( + L10n.of(context).oneOfYourDevicesIsNotVerified, + style: TextStyle( + color: theme.colorScheme.onErrorContainer, + ), + ), + action: SnackBarAction( + onPressed: () { + controller.close(); + router.go('/rooms/settings/devices'); + }, + textColor: theme.colorScheme.onErrorContainer, + label: L10n.of(context).settings, + ), + ), + ); } } + void setActiveFilter(ActiveFilter filter) { + setState(() { + activeFilter = filter; + }); + } + void setActiveClient(Client client) { - VRouter.of(context).to('/rooms'); + context.go('/rooms'); setState(() { - _activeSpacesEntry = null; - snappingSheetController = SnappingSheetController(); - snappingSheetScrollContentController = ScrollController(); - selectedRoomIds.clear(); + activeFilter = ActiveFilter.allChats; + _activeSpaceId = null; Matrix.of(context).setActiveClient(client); }); _clientStream.add(client); } void setActiveBundle(String bundle) { - VRouter.of(context).to('/rooms'); + context.go('/rooms'); setState(() { - _activeSpacesEntry = null; - selectedRoomIds.clear(); + _activeSpaceId = null; Matrix.of(context).activeBundle = bundle; if (!Matrix.of(context) .currentBundle! @@ -585,21 +824,23 @@ class ChatListController extends State with TickerProviderStateMixin { } void editBundlesForAccount(String? userId, String? activeBundle) async { + final l10n = L10n.of(context); final client = Matrix.of(context) .widget .clients[Matrix.of(context).getClientIndexByMatrixId(userId!)]; - final action = await showConfirmationDialog( + final action = await showModalActionPopup( context: context, - title: L10n.of(context)!.editBundlesForAccount, + title: L10n.of(context).editBundlesForAccount, + cancelLabel: L10n.of(context).cancel, actions: [ - AlertDialogAction( - key: EditBundleAction.addToBundle, - label: L10n.of(context)!.addToBundle, + AdaptiveModalAction( + value: EditBundleAction.addToBundle, + label: L10n.of(context).addToBundle, ), if (activeBundle != client.userID) - AlertDialogAction( - key: EditBundleAction.removeFromBundle, - label: L10n.of(context)!.removeFromBundle, + AdaptiveModalAction( + value: EditBundleAction.removeFromBundle, + label: L10n.of(context).removeFromBundle, ), ], ); @@ -607,15 +848,14 @@ class ChatListController extends State with TickerProviderStateMixin { switch (action) { case EditBundleAction.addToBundle: final bundle = await showTextInputDialog( - context: context, - title: L10n.of(context)!.bundleName, - textFields: [ - DialogTextField(hintText: L10n.of(context)!.bundleName) - ]); - if (bundle == null || bundle.isEmpty || bundle.single.isEmpty) return; + context: context, + title: l10n.bundleName, + hintText: l10n.bundleName, + ); + if (bundle == null || bundle.isEmpty || bundle.isEmpty) return; await showFutureLoadingDialog( context: context, - future: () => client.setAccountBundle(bundle.single), + future: () => client.setAccountBundle(bundle), ); break; case EditBundleAction.removeFromBundle: @@ -650,20 +890,36 @@ class ChatListController extends State with TickerProviderStateMixin { } @override - Widget build(BuildContext context) { - Matrix.of(context).navigatorContext = context; - return ChatListView(this); - } + Widget build(BuildContext context) => ChatListView(this); void _hackyWebRTCFixForWeb() { - Matrix.of(context).voipPlugin?.context = context; + ChatList.contextForVoip = context; } - expandSpaces() { - snappingSheetController.snapToPosition( - const SnappingPosition.factor(positionFactor: 0.5), - ); + Future _checkTorBrowser() async { + if (!kIsWeb) return; + final isTor = await TorBrowserDetector.isTorBrowser; + isTorBrowser = isTor; } + + Future dehydrate() => Matrix.of(context).dehydrateAction(context); } enum EditBundleAction { addToBundle, removeFromBundle } + +enum InviteActions { + accept, + decline, + block, +} + +enum ChatContextAction { + open, + goToSpace, + favorite, + markUnread, + mute, + leave, + addToSpace, + block +} diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index ecab95ecff..8170732c20 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -1,405 +1,376 @@ -import 'dart:async'; - +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:animations/animations.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; -import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; -import 'package:fluffychat/pages/chat_list/stories_header.dart'; +import 'package:fluffychat/pages/chat_list/dummy_chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/pages/chat_list/space_view.dart'; +import 'package:fluffychat/pages/chat_list/status_msg_list.dart'; +import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/connection_status_header.dart'; -import 'package:fluffychat/widgets/profile_bottom_sheet.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/public_room_bottom_sheet.dart'; -import '../../utils/stream_extension.dart'; +import '../../config/themes.dart'; +import '../../widgets/connection_status_header.dart'; import '../../widgets/matrix.dart'; +import 'chat_list_header.dart'; -class ChatListViewBody extends StatefulWidget { +class ChatListViewBody extends StatelessWidget { final ChatListController controller; - const ChatListViewBody(this.controller, {Key? key}) : super(key: key); + const ChatListViewBody(this.controller, {super.key}); @override - State createState() => _ChatListViewBodyState(); -} - -class _ChatListViewBodyState extends State { - // the matrix sync stream - late StreamSubscription _subscription; + Widget build(BuildContext context) { + final theme = Theme.of(context); - // used to check the animation direction - String? _lastUserId; - SpacesEntry? _lastSpace; + final client = Matrix.of(context).client; + final activeSpace = controller.activeSpaceId; + if (activeSpace != null) { + return SpaceView( + key: ValueKey(activeSpace), + spaceId: activeSpace, + onBack: controller.clearActiveSpace, + onChatTab: (room) => controller.onChatTap(room), + onChatContext: (room, context) => + controller.chatContextAction(room, context), + activeChat: controller.activeChat, + toParentSpace: controller.setActiveSpace, + ); + } + final spaces = client.rooms.where((r) => r.isSpace); + final spaceDelegateCandidates = {}; + for (final space in spaces) { + for (final spaceChild in space.spaceChildren) { + final roomId = spaceChild.roomId; + if (roomId == null) continue; + spaceDelegateCandidates[roomId] = space; + } + } - @override - void initState() { - _subscription = Matrix.of(context) - .client - .onSync - .stream - .where((s) => s.hasRoomUpdate) - .rateLimit(const Duration(seconds: 1)) - .listen((d) => setState(() {})); - super.initState(); - } + final publicRooms = controller.roomSearchResult?.chunk + .where((room) => room.roomType != 'm.space') + .toList(); + final publicSpaces = controller.roomSearchResult?.chunk + .where((room) => room.roomType == 'm.space') + .toList(); + final userSearchResult = controller.userSearchResult; + const dummyChatCount = 4; + final filter = controller.searchController.text.toLowerCase(); + return StreamBuilder( + key: ValueKey( + client.userID.toString(), + ), + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final rooms = controller.filteredRooms; - @override - Widget build(BuildContext context) { - final reversed = !_animationReversed(); - final roomSearchResult = widget.controller.roomSearchResult; - final userSearchResult = widget.controller.userSearchResult; - Widget child; - if (widget.controller.waitForFirstSync && - Matrix.of(context).client.prevBatch != null) { - final rooms = widget.controller.activeSpacesEntry.getRooms(context); - if (rooms.isEmpty) { - child = Column( - key: const ValueKey(null), - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/private_chat_wallpaper.png', - width: 160, - height: 160, - ), - Center( - child: Text( - L10n.of(context)!.startYourFirstChat, - textAlign: TextAlign.start, - style: const TextStyle( - color: Colors.grey, - fontSize: 16, - ), - ), - ), - const SizedBox(height: 160), - ], - ); - } else { - final displayStoriesHeader = widget.controller.activeSpacesEntry - .shouldShowStoriesHeader(context); - child = ListView.builder( - key: ValueKey(Matrix.of(context).client.userID.toString() + - widget.controller.activeSpaceId.toString() + - widget.controller.activeSpacesEntry.runtimeType.toString()), - controller: widget.controller.scrollController, - // add +1 space below in order to properly scroll below the spaces bar - itemCount: rooms.length + (displayStoriesHeader ? 2 : 1), - itemBuilder: (BuildContext context, int i) { - if (displayStoriesHeader) { - if (i == 0) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - const ConnectionStatusHeader(), - if (roomSearchResult != null) ...[ - _SearchTitle( - title: L10n.of(context)!.publicRooms, - icon: Icons.explore_outlined, + return SafeArea( + child: CustomScrollView( + controller: controller.scrollController, + slivers: [ + ChatListHeader(controller: controller), + SliverList( + delegate: SliverChildListDelegate( + [ + if (controller.isSearchMode) ...[ + SearchTitle( + title: L10n.of(context).publicRooms, + icon: const Icon(Icons.explore_outlined), ), - AnimatedContainer( - height: roomSearchResult.chunk.isEmpty ? 0 : 106, - duration: const Duration(milliseconds: 250), - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: roomSearchResult.chunk.length, - itemBuilder: (context, i) => _SearchItem( - title: roomSearchResult.chunk[i].name ?? - roomSearchResult - .chunk[i].canonicalAlias?.localpart ?? - L10n.of(context)!.group, - avatar: roomSearchResult.chunk[i].avatarUrl, - onPressed: () => showModalBottomSheet( - context: context, - builder: (c) => PublicRoomBottomSheet( - roomAlias: - roomSearchResult.chunk[i].canonicalAlias ?? - roomSearchResult.chunk[i].roomId, - outerContext: context, - chunk: roomSearchResult.chunk[i], - ), - ), - ), - ), + PublicRoomsHorizontalList(publicRooms: publicRooms), + SearchTitle( + title: L10n.of(context).publicSpaces, + icon: const Icon(Icons.workspaces_outlined), ), - ], - if (userSearchResult != null) ...[ - _SearchTitle( - title: L10n.of(context)!.users, - icon: Icons.group_outlined, + PublicRoomsHorizontalList(publicRooms: publicSpaces), + SearchTitle( + title: L10n.of(context).users, + icon: const Icon(Icons.group_outlined), ), AnimatedContainer( - height: userSearchResult.results.isEmpty ? 0 : 106, - duration: const Duration(milliseconds: 250), clipBehavior: Clip.hardEdge, decoration: const BoxDecoration(), - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: userSearchResult.results.length, - itemBuilder: (context, i) => _SearchItem( - title: userSearchResult.results[i].displayName ?? - userSearchResult.results[i].userId.localpart ?? - L10n.of(context)!.unknownDevice, - avatar: userSearchResult.results[i].avatarUrl, - onPressed: () => showModalBottomSheet( - context: context, - builder: (c) => ProfileBottomSheet( - userId: userSearchResult.results[i].userId, - outerContext: context, + height: userSearchResult == null || + userSearchResult.results.isEmpty + ? 0 + : 106, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: userSearchResult == null + ? null + : ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: userSearchResult.results.length, + itemBuilder: (context, i) => _SearchItem( + title: + userSearchResult.results[i].displayName ?? + userSearchResult + .results[i].userId.localpart ?? + L10n.of(context).unknownDevice, + avatar: userSearchResult.results[i].avatarUrl, + onPressed: () => showAdaptiveBottomSheet( + context: context, + builder: (c) => UserBottomSheet( + profile: userSearchResult.results[i], + outerContext: context, + ), + ), + ), ), - ), - ), - ), ), ], - if (widget.controller.isSearchMode) - _SearchTitle( - title: L10n.of(context)!.stories, - icon: Icons.camera_alt_outlined, + if (!controller.isSearchMode && AppConfig.showPresences) + GestureDetector( + onLongPress: () => controller.dismissStatusList(), + child: StatusMessageList( + onStatusEdit: controller.setStatus, + ), ), - StoriesHeader( - filter: widget.controller.searchController.text, - ), + const ConnectionStatusHeader(), AnimatedContainer( - height: !widget.controller.isSearchMode && - widget.controller.showChatBackupBanner - ? 54 - : 0, - duration: const Duration(milliseconds: 300), + height: controller.isTorBrowser ? 64 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, clipBehavior: Clip.hardEdge, - curve: Curves.bounceInOut, decoration: const BoxDecoration(), child: Material( - color: Theme.of(context).colorScheme.surface, + color: theme.colorScheme.surface, child: ListTile( - leading: CircleAvatar( - radius: Avatar.defaultSize / 2, - child: - const Icon(Icons.enhanced_encryption_outlined), - backgroundColor: Theme.of(context) - .colorScheme - .secondaryContainer, - foregroundColor: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - title: Text( - (Matrix.of(context) - .client - .encryption - ?.keyManager - .enabled == - true) - ? L10n.of(context)!.unlockOldMessages - : L10n.of(context)!.enableAutoBackups, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurface, - ), - ), + leading: const Icon(Icons.vpn_key), + title: Text(L10n.of(context).dehydrateTor), + subtitle: Text(L10n.of(context).dehydrateTorLong), trailing: const Icon(Icons.chevron_right_outlined), - onTap: widget.controller.firstRunBootstrapAction, + onTap: controller.dehydrate, ), ), ), - if (widget.controller.isSearchMode) - _SearchTitle( - title: L10n.of(context)!.chats, - icon: Icons.chat_outlined, + if (client.rooms.isNotEmpty && !controller.isSearchMode) + SizedBox( + height: 64, + child: ListView( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 16.0, + ), + shrinkWrap: true, + scrollDirection: Axis.horizontal, + children: [ + if (AppConfig.separateChatTypes) + ActiveFilter.messages + else + ActiveFilter.allChats, + ActiveFilter.groups, + ActiveFilter.unread, + if (spaceDelegateCandidates.isNotEmpty && + !controller.widget.displayNavigationRail) + ActiveFilter.spaces, + ] + .map( + (filter) => Padding( + padding: + const EdgeInsets.symmetric(horizontal: 4), + child: HoverBuilder( + builder: (context, hovered) => + AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered ? 1.1 : 1.0, + child: InkWell( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + onTap: () => + controller.setActiveFilter(filter), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: filter == + controller.activeFilter + ? theme.colorScheme.primary + : theme.colorScheme + .secondaryContainer, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + alignment: Alignment.center, + child: Text( + filter.toLocalizedString(context), + style: TextStyle( + fontWeight: filter == + controller.activeFilter + ? FontWeight.bold + : FontWeight.normal, + color: filter == + controller.activeFilter + ? theme.colorScheme.onPrimary + : theme.colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ), + ), + ) + .toList(), + ), + ), + if (controller.isSearchMode) + SearchTitle( + title: L10n.of(context).chats, + icon: const Icon(Icons.forum_outlined), ), + if (client.prevBatch != null && + rooms.isEmpty && + !controller.isSearchMode) ...[ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + alignment: Alignment.center, + children: [ + const Column( + mainAxisSize: MainAxisSize.min, + children: [ + DummyChatListItem( + opacity: 0.5, + animate: false, + ), + DummyChatListItem( + opacity: 0.3, + animate: false, + ), + ], + ), + Icon( + CupertinoIcons.chat_bubble_text_fill, + size: 128, + color: theme.colorScheme.secondary, + ), + ], + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + client.rooms.isEmpty + ? L10n.of(context).noChatsFoundHere + : L10n.of(context).noMoreChatsFound, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: theme.colorScheme.secondary, + ), + ), + ), + ], + ), + ], ], - ); - } - i--; - } - if (i >= rooms.length) { - return const ListTile(); - } - if (!rooms[i].displayname.toLowerCase().contains( - widget.controller.searchController.text.toLowerCase())) { - return Container(); - } - return ChatListItem( - rooms[i], - selected: widget.controller.selectedRoomIds.contains(rooms[i].id), - onTap: widget.controller.selectMode == SelectMode.select - ? () => widget.controller.toggleSelection(rooms[i].id) - : null, - onLongPress: () => widget.controller.toggleSelection(rooms[i].id), - activeChat: widget.controller.activeChat == rooms[i].id, - ); - }, - ); - } - } else { - const dummyChatCount = 5; - final titleColor = - Theme.of(context).textTheme.bodyText1!.color!.withAlpha(100); - final subtitleColor = - Theme.of(context).textTheme.bodyText1!.color!.withAlpha(50); - child = ListView.builder( - itemCount: dummyChatCount, - itemBuilder: (context, i) => Opacity( - opacity: (dummyChatCount - i) / dummyChatCount, - child: ListTile( - leading: CircleAvatar( - backgroundColor: titleColor, - child: CircularProgressIndicator( - strokeWidth: 1, - color: Theme.of(context).textTheme.bodyText1!.color, + ), ), - ), - title: Row( - children: [ - Expanded( - child: Container( - height: 14, - decoration: BoxDecoration( - color: titleColor, - borderRadius: BorderRadius.circular(3), + if (client.prevBatch == null) + SliverList( + delegate: SliverChildBuilderDelegate( + (context, i) => DummyChatListItem( + opacity: (dummyChatCount - i) / dummyChatCount, + animate: true, ), + childCount: dummyChatCount, ), ), - const SizedBox(width: 36), - Container( - height: 14, - width: 14, - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(14), - ), + if (client.prevBatch != null) + SliverList.builder( + itemCount: rooms.length, + itemBuilder: (BuildContext context, int i) { + final room = rooms[i]; + final space = spaceDelegateCandidates[room.id]; + return ChatListItem( + room, + space: space, + key: Key('chat_list_item_${room.id}'), + filter: filter, + onTap: () => controller.onChatTap(room), + onLongPress: (context) => + controller.chatContextAction(room, context, space), + activeChat: controller.activeChat == room.id, + ); + }, ), - const SizedBox(width: 12), - Container( - height: 14, - width: 14, - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(14), - ), - ), - ], - ), - subtitle: Container( - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(3), - ), - height: 12, - margin: const EdgeInsets.only(right: 22), - ), + ], ), - ), - ); - } - return PageTransitionSwitcher( - reverse: reversed, - transitionBuilder: ( - Widget child, - Animation primaryAnimation, - Animation secondaryAnimation, - ) { - return SharedAxisTransition( - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - transitionType: SharedAxisTransitionType.vertical, - fillColor: Theme.of(context).scaffoldBackgroundColor, - child: child, ); }, - child: child, ); } - - @override - void dispose() { - _subscription.cancel(); - super.dispose(); - } - - bool _animationReversed() { - bool reversed; - // in case the matrix id changes, check the indexOf the matrix id - final newClient = Matrix.of(context).client; - if (_lastUserId != newClient.userID) { - reversed = Matrix.of(context) - .currentBundle! - .indexWhere((element) => element!.userID == _lastUserId) < - Matrix.of(context) - .currentBundle! - .indexWhere((element) => element!.userID == newClient.userID); - } - // otherwise, the space changed... - else { - reversed = widget.controller.spacesEntries - .indexWhere((element) => element == _lastSpace) < - widget.controller.spacesEntries.indexWhere( - (element) => element == widget.controller.activeSpacesEntry); - } - _lastUserId = newClient.userID; - _lastSpace = widget.controller.activeSpacesEntry; - return reversed; - } } -class _SearchTitle extends StatelessWidget { - final String title; - final IconData icon; - const _SearchTitle({ - required this.title, - required this.icon, - Key? key, - }) : super(key: key); +class PublicRoomsHorizontalList extends StatelessWidget { + const PublicRoomsHorizontalList({ + super.key, + required this.publicRooms, + }); + + final List? publicRooms; @override - Widget build(BuildContext context) => Container( - decoration: BoxDecoration( - border: Border.symmetric( - horizontal: BorderSide( - color: Theme.of(context).dividerColor, - width: 1, - )), - color: Theme.of(context).colorScheme.surface, - ), - child: Align( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8, - ), - child: Row( - children: [ - Icon(icon, size: 16), - const SizedBox(width: 16), - Text(title, - textAlign: TextAlign.left, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurface, - fontSize: 12, - fontWeight: FontWeight.bold, - )), - ], + Widget build(BuildContext context) { + final publicRooms = this.publicRooms; + return AnimatedContainer( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: publicRooms == null || publicRooms.isEmpty ? 0 : 106, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: publicRooms == null + ? null + : ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: publicRooms.length, + itemBuilder: (context, i) => _SearchItem( + title: publicRooms[i].name ?? + publicRooms[i].canonicalAlias?.localpart ?? + L10n.of(context).group, + avatar: publicRooms[i].avatarUrl, + onPressed: () => showAdaptiveBottomSheet( + context: context, + builder: (c) => PublicRoomBottomSheet( + roomAlias: + publicRooms[i].canonicalAlias ?? publicRooms[i].roomId, + outerContext: context, + chunk: publicRooms[i], + ), + ), + ), ), - ), - ), - ); + ); + } } class _SearchItem extends StatelessWidget { final String title; final Uri? avatar; final void Function() onPressed; + const _SearchItem({ required this.title, this.avatar, required this.onPressed, - Key? key, - }) : super(key: key); + }); @override Widget build(BuildContext context) => InkWell( @@ -420,6 +391,7 @@ class _SearchItem extends StatelessWidget { title, maxLines: 2, textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 12, ), diff --git a/lib/pages/chat_list/chat_list_drawer.dart b/lib/pages/chat_list/chat_list_drawer.dart deleted file mode 100644 index 73242d4b8c..0000000000 --- a/lib/pages/chat_list/chat_list_drawer.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/pages/chat_list/spaces_drawer.dart'; -import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../config/app_config.dart'; - -class ChatListDrawer extends StatelessWidget { - final ChatListController controller; - const ChatListDrawer(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) => Drawer( - child: SafeArea( - child: Column( - children: [ - ListTile( - leading: const CircleAvatar( - radius: Avatar.defaultSize / 2, - backgroundImage: AssetImage('assets/logo.png'), - ), - title: Text(AppConfig.applicationName), - ), - const Divider(thickness: 1), - Expanded( - child: SpacesDrawer( - controller: controller, - ), - ), - const Divider(thickness: 1), - ListTile( - leading: Icon( - Icons.group_add_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.createNewGroup), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/newgroup'); - }, - ), - ListTile( - leading: Icon( - Icons.group_work_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.createNewSpace), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/newspace'); - }, - ), - ListTile( - leading: Icon( - Icons.adaptive.share_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.inviteContact), - onTap: () { - Scaffold.of(context).closeDrawer(); - FluffyShare.share( - L10n.of(context)!.inviteText( - Matrix.of(context).client.userID!, - 'https://matrix.to/#/${Matrix.of(context).client.userID}?client=im.fluffychat'), - context); - }, - ), - ListTile( - leading: Icon( - Icons.settings_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.settings), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/settings'); - }, - ), - ], - ), - ), - ); -} diff --git a/lib/pages/chat_list/chat_list_header.dart b/lib/pages/chat_list/chat_list_header.dart index a66d78af21..2c300cfcc4 100644 --- a/lib/pages/chat_list/chat_list_header.dart +++ b/lib/pages/chat_list/chat_list_header.dart @@ -1,150 +1,104 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/client_chooser_button.dart'; -import 'package:fluffychat/widgets/matrix.dart'; +import '../../widgets/matrix.dart'; class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { final ChatListController controller; + final bool globalSearch; - const ChatListHeader({Key? key, required this.controller}) : super(key: key); + const ChatListHeader({ + super.key, + required this.controller, + this.globalSearch = true, + }); @override Widget build(BuildContext context) { - final selectMode = controller.selectMode; + final theme = Theme.of(context); - return AppBar( + return SliverAppBar( + floating: true, + toolbarHeight: 72, + pinned: FluffyThemes.isColumnMode(context), + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, automaticallyImplyLeading: false, - leading: selectMode == SelectMode.normal - ? null - : IconButton( - tooltip: L10n.of(context)!.cancel, - icon: const Icon(Icons.close_outlined), - onPressed: controller.cancelAction, - color: Theme.of(context).colorScheme.primary, - ), - title: selectMode == SelectMode.share - ? Text( - L10n.of(context)!.share, - key: const ValueKey(SelectMode.share), - ) - : selectMode == SelectMode.select - ? Text( - controller.selectedRoomIds.length.toString(), - key: const ValueKey(SelectMode.select), + title: TextField( + controller: controller.searchController, + focusNode: controller.searchFocusNode, + textInputAction: TextInputAction.search, + onChanged: (text) => controller.onSearchEnter( + text, + globalSearch: globalSearch, + ), + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).searchChatsRooms, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: controller.isSearchMode + ? IconButton( + tooltip: L10n.of(context).cancel, + icon: const Icon(Icons.close_outlined), + onPressed: controller.cancelSearch, + color: theme.colorScheme.onPrimaryContainer, ) - : SizedBox( - height: 44, - child: TextField( - controller: controller.searchController, - textInputAction: TextInputAction.search, - onChanged: controller.onSearchEnter, - decoration: InputDecoration( - fillColor: Theme.of(context).colorScheme.surfaceVariant, - contentPadding: EdgeInsets.zero, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(90), - borderSide: BorderSide.none, + : IconButton( + onPressed: controller.startSearch, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + suffixIcon: controller.isSearchMode && globalSearch + ? controller.isSearching + ? const Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 12, ), - hintText: controller.activeSpacesEntry.getName(context), - prefixIcon: controller.isSearchMode - ? IconButton( - tooltip: L10n.of(context)!.cancel, - icon: const Icon(Icons.close_outlined), - onPressed: controller.cancelSearch, - color: Theme.of(context).colorScheme.primary, - ) - : IconButton( - onPressed: Scaffold.of(context).openDrawer, - icon: Icon( - Icons.menu, - color: - Theme.of(context).colorScheme.onBackground, - ), - ), - suffixIcon: Row( - mainAxisSize: MainAxisSize.min, - children: controller.isSearchMode - ? [ - if (controller.isSearching) - const CircularProgressIndicator.adaptive( - strokeWidth: 2, - ), - TextButton( - onPressed: controller.setServer, - style: TextButton.styleFrom( - textStyle: const TextStyle(fontSize: 12), - ), - child: Text( - controller.searchServer ?? - Matrix.of(context) - .client - .homeserver! - .host, - maxLines: 2, - ), - ), - ] - : [ - IconButton( - icon: Icon( - Icons.camera_alt_outlined, - color: Theme.of(context) - .colorScheme - .onBackground, - ), - tooltip: L10n.of(context)!.addToStory, - onPressed: () => - VRouter.of(context).to('/stories/create'), - ), - ClientChooserButton(controller), - const SizedBox(width: 12), - ], + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), ), - ), - ), + ) + : TextButton.icon( + onPressed: controller.setServer, + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(99), + ), + textStyle: const TextStyle(fontSize: 12), + ), + icon: const Icon(Icons.edit_outlined, size: 16), + label: Text( + controller.searchServer ?? + Matrix.of(context).client.homeserver!.host, + maxLines: 2, + ), + ) + : SizedBox( + width: 0, + child: ClientChooserButton(controller), ), - actions: selectMode == SelectMode.share - ? null - : selectMode == SelectMode.select - ? [ - if (controller.spaces.isNotEmpty) - IconButton( - tooltip: L10n.of(context)!.addToSpace, - icon: const Icon(Icons.group_work_outlined), - onPressed: controller.addOrRemoveToSpace, - ), - IconButton( - tooltip: L10n.of(context)!.toggleUnread, - icon: Icon(controller.anySelectedRoomNotMarkedUnread - ? Icons.mark_chat_read_outlined - : Icons.mark_chat_unread_outlined), - onPressed: controller.toggleUnread, - ), - IconButton( - tooltip: L10n.of(context)!.toggleFavorite, - icon: Icon(controller.anySelectedRoomNotFavorite - ? Icons.push_pin_outlined - : Icons.push_pin), - onPressed: controller.toggleFavouriteRoom, - ), - IconButton( - icon: Icon(controller.anySelectedRoomNotMuted - ? Icons.notifications_off_outlined - : Icons.notifications_outlined), - tooltip: L10n.of(context)!.toggleMuted, - onPressed: controller.toggleMuted, - ), - IconButton( - icon: const Icon(Icons.delete_outlined), - tooltip: L10n.of(context)!.archive, - onPressed: controller.archiveAction, - ), - ] - : null, + ), + ), ); } diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index f7cbded325..a77307f52e 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -1,344 +1,412 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; -import 'package:pedantic/pedantic.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/room_status_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import '../../config/themes.dart'; import '../../utils/date_time_extension.dart'; import '../../widgets/avatar.dart'; -import '../../widgets/matrix.dart'; -import '../chat/send_file_dialog.dart'; enum ArchivedRoomAction { delete, rejoin } class ChatListItem extends StatelessWidget { final Room room; + final Room? space; final bool activeChat; - final bool selected; - final Function? onForget; - final Function? onTap; - final Function? onLongPress; + final void Function(BuildContext context)? onLongPress; + final void Function()? onForget; + final void Function() onTap; + final String? filter; const ChatListItem( this.room, { this.activeChat = false, - this.selected = false, - this.onTap, + required this.onTap, this.onLongPress, this.onForget, - Key? key, - }) : super(key: key); + this.filter, + this.space, + super.key, + }); - dynamic clickAction(BuildContext context) async { - if (onTap != null) return onTap!(); - if (!activeChat) { - if (room.membership == Membership.invite && - (await showFutureLoadingDialog( - context: context, - future: () async { - final joinedFuture = room.client.onSync.stream - .where((u) => - u.rooms?.join?.containsKey(room.id) ?? false) - .first; - await room.join(); - await joinedFuture; - })) - .error != - null) { - return; - } - - if (room.membership == Membership.ban) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.youHaveBeenBannedFromThisChat), - ), - ); - return; - } - - if (room.membership == Membership.leave) { - final action = await showModalActionSheet( - context: context, - title: L10n.of(context)!.archivedRoom, - message: L10n.of(context)!.thisRoomHasBeenArchived, - actions: [ - SheetAction( - label: L10n.of(context)!.rejoin, - key: ArchivedRoomAction.rejoin, - ), - SheetAction( - label: L10n.of(context)!.delete, - key: ArchivedRoomAction.delete, - isDestructiveAction: true, - ), - ], - ); - if (action != null) { - switch (action) { - case ArchivedRoomAction.delete: - await archiveAction(context); - break; - case ArchivedRoomAction.rejoin: - await showFutureLoadingDialog( - context: context, - future: () => room.join(), - ); - break; - } - } - } - - if (room.membership == Membership.join) { - if (Matrix.of(context).shareContent != null) { - if (Matrix.of(context).shareContent!['msgtype'] == - 'chat.fluffy.shared_file') { - await showDialog( - context: context, - useRootNavigator: false, - builder: (c) => SendFileDialog( - file: Matrix.of(context).shareContent!['file'], - room: room, - ), - ); - } else { - unawaited(room.sendEvent(Matrix.of(context).shareContent!)); - } - Matrix.of(context).shareContent = null; - } - VRouter.of(context).toSegments(['rooms', room.id]); - } - } - } - - Future archiveAction(BuildContext context) async { + Future archiveAction(BuildContext context) async { { if ([Membership.leave, Membership.ban].contains(room.membership)) { - final success = await showFutureLoadingDialog( + final forgetResult = await showFutureLoadingDialog( context: context, future: () => room.forget(), ); - if (success.error == null) { - if (onForget != null) onForget!(); - } - return; + return forgetResult.isValue; } final confirmed = await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.no, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).archiveRoomDescription, + isDestructive: true, ); - if (confirmed == OkCancelResult.cancel) return; - await showFutureLoadingDialog( - context: context, future: () => room.leave()); - return; + if (confirmed != OkCancelResult.ok) return false; + final leaveResult = await showFutureLoadingDialog( + context: context, + future: () => room.leave(), + ); + return leaveResult.isValue; } } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final isMuted = room.pushRuleState != PushRuleState.notify; final typingText = room.getLocalizedTypingText(context); - final ownMessage = - room.lastEvent?.senderId == Matrix.of(context).client.userID; + final lastEvent = room.lastEvent; + final ownMessage = lastEvent?.senderId == room.client.userID; final unread = room.isUnread || room.membership == Membership.invite; + final directChatMatrixId = room.directChatMatrixID; + final isDirectChat = directChatMatrixId != null; final unreadBubbleSize = unread || room.hasNewMessages ? room.notificationCount > 0 ? 20.0 : 14.0 : 0.0; - return Material( - color: selected - ? Theme.of(context).colorScheme.primaryContainer - : activeChat - ? Theme.of(context).colorScheme.secondaryContainer - : Colors.transparent, - child: ListTile( - selected: selected || activeChat, - onLongPress: onLongPress as void Function()?, - leading: selected - ? SizedBox( - width: Avatar.defaultSize, - height: Avatar.defaultSize, - child: Material( - color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.circular(Avatar.defaultSize), - child: const Icon(Icons.check, color: Colors.white), - ), - ) - : Avatar( - mxContent: room.avatar, - name: room.displayname, - onTap: onLongPress as void Function()?, - ), - title: Row( - children: [ - Expanded( - child: Text( - room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - maxLines: 1, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.bold, - color: unread - ? Theme.of(context).colorScheme.secondary - : Theme.of(context).textTheme.bodyText1!.color, - ), - ), - ), - if (isMuted) - const Padding( - padding: EdgeInsets.only(left: 4.0), - child: Icon( - Icons.notifications_off_outlined, - size: 16, - ), - ), - if (room.isFavourite) - Padding( - padding: EdgeInsets.only( - right: room.notificationCount > 0 ? 4.0 : 0.0), - child: Icon( - Icons.push_pin_outlined, - size: 16, - color: Theme.of(context).colorScheme.secondary, + final hasNotifications = room.notificationCount > 0; + final backgroundColor = + activeChat ? theme.colorScheme.secondaryContainer : null; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final filter = this.filter; + if (filter != null && !displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } + + final needLastEventSender = lastEvent == null + ? false + : room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; + final space = this.space; + + return Dismissible( + key: ValueKey(room.id), + confirmDismiss: (_) => archiveAction(context), + onDismissed: (_) { + // Empty dismissed callback to trigger the dismiss animation + }, + background: Material( + color: theme.colorScheme.errorContainer, + child: Icon( + Icons.archive_outlined, + color: theme.colorScheme.onErrorContainer, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + color: backgroundColor, + child: FutureBuilder( + future: room.loadHeroUsers(), + builder: (context, snapshot) => HoverBuilder( + builder: (context, listTileHovered) => ListTile( + visualDensity: const VisualDensity(vertical: -0.5), + contentPadding: const EdgeInsets.symmetric(horizontal: 8), + onLongPress: () => onLongPress?.call(context), + leading: HoverBuilder( + builder: (context, hovered) => AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered ? 1.1 : 1.0, + child: SizedBox( + width: Avatar.defaultSize, + height: Avatar.defaultSize, + child: Stack( + children: [ + if (space != null) + Positioned( + top: 0, + left: 0, + child: Avatar( + border: BorderSide( + width: 2, + color: backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 4, + ), + mxContent: space.avatar, + size: Avatar.defaultSize * 0.75, + name: space.getLocalizedDisplayname(), + onTap: () => onLongPress?.call(context), + ), + ), + Positioned( + bottom: 0, + right: 0, + child: Avatar( + border: space == null + ? room.isSpace + ? BorderSide( + width: 1, + color: theme.dividerColor, + ) + : null + : BorderSide( + width: 2, + color: backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: room.isSpace + ? BorderRadius.circular( + AppConfig.borderRadius / 4, + ) + : null, + mxContent: room.avatar, + size: space != null + ? Avatar.defaultSize * 0.75 + : Avatar.defaultSize, + name: displayname, + presenceUserId: directChatMatrixId, + presenceBackgroundColor: backgroundColor, + onTap: () => onLongPress?.call(context), + ), + ), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () => onLongPress?.call(context), + child: AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: listTileHovered ? 1.0 : 0.0, + child: Material( + color: backgroundColor, + borderRadius: BorderRadius.circular(16), + child: const Icon( + Icons.arrow_drop_down_circle_outlined, + size: 18, + ), + ), + ), + ), + ), + ], + ), + ), + ), ), - ), - Padding( - padding: const EdgeInsets.only(left: 4.0), - child: Text( - room.timeCreated.localizedTimeShort(context), - style: TextStyle( - fontSize: 13, - color: unread - ? Theme.of(context).colorScheme.secondary - : Theme.of(context).textTheme.bodyText2!.color, + title: Row( + children: [ + Expanded( + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: unread || room.hasNewMessages + ? const TextStyle(fontWeight: FontWeight.bold) + : null, + ), + ), + if (isMuted) + const Padding( + padding: EdgeInsets.only(left: 4.0), + child: Icon( + Icons.notifications_off_outlined, + size: 16, + ), + ), + if (room.isFavourite || + room.membership == Membership.invite) + Padding( + padding: EdgeInsets.only( + right: hasNotifications ? 4.0 : 0.0, + ), + child: Icon( + Icons.push_pin, + size: 16, + color: theme.colorScheme.primary, + ), + ), + if (!room.isSpace && + lastEvent != null && + room.membership != Membership.invite) + Padding( + padding: const EdgeInsets.only(left: 4.0), + child: Text( + lastEvent.originServerTs.localizedTimeShort(context), + style: TextStyle( + fontSize: 13, + color: unread + ? theme.colorScheme.secondary + : theme.textTheme.bodyMedium!.color, + ), + ), + ), + ], ), - ), - ), - ], - ), - subtitle: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (typingText.isEmpty && - ownMessage && - room.lastEvent!.status.isSending) ...[ - const SizedBox( - width: 16, - height: 16, - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ), - const SizedBox(width: 4), - ], - AnimatedContainer( - width: typingText.isEmpty ? 0 : 18, - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - duration: const Duration(milliseconds: 300), - curve: Curves.bounceInOut, - padding: const EdgeInsets.only(right: 4), - child: Icon( - Icons.edit_outlined, - color: Theme.of(context).colorScheme.secondary, - size: 14, - ), - ), - Expanded( - child: typingText.isNotEmpty - ? Text( - typingText, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + subtitle: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (typingText.isEmpty && + ownMessage && + room.lastEvent!.status.isSending) ...[ + const SizedBox( + width: 16, + height: 16, + child: + CircularProgressIndicator.adaptive(strokeWidth: 2), ), - softWrap: false, - ) - : FutureBuilder( - future: room.lastEvent?.calcLocalizedBody( - MatrixLocals(L10n.of(context)!), - hideReply: true, - hideEdit: true, - plaintextBody: true, - removeMarkdown: true, - withSenderNamePrefix: !room.isDirectChat || - room.directChatMatrixID != - room.lastEvent?.senderId, - ) ?? - Future.value(L10n.of(context)!.emptyChat), - builder: (context, snapshot) { - return Text( - room.membership == Membership.invite - ? L10n.of(context)!.youAreInvitedToThisChat - : snapshot.data ?? - room.lastEvent?.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), + const SizedBox(width: 4), + ], + AnimatedContainer( + width: typingText.isEmpty ? 0 : 18, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + padding: const EdgeInsets.only(right: 4), + child: Icon( + Icons.edit_outlined, + color: theme.colorScheme.secondary, + size: 14, + ), + ), + Expanded( + child: room.isSpace && room.membership == Membership.join + ? Text( + L10n.of(context).countChatsAndCountParticipants( + room.spaceChildren.length.toString(), + (room.summary.mJoinedMemberCount ?? 1) + .toString(), + ), + ) + : typingText.isNotEmpty + ? Text( + typingText, + style: TextStyle( + color: theme.colorScheme.primary, + ), + maxLines: 1, + softWrap: false, + ) + : FutureBuilder( + key: ValueKey( + '${lastEvent?.eventId}_${lastEvent?.type}', + ), + future: needLastEventSender + ? lastEvent.calcLocalizedBody( + MatrixLocals(L10n.of(context)), + hideReply: true, + hideEdit: true, + plaintextBody: true, + removeMarkdown: true, + withSenderNamePrefix: + (!isDirectChat || + directChatMatrixId != + room.lastEvent?.senderId), + ) + : null, + initialData: + lastEvent?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), hideReply: true, hideEdit: true, plaintextBody: true, removeMarkdown: true, - withSenderNamePrefix: !room.isDirectChat || - room.directChatMatrixID != - room.lastEvent?.senderId, - ) ?? - L10n.of(context)!.emptyChat, - softWrap: false, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: unread - ? Theme.of(context).colorScheme.secondary - : Theme.of(context).textTheme.bodyText2!.color, - decoration: room.lastEvent?.redacted == true - ? TextDecoration.lineThrough - : null, - ), - ); - }), - ), - const SizedBox(width: 8), - AnimatedContainer( - duration: const Duration(milliseconds: 300), - curve: Curves.bounceInOut, - padding: const EdgeInsets.symmetric(horizontal: 7), - height: unreadBubbleSize, - width: - room.notificationCount == 0 && !unread && !room.hasNewMessages - ? 0 - : (unreadBubbleSize - 9) * - room.notificationCount.toString().length + - 9, - decoration: BoxDecoration( - color: room.highlightCount > 0 - ? Colors.red - : room.notificationCount > 0 - ? Theme.of(context).primaryColor - : Theme.of(context).primaryColor.withAlpha(100), - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - ), - child: Center( - child: room.notificationCount > 0 - ? Text( - room.notificationCount.toString(), - style: const TextStyle( - color: Colors.white, - fontSize: 13, - ), - ) - : Container(), + withSenderNamePrefix: (!isDirectChat || + directChatMatrixId != + room.lastEvent?.senderId), + ), + builder: (context, snapshot) => Text( + room.membership == Membership.invite + ? isDirectChat + ? L10n.of(context).invitePrivateChat + : L10n.of(context).inviteGroupChat + : snapshot.data ?? + L10n.of(context).emptyChat, + softWrap: false, + maxLines: + room.notificationCount >= 1 ? 2 : 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: unread || room.hasNewMessages + ? FontWeight.bold + : null, + color: theme.colorScheme.onSurfaceVariant, + decoration: + room.lastEvent?.redacted == true + ? TextDecoration.lineThrough + : null, + ), + ), + ), + ), + const SizedBox(width: 8), + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + padding: const EdgeInsets.symmetric(horizontal: 7), + height: unreadBubbleSize, + width: + !hasNotifications && !unread && !room.hasNewMessages + ? 0 + : (unreadBubbleSize - 9) * + room.notificationCount.toString().length + + 9, + decoration: BoxDecoration( + color: room.highlightCount > 0 || + room.membership == Membership.invite + ? Colors.red + : hasNotifications || room.markedUnread + ? theme.colorScheme.primary + : theme.colorScheme.primaryContainer, + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + ), + child: Center( + child: hasNotifications + ? Text( + room.notificationCount.toString(), + style: TextStyle( + color: room.highlightCount > 0 + ? Colors.white + : hasNotifications + ? theme.colorScheme.onPrimary + : theme + .colorScheme.onPrimaryContainer, + fontSize: 13, + ), + ) + : const SizedBox.shrink(), + ), + ), + ], + ), + onTap: onTap, + trailing: onForget == null + ? null + : IconButton( + icon: const Icon(Icons.delete_outlined), + onPressed: onForget, + ), ), ), - ], + ), ), - onTap: () => clickAction(context), ), ); } diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index d7881af1df..aecb98c150 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -1,70 +1,145 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/pages/chat_list/chat_list_drawer.dart'; +import 'package:fluffychat/pages/chat_list/navi_rail_item.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import '../../widgets/matrix.dart'; import 'chat_list_body.dart'; -import 'chat_list_header.dart'; class ChatListView extends StatelessWidget { final ChatListController controller; - const ChatListView(this.controller, {Key? key}) : super(key: key); + const ChatListView(this.controller, {super.key}); @override Widget build(BuildContext context) { - return StreamBuilder( - stream: Matrix.of(context).onShareContentChanged.stream, - builder: (_, __) { - final selectMode = controller.selectMode; - return VWidgetGuard( - onSystemPop: (redirector) async { - final selMode = controller.selectMode; - if (selMode != SelectMode.normal) controller.cancelAction(); - if (selMode == SelectMode.select) redirector.stopRedirection(); - }, - child: Scaffold( - appBar: ChatListHeader(controller: controller), - body: ChatListViewBody(controller), - drawer: ChatListDrawer(controller), - floatingActionButton: selectMode == SelectMode.normal - ? KeyBoardShortcuts( - child: FloatingActionButton.extended( - isExtended: controller.scrolledToTop, - backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Theme.of(context).colorScheme.onPrimary, - onPressed: () => - VRouter.of(context).to('/newprivatechat'), - icon: const Icon(CupertinoIcons.chat_bubble), - label: Text(L10n.of(context)!.newChat), - ), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.keyN + final client = Matrix.of(context).client; + return PopScope( + canPop: !controller.isSearchMode && controller.activeSpaceId == null, + onPopInvokedWithResult: (pop, _) { + if (pop) return; + if (controller.activeSpaceId != null) { + controller.clearActiveSpace(); + return; + } + if (controller.isSearchMode) { + controller.cancelSearch(); + return; + } + }, + child: Row( + children: [ + if (FluffyThemes.isColumnMode(context) && + controller.widget.displayNavigationRail) ...[ + StreamBuilder( + key: ValueKey( + client.userID.toString(), + ), + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final allSpaces = Matrix.of(context) + .client + .rooms + .where((room) => room.isSpace); + final rootSpaces = allSpaces + .where( + (space) => !allSpaces.any( + (parentSpace) => parentSpace.spaceChildren + .any((child) => child.roomId == space.id), + ), + ) + .toList(); + + return SizedBox( + width: FluffyThemes.navRailWidth, + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: rootSpaces.length + 2, + itemBuilder: (context, i) { + if (i == 0) { + return NaviRailItem( + isSelected: controller.activeSpaceId == null, + onTap: controller.clearActiveSpace, + icon: const Icon(Icons.forum_outlined), + selectedIcon: const Icon(Icons.forum), + toolTip: L10n.of(context).chats, + unreadBadgeFilter: (room) => true, + ); + } + i--; + if (i == rootSpaces.length) { + return NaviRailItem( + isSelected: false, + onTap: () => context.go('/rooms/newspace'), + icon: const Icon(Icons.add), + toolTip: L10n.of(context).createNewSpace, + ); + } + final space = rootSpaces[i]; + final displayname = rootSpaces[i].getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final spaceChildrenIds = + space.spaceChildren.map((c) => c.roomId).toSet(); + return NaviRailItem( + toolTip: displayname, + isSelected: controller.activeSpaceId == space.id, + onTap: () => + controller.setActiveSpace(rootSpaces[i].id), + unreadBadgeFilter: (room) => + spaceChildrenIds.contains(room.id), + icon: Avatar( + mxContent: rootSpaces[i].avatar, + name: displayname, + size: 32, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 4, + ), + ), + ); }, - onKeysPressed: () => - VRouter.of(context).to('/newprivatechat'), - helpLabel: L10n.of(context)!.newChat, - ) - : null, + ), + ); + }, + ), + Container( + color: Theme.of(context).dividerColor, + width: 1, + ), + ], + Expanded( + child: GestureDetector( + onTap: FocusManager.instance.primaryFocus?.unfocus, + excludeFromSemantics: true, + behavior: HitTestBehavior.translucent, + child: Scaffold( + body: ChatListViewBody(controller), + floatingActionButton: !controller.isSearchMode && + controller.activeSpaceId == null + ? FloatingActionButton.extended( + onPressed: () => context.go('/rooms/newprivatechat'), + icon: const Icon(Icons.add_outlined), + label: Text( + L10n.of(context).chat, + overflow: TextOverflow.fade, + ), + ) + : const SizedBox.shrink(), + ), + ), ), - ); - }, + ], + ), ); } } - -enum ChatListPopupMenuItemActions { - createGroup, - createSpace, - discover, - setStatus, - inviteContact, - settings, -} diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 6d463830de..386bb0e2b6 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -1,28 +1,84 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import '../../utils/fluffy_share.dart'; import 'chat_list.dart'; class ClientChooserButton extends StatelessWidget { final ChatListController controller; - const ClientChooserButton(this.controller, {Key? key}) : super(key: key); + const ClientChooserButton(this.controller, {super.key}); List> _bundleMenuItems(BuildContext context) { final matrix = Matrix.of(context); final bundles = matrix.accountBundles.keys.toList() - ..sort((a, b) => a!.isValidMatrixId == b!.isValidMatrixId - ? 0 - : a.isValidMatrixId && !b.isValidMatrixId - ? -1 - : 1); + ..sort( + (a, b) => a!.isValidMatrixId == b!.isValidMatrixId + ? 0 + : a.isValidMatrixId && !b.isValidMatrixId + ? -1 + : 1, + ); return >[ + PopupMenuItem( + value: SettingsAction.newGroup, + child: Row( + children: [ + const Icon(Icons.group_add_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).createGroup), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.setStatus, + child: Row( + children: [ + const Icon(Icons.edit_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).setStatus), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.invite, + child: Row( + children: [ + Icon(Icons.adaptive.share_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).inviteContact), + ], + ), + ), + // Currently disabled because of: + // https://github.com/matrix-org/matrix-react-sdk/pull/12286 + /*PopupMenuItem( + value: SettingsAction.archive, + child: Row( + children: [ + const Icon(Icons.archive_outlined), + const SizedBox(width: 18), + Text(L10n.of(context)!.archive), + ], + ), + ),*/ + PopupMenuItem( + value: SettingsAction.settings, + child: Row( + children: [ + const Icon(Icons.settings_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).settings), + ], + ), + ), + const PopupMenuDivider(), for (final bundle in bundles) ...[ if (matrix.accountBundles[bundle]!.length != 1 || matrix.accountBundles[bundle]!.single!.userID != bundle) @@ -35,7 +91,7 @@ class ClientChooserButton extends StatelessWidget { Text( bundle!, style: TextStyle( - color: Theme.of(context).textTheme.subtitle1!.color, + color: Theme.of(context).textTheme.titleMedium!.color, fontSize: 14, ), ), @@ -43,49 +99,52 @@ class ClientChooserButton extends StatelessWidget { ], ), ), - ...matrix.accountBundles[bundle]! - .map( - (client) => PopupMenuItem( - value: client, - child: FutureBuilder( - future: client!.fetchOwnProfile(), - builder: (context, snapshot) => Row( - children: [ - Avatar( - mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - client.userID!.localpart, - size: 28, - fontSize: 12, - ), - const SizedBox(width: 12), - Expanded( - child: Text( - snapshot.data?.displayName ?? - client.userID!.localpart!, - overflow: TextOverflow.ellipsis, - ), - ), - const SizedBox(width: 12), - IconButton( - icon: const Icon(Icons.edit_outlined), - onPressed: () => controller.editBundlesForAccount( - client.userID, bundle), - ), - ], + ...matrix.accountBundles[bundle]!.map( + (client) => PopupMenuItem( + value: client, + child: FutureBuilder( + // analyzer does not understand this type cast for error + // handling + // + // ignore: unnecessary_cast + future: (client!.fetchOwnProfile() as Future) + .onError((e, s) => null), + builder: (context, snapshot) => Row( + children: [ + Avatar( + mxContent: snapshot.data?.avatarUrl, + name: + snapshot.data?.displayName ?? client.userID!.localpart, + size: 32, ), - ), + const SizedBox(width: 12), + Expanded( + child: Text( + snapshot.data?.displayName ?? client.userID!.localpart!, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 12), + IconButton( + icon: const Icon(Icons.edit_outlined), + onPressed: () => controller.editBundlesForAccount( + client.userID, + bundle, + ), + ), + ], ), - ) - .toList(), + ), + ), + ), ], PopupMenuItem( - value: AddAccountAction.addAccount, + value: SettingsAction.addAccount, child: Row( children: [ const Icon(Icons.person_add_outlined), const SizedBox(width: 18), - Text(L10n.of(context)!.addAccount), + Text(L10n.of(context).addAccount), ], ), ), @@ -96,144 +155,84 @@ class ClientChooserButton extends StatelessWidget { Widget build(BuildContext context) { final matrix = Matrix.of(context); - int clientCount = 0; + var clientCount = 0; matrix.accountBundles.forEach((key, value) => clientCount += value.length); - return Center( - child: FutureBuilder( - future: matrix.client.fetchOwnProfile(), - builder: (context, snapshot) => Stack( - alignment: Alignment.center, - children: [ - ...List.generate( - clientCount, - (index) => KeyBoardShortcuts( - child: Container(), - keysToPress: _buildKeyboardShortcut(index + 1), - helpLabel: L10n.of(context)!.switchToAccount(index + 1), - onKeysPressed: () => _handleKeyboardShortcut(matrix, index), - ), - ), - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.tab - }, - helpLabel: L10n.of(context)!.nextAccount, - onKeysPressed: () => _nextAccount(matrix), - ), - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.shiftLeft, - LogicalKeyboardKey.tab - }, - helpLabel: L10n.of(context)!.previousAccount, - onKeysPressed: () => _previousAccount(matrix), - ), - PopupMenuButton( - child: Material( - color: Colors.transparent, - borderRadius: BorderRadius.circular(99), - child: Avatar( - mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - matrix.client.userID!.localpart, - size: 28, - fontSize: 12, - ), + return FutureBuilder( + future: matrix.client.fetchOwnProfile(), + builder: (context, snapshot) => Stack( + alignment: Alignment.center, + children: [ + ...List.generate( + clientCount, + (index) => const SizedBox.shrink(), + ), + const SizedBox.shrink(), + const SizedBox.shrink(), + PopupMenuButton( + onSelected: (o) => _clientSelected(o, context), + itemBuilder: _bundleMenuItems, + child: Material( + color: Colors.transparent, + borderRadius: BorderRadius.circular(99), + child: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? + matrix.client.userID!.localpart, + size: 32, ), - onSelected: _clientSelected, - itemBuilder: _bundleMenuItems, ), - ], - ), + ), + ], ), ); } - Set? _buildKeyboardShortcut(int index) { - if (index > 0 && index < 10) { - return { - LogicalKeyboardKey.altLeft, - LogicalKeyboardKey(0x00000000030 + index) - }; - } else { - return null; - } - } - - void _clientSelected(Object object) { + void _clientSelected( + Object object, + BuildContext context, + ) async { if (object is Client) { controller.setActiveClient(object); } else if (object is String) { controller.setActiveBundle(object); - } else if (object == AddAccountAction.addAccount) { - controller.addAccountAction(); - } - } - - void _handleKeyboardShortcut(MatrixState matrix, int index) { - final bundles = matrix.accountBundles.keys.toList() - ..sort((a, b) => a!.isValidMatrixId == b!.isValidMatrixId - ? 0 - : a.isValidMatrixId && !b.isValidMatrixId - ? -1 - : 1); - // beginning from end if negative - if (index < 0) { - int clientCount = 0; - matrix.accountBundles - .forEach((key, value) => clientCount += value.length); - _handleKeyboardShortcut(matrix, clientCount); - } - for (final bundleName in bundles) { - final bundle = matrix.accountBundles[bundleName]; - if (bundle != null) { - if (index < bundle.length) { - return _clientSelected(bundle[index]!); - } else { - index -= bundle.length; - } + } else if (object is SettingsAction) { + switch (object) { + case SettingsAction.addAccount: + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).addAccount, + message: L10n.of(context).enableMultiAccounts, + okLabel: L10n.of(context).next, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + context.go('/rooms/settings/addaccount'); + break; + case SettingsAction.newGroup: + context.go('/rooms/newgroup'); + break; + case SettingsAction.invite: + FluffyShare.shareInviteLink(context); + break; + case SettingsAction.settings: + context.go('/rooms/settings'); + break; + case SettingsAction.archive: + context.go('/rooms/archive'); + break; + case SettingsAction.setStatus: + controller.setStatus(); + break; } } - // if index too high, restarting from 0 - _handleKeyboardShortcut(matrix, 0); - } - - int? _shortcutIndexOfClient(MatrixState matrix, Client client) { - int index = 0; - - final bundles = matrix.accountBundles.keys.toList() - ..sort((a, b) => a!.isValidMatrixId == b!.isValidMatrixId - ? 0 - : a.isValidMatrixId && !b.isValidMatrixId - ? -1 - : 1); - for (final bundleName in bundles) { - final bundle = matrix.accountBundles[bundleName]; - if (bundle == null) return null; - if (bundle.contains(client)) { - return index + bundle.indexOf(client); - } else { - index += bundle.length; - } - } - return null; - } - - void _nextAccount(MatrixState matrix) { - final client = matrix.client; - final lastIndex = _shortcutIndexOfClient(matrix, client); - _handleKeyboardShortcut(matrix, lastIndex! + 1); - } - - void _previousAccount(MatrixState matrix) { - final client = matrix.client; - final lastIndex = _shortcutIndexOfClient(matrix, client); - _handleKeyboardShortcut(matrix, lastIndex! - 1); } } -enum AddAccountAction { addAccount } +enum SettingsAction { + addAccount, + newGroup, + setStatus, + invite, + settings, + archive, +} diff --git a/lib/pages/chat_list/dummy_chat_list_item.dart b/lib/pages/chat_list/dummy_chat_list_item.dart new file mode 100644 index 0000000000..8652cccd12 --- /dev/null +++ b/lib/pages/chat_list/dummy_chat_list_item.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class DummyChatListItem extends StatelessWidget { + final double opacity; + final bool animate; + + const DummyChatListItem({ + required this.opacity, + required this.animate, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final titleColor = theme.textTheme.bodyLarge!.color!.withAlpha(100); + final subtitleColor = theme.textTheme.bodyLarge!.color!.withAlpha(50); + return Opacity( + opacity: opacity, + child: ListTile( + leading: CircleAvatar( + backgroundColor: titleColor, + child: animate + ? CircularProgressIndicator( + strokeWidth: 1, + color: theme.textTheme.bodyLarge!.color, + ) + : const SizedBox.shrink(), + ), + title: Row( + children: [ + Expanded( + child: Container( + height: 14, + decoration: BoxDecoration( + color: titleColor, + borderRadius: BorderRadius.circular(3), + ), + ), + ), + const SizedBox(width: 36), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + const SizedBox(width: 12), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + ], + ), + subtitle: Container( + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(3), + ), + height: 12, + margin: const EdgeInsets.only(right: 22), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/nav_rail_item.dart b/lib/pages/chat_list/nav_rail_item.dart new file mode 100644 index 0000000000..6264b0b185 --- /dev/null +++ b/lib/pages/chat_list/nav_rail_item.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import '../../config/themes.dart'; + +class NaviRailItem extends StatefulWidget { + final String toolTip; + final bool isSelected; + final void Function() onTap; + final Widget icon; + final Widget? selectedIcon; + + const NaviRailItem({ + required this.toolTip, + required this.isSelected, + required this.onTap, + required this.icon, + this.selectedIcon, + super.key, + }); + + @override + State createState() => _NaviRailItemState(); +} + +class _NaviRailItemState extends State { + bool _hovered = false; + + void _onHover(bool hover) { + if (hover == _hovered) return; + setState(() { + _hovered = hover; + }); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final borderRadius = BorderRadius.circular(AppConfig.borderRadius); + return SizedBox( + height: 64, + width: 64, + child: Stack( + children: [ + Positioned( + top: 16, + bottom: 16, + left: 0, + child: AnimatedContainer( + width: widget.isSelected ? 4 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(90), + bottomRight: Radius.circular(90), + ), + ), + ), + ), + Center( + child: AnimatedScale( + scale: _hovered ? 1.2 : 1.0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Material( + borderRadius: borderRadius, + color: widget.isSelected + ? theme.colorScheme.primaryContainer + : theme.colorScheme.surface, + child: Tooltip( + message: widget.toolTip, + child: InkWell( + borderRadius: borderRadius, + onTap: widget.onTap, + onHover: _onHover, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 8.0, + ), + child: widget.isSelected + ? widget.selectedIcon ?? widget.icon + : widget.icon, + ), + ), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/chat_list/navi_rail_item.dart b/lib/pages/chat_list/navi_rail_item.dart new file mode 100644 index 0000000000..77837bfef6 --- /dev/null +++ b/lib/pages/chat_list/navi_rail_item.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; + +import 'package:badges/badges.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/unread_rooms_badge.dart'; +import '../../config/themes.dart'; + +class NaviRailItem extends StatelessWidget { + final String toolTip; + final bool isSelected; + final void Function() onTap; + final Widget icon; + final Widget? selectedIcon; + final bool Function(Room)? unreadBadgeFilter; + + const NaviRailItem({ + required this.toolTip, + required this.isSelected, + required this.onTap, + required this.icon, + this.selectedIcon, + this.unreadBadgeFilter, + super.key, + }); + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final borderRadius = BorderRadius.circular(AppConfig.borderRadius); + final icon = isSelected ? selectedIcon ?? this.icon : this.icon; + final unreadBadgeFilter = this.unreadBadgeFilter; + return HoverBuilder( + builder: (context, hovered) { + return SizedBox( + height: FluffyThemes.navRailWidth, + width: FluffyThemes.navRailWidth, + child: Stack( + children: [ + Positioned( + top: 16, + bottom: 16, + left: 0, + child: AnimatedContainer( + width: isSelected ? 4 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(90), + bottomRight: Radius.circular(90), + ), + ), + ), + ), + Center( + child: AnimatedScale( + scale: hovered ? 1.2 : 1.0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Material( + borderRadius: borderRadius, + color: isSelected + ? theme.colorScheme.primaryContainer + : theme.colorScheme.surface, + child: Tooltip( + message: toolTip, + child: InkWell( + borderRadius: borderRadius, + onTap: onTap, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 8.0, + ), + child: unreadBadgeFilter == null + ? icon + : UnreadRoomsBadge( + filter: unreadBadgeFilter, + badgePosition: BadgePosition.topEnd( + top: -12, + end: -8, + ), + child: icon, + ), + ), + ), + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat_list/search_title.dart b/lib/pages/chat_list/search_title.dart new file mode 100644 index 0000000000..496a5feec4 --- /dev/null +++ b/lib/pages/chat_list/search_title.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; + +class SearchTitle extends StatelessWidget { + final String title; + final Widget icon; + final Widget? trailing; + final void Function()? onTap; + final Color? color; + + const SearchTitle({ + required this.title, + required this.icon, + this.trailing, + this.onTap, + this.color, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Material( + shape: Border( + top: BorderSide( + color: theme.dividerColor, + width: 1, + ), + bottom: BorderSide( + color: theme.dividerColor, + width: 1, + ), + ), + color: color ?? theme.colorScheme.surface, + child: InkWell( + onTap: onTap, + splashColor: theme.colorScheme.surface, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: IconTheme( + data: theme.iconTheme.copyWith(size: 16), + child: Row( + children: [ + icon, + const SizedBox(width: 16), + Text( + title, + textAlign: TextAlign.left, + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + if (trailing != null) + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: trailing!, + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart new file mode 100644 index 0000000000..73be8cdcf5 --- /dev/null +++ b/lib/pages/chat_list/space_view.dart @@ -0,0 +1,557 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/public_room_bottom_sheet.dart'; + +enum AddRoomType { chat, subspace } + +class SpaceView extends StatefulWidget { + final String spaceId; + final void Function() onBack; + final void Function(String spaceId) toParentSpace; + final void Function(Room room) onChatTab; + final void Function(Room room, BuildContext context) onChatContext; + final String? activeChat; + + const SpaceView({ + required this.spaceId, + required this.onBack, + required this.onChatTab, + required this.activeChat, + required this.toParentSpace, + required this.onChatContext, + super.key, + }); + + @override + State createState() => _SpaceViewState(); +} + +class _SpaceViewState extends State { + final List _discoveredChildren = []; + final TextEditingController _filterController = TextEditingController(); + String? _nextBatch; + bool _noMoreRooms = false; + bool _isLoading = false; + + @override + void initState() { + _loadHierarchy(); + super.initState(); + } + + void _loadHierarchy() async { + final room = Matrix.of(context).client.getRoomById(widget.spaceId); + if (room == null) return; + + setState(() { + _isLoading = true; + }); + + try { + final hierarchy = await room.client.getSpaceHierarchy( + widget.spaceId, + suggestedOnly: false, + maxDepth: 2, + from: _nextBatch, + ); + if (!mounted) return; + setState(() { + _nextBatch = hierarchy.nextBatch; + if (hierarchy.nextBatch == null) { + _noMoreRooms = true; + } + _discoveredChildren.addAll( + hierarchy.rooms + .where((c) => room.client.getRoomById(c.roomId) == null), + ); + _isLoading = false; + }); + } catch (e, s) { + Logs().w('Unable to load hierarchy', e, s); + if (!mounted) return; + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + setState(() { + _isLoading = false; + }); + } + } + + void _joinChildRoom(SpaceRoomsChunk item) async { + final client = Matrix.of(context).client; + final space = client.getRoomById(widget.spaceId); + + final joined = await showAdaptiveBottomSheet( + context: context, + builder: (_) => PublicRoomBottomSheet( + outerContext: context, + chunk: item, + via: space?.spaceChildren + .firstWhereOrNull( + (child) => child.roomId == item.roomId, + ) + ?.via, + ), + ); + if (mounted && joined == true) { + setState(() { + _discoveredChildren.remove(item); + }); + } + } + + void _onSpaceAction(SpaceActions action) async { + final space = Matrix.of(context).client.getRoomById(widget.spaceId); + + switch (action) { + case SpaceActions.settings: + await space?.postLoad(); + context.push('/rooms/${widget.spaceId}/details'); + break; + case SpaceActions.invite: + await space?.postLoad(); + context.push('/rooms/${widget.spaceId}/invite'); + break; + case SpaceActions.leave: + final confirmed = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).archiveRoomDescription, + isDestructive: true, + ); + if (!mounted) return; + if (confirmed != OkCancelResult.ok) return; + + final success = await showFutureLoadingDialog( + context: context, + future: () async => await space?.leave(), + ); + if (!mounted) return; + if (success.error != null) return; + widget.onBack(); + } + } + + void _addChatOrSubspace() async { + final roomType = await showModalActionPopup( + context: context, + title: L10n.of(context).addChatOrSubSpace, + actions: [ + AdaptiveModalAction( + value: AddRoomType.subspace, + label: L10n.of(context).createNewSpace, + ), + AdaptiveModalAction( + value: AddRoomType.chat, + label: L10n.of(context).createGroup, + ), + ], + ); + if (roomType == null) return; + + final names = await showTextInputDialog( + context: context, + title: roomType == AddRoomType.subspace + ? L10n.of(context).createNewSpace + : L10n.of(context).createGroup, + hintText: roomType == AddRoomType.subspace + ? L10n.of(context).spaceName + : L10n.of(context).groupName, + minLines: 1, + maxLines: 1, + maxLength: 64, + validator: (text) { + if (text.isEmpty) { + return L10n.of(context).pleaseChoose; + } + return null; + }, + okLabel: L10n.of(context).create, + cancelLabel: L10n.of(context).cancel, + ); + if (names == null) return; + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () async { + late final String roomId; + final activeSpace = client.getRoomById(widget.spaceId)!; + await activeSpace.postLoad(); + + if (roomType == AddRoomType.subspace) { + roomId = await client.createSpace( + name: names, + visibility: activeSpace.joinRules == JoinRules.public + ? sdk.Visibility.public + : sdk.Visibility.private, + ); + } else { + roomId = await client.createGroupChat( + groupName: names, + preset: activeSpace.joinRules == JoinRules.public + ? CreateRoomPreset.publicChat + : CreateRoomPreset.privateChat, + visibility: activeSpace.joinRules == JoinRules.public + ? sdk.Visibility.public + : sdk.Visibility.private, + ); + } + await activeSpace.setSpaceChild(roomId); + }, + ); + if (result.error != null) return; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = Matrix.of(context).client.getRoomById(widget.spaceId); + final displayname = + room?.getLocalizedDisplayname() ?? L10n.of(context).nothingFound; + return Scaffold( + appBar: AppBar( + leading: Center( + child: CloseButton( + onPressed: widget.onBack, + ), + ), + titleSpacing: 0, + title: ListTile( + contentPadding: EdgeInsets.zero, + leading: Avatar( + mxContent: room?.avatar, + name: displayname, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), + title: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: room == null + ? null + : Text( + L10n.of(context).countChatsAndCountParticipants( + room.spaceChildren.length, + room.summary.mJoinedMemberCount ?? 1, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + actions: [ + PopupMenuButton( + onSelected: _onSpaceAction, + itemBuilder: (context) => [ + PopupMenuItem( + value: SpaceActions.settings, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.settings_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).settings), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.invite, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.person_add_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).invite), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.leave, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.delete_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).leave), + ], + ), + ), + ], + ), + ], + ), + floatingActionButton: room?.canChangeStateEvent( + EventTypes.SpaceChild, + ) == + true + ? FloatingActionButton.extended( + onPressed: _addChatOrSubspace, + label: Text(L10n.of(context).group), + icon: const Icon(Icons.group_add_outlined), + ) + : null, + body: room == null + ? const Center( + child: Icon( + Icons.search_outlined, + size: 80, + ), + ) + : StreamBuilder( + stream: room.client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, snapshot) { + final childrenIds = room.spaceChildren + .map((c) => c.roomId) + .whereType() + .toSet(); + + final joinedRooms = room.client.rooms + .where((room) => childrenIds.remove(room.id)) + .toList(); + + final joinedParents = room.spaceParents + .map((parent) { + final roomId = parent.roomId; + if (roomId == null) return null; + return room.client.getRoomById(roomId); + }) + .whereType() + .toList(); + final filter = _filterController.text.trim().toLowerCase(); + return CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + toolbarHeight: 72, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: TextField( + controller: _filterController, + onChanged: (_) => setState(() {}), + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: IconButton( + onPressed: () {}, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + SliverList.builder( + itemCount: joinedParents.length, + itemBuilder: (context, i) { + final displayname = + joinedParents[i].getLocalizedDisplayname(); + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + minVerticalPadding: 0, + leading: Icon( + Icons.adaptive.arrow_back_outlined, + size: 16, + ), + title: Row( + children: [ + Avatar( + mxContent: joinedParents[i].avatar, + name: displayname, + size: Avatar.defaultSize / 2, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 4, + ), + ), + const SizedBox(width: 8), + Expanded(child: Text(displayname)), + ], + ), + onTap: () => + widget.toParentSpace(joinedParents[i].id), + ), + ), + ); + }, + ), + SliverList.builder( + itemCount: joinedRooms.length, + itemBuilder: (context, i) { + final joinedRoom = joinedRooms[i]; + return ChatListItem( + joinedRoom, + filter: filter, + onTap: () => widget.onChatTab(joinedRoom), + onLongPress: (context) => widget.onChatContext( + joinedRoom, + context, + ), + activeChat: widget.activeChat == joinedRoom.id, + ); + }, + ), + SliverList.builder( + itemCount: _discoveredChildren.length + 2, + itemBuilder: (context, i) { + if (i == 0) { + return SearchTitle( + title: L10n.of(context).discover, + icon: const Icon(Icons.explore_outlined), + ); + } + i--; + if (i == _discoveredChildren.length) { + if (_noMoreRooms) { + return Padding( + padding: const EdgeInsets.all(12.0), + child: Center( + child: Text( + L10n.of(context).noMoreChatsFound, + style: const TextStyle(fontSize: 13), + ), + ), + ); + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 2.0, + ), + child: TextButton( + onPressed: _isLoading ? null : _loadHierarchy, + child: _isLoading + ? LinearProgressIndicator( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ) + : Text(L10n.of(context).loadMore), + ), + ); + } + final item = _discoveredChildren[i]; + final displayname = item.name ?? + item.canonicalAlias ?? + L10n.of(context).emptyChat; + if (!displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + visualDensity: + const VisualDensity(vertical: -0.5), + contentPadding: + const EdgeInsets.symmetric(horizontal: 8), + onTap: () => _joinChildRoom(item), + leading: Avatar( + mxContent: item.avatarUrl, + name: displayname, + borderRadius: item.roomType == 'm.space' + ? BorderRadius.circular( + AppConfig.borderRadius / 2, + ) + : null, + ), + title: Row( + children: [ + Expanded( + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + item.numJoinedMembers.toString(), + style: TextStyle( + fontSize: 13, + color: theme.textTheme.bodyMedium!.color, + ), + ), + const SizedBox(width: 4), + const Icon( + Icons.people_outlined, + size: 14, + ), + ], + ), + subtitle: Text( + item.topic ?? + L10n.of(context).countParticipants( + item.numJoinedMembers, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ); + }, + ), + const SliverPadding(padding: EdgeInsets.only(top: 32)), + ], + ); + }, + ), + ); + } +} + +enum SpaceActions { + settings, + invite, + leave, +} diff --git a/lib/pages/chat_list/spaces_drawer.dart b/lib/pages/chat_list/spaces_drawer.dart deleted file mode 100644 index c9e5d6be38..0000000000 --- a/lib/pages/chat_list/spaces_drawer.dart +++ /dev/null @@ -1,96 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'chat_list.dart'; - -class SpacesDrawer extends StatelessWidget { - final ChatListController controller; - - const SpacesDrawer({Key? key, required this.controller}) : super(key: key); - - @override - Widget build(BuildContext context) { - final currentIndex = controller.spacesEntries.indexWhere((space) => - controller.activeSpacesEntry.runtimeType == space.runtimeType && - (controller.activeSpaceId == space.getSpace(context)?.id)); - - final Map spaceHierarchy = - Map.fromEntries(controller.spacesEntries.map((e) => MapEntry(e, null))); - - // TODO(TheOeWithTheBraid): wait for space hierarchy https://gitlab.com/famedly/company/frontend/libraries/matrix_api_lite/-/merge_requests/58 - - return ListView.builder( - itemCount: spaceHierarchy.length + 1, - itemBuilder: (context, i) { - if (i == spaceHierarchy.length) { - return ListTile( - leading: CircleAvatar( - radius: Avatar.defaultSize / 2, - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.onSecondary, - child: const Icon( - Icons.archive_outlined, - ), - ), - title: Text(L10n.of(context)!.archive), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/archive'); - }, - ); - } - final space = spaceHierarchy.keys.toList()[i]; - final room = space.getSpace(context); - final active = currentIndex == i; - return ListTile( - selected: active, - leading: room == null - ? CircleAvatar( - child: space.getIcon(active), - radius: Avatar.defaultSize / 2, - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.onSecondary, - ) - : Avatar( - mxContent: room.avatar, - name: space.getName(context), - ), - title: Text( - space.getName(context), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - subtitle: room?.topic.isEmpty ?? true - ? null - : Tooltip( - message: room!.topic, - child: Text( - room.topic.replaceAll('\n', ' '), - softWrap: false, - overflow: TextOverflow.fade, - ), - ), - onTap: () => controller.setActiveSpacesEntry( - context, - space, - ), - trailing: room != null - ? SizedBox( - width: 32, - child: IconButton( - splashRadius: 24, - icon: const Icon(Icons.edit_outlined), - tooltip: L10n.of(context)!.edit, - onPressed: () => controller.editSpace(context, room.id), - ), - ) - : const Icon(Icons.arrow_forward_ios_outlined), - ); - }, - ); - } -} diff --git a/lib/pages/chat_list/spaces_entry.dart b/lib/pages/chat_list/spaces_entry.dart deleted file mode 100644 index b9e064c2fa..0000000000 --- a/lib/pages/chat_list/spaces_entry.dart +++ /dev/null @@ -1,214 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import '../../widgets/matrix.dart'; - -// This is not necessarily a Space, but an abstract categorization of a room. -// More to the point, it's a selectable entry that *could* be a Space. -// Note that view code is in spaces_bottom_bar.dart because of type-specific UI. -// So only really generic functions (so far, anything ChatList cares about) go here. -// If getRoom returns something non-null, then it gets the avatar and such of a Space. -// Otherwise it gets to look like All Rooms. Future work impending. -abstract class SpacesEntry { - const SpacesEntry(); - - // Gets the (translated) name of this entry. - String getName(BuildContext context); - // Gets an icon for this entry (avoided if a space is given) - Icon getIcon(bool active) => active - ? const Icon(CupertinoIcons.chat_bubble_2_fill) - : const Icon(CupertinoIcons.chat_bubble_2); - // If this is a specific Room, returns the space Room for various purposes. - Room? getSpace(BuildContext context) => null; - // Gets a list of rooms - this is done as part of _ChatListViewBodyState to get the full list of rooms visible from this SpacesEntry. - List getRooms(BuildContext context); - // Checks that this entry is still valid. - bool stillValid(BuildContext context) => true; - // Returns true if the Stories header should be shown. - bool shouldShowStoriesHeader(BuildContext context) => false; -} - -// Common room validity checks -bool _roomCheckCommon(Room room, BuildContext context) { - if (room.isSpace && room.membership == Membership.join && !room.isUnread) { - return false; - } - if (room.getState(EventTypes.RoomCreate)?.content.tryGet('type') == - ClientStoriesExtension.storiesRoomType) { - return false; - } - return true; -} - -bool _roomInsideSpace(Room room, Room space) { - if (space.spaceChildren.any((child) => child.roomId == room.id)) { - return true; - } - if (room.spaceParents.any((parent) => parent.roomId == space.id)) { - return true; - } - return false; -} - -// "All rooms" entry. -class AllRoomsSpacesEntry extends SpacesEntry { - static final AllRoomsSpacesEntry _value = AllRoomsSpacesEntry._(); - AllRoomsSpacesEntry._(); - factory AllRoomsSpacesEntry() { - return _value; - } - - @override - String getName(BuildContext context) => L10n.of(context)!.allChats; - - @override - List getRooms(BuildContext context) { - return Matrix.of(context) - .client - .rooms - .where((room) => _roomCheckCommon(room, context)) - .toList(); - } - - @override - bool shouldShowStoriesHeader(BuildContext context) => true; - - @override - bool operator ==(Object other) { - return runtimeType == other.runtimeType; - } - - @override - int get hashCode => runtimeType.hashCode; -} - -// "Direct Chats" entry. -class DirectChatsSpacesEntry extends SpacesEntry { - static final DirectChatsSpacesEntry _value = DirectChatsSpacesEntry._(); - DirectChatsSpacesEntry._(); - factory DirectChatsSpacesEntry() { - return _value; - } - - @override - String getName(BuildContext context) => L10n.of(context)!.directChats; - - @override - List getRooms(BuildContext context) { - return Matrix.of(context) - .client - .rooms - .where((room) => room.isDirectChat && _roomCheckCommon(room, context)) - .toList(); - } - - @override - bool shouldShowStoriesHeader(BuildContext context) => true; - - @override - bool operator ==(Object other) { - return runtimeType == other.runtimeType; - } - - @override - int get hashCode => runtimeType.hashCode; -} - -// "Groups" entry. -class GroupsSpacesEntry extends SpacesEntry { - static final GroupsSpacesEntry _value = GroupsSpacesEntry._(); - GroupsSpacesEntry._(); - factory GroupsSpacesEntry() { - return _value; - } - - @override - String getName(BuildContext context) => L10n.of(context)!.groups; - - @override - Icon getIcon(bool active) => - active ? const Icon(Icons.group) : const Icon(Icons.group_outlined); - - @override - List getRooms(BuildContext context) { - final rooms = Matrix.of(context).client.rooms; - // Needs to match ChatList's definition of a space. - final spaces = rooms.where((room) => room.isSpace).toList(); - return rooms - .where((room) => - (!room.isDirectChat) && - _roomCheckCommon(room, context) && - separatedGroup(room, spaces)) - .toList(); - } - - bool separatedGroup(Room room, List spaces) { - return !spaces.any((space) => _roomInsideSpace(room, space)); - } - - @override - bool operator ==(Object other) { - return runtimeType == other.runtimeType; - } - - @override - int get hashCode => runtimeType.hashCode; -} - -// All rooms associated with a specific space. -class SpaceSpacesEntry extends SpacesEntry { - final Room space; - const SpaceSpacesEntry(this.space); - - @override - String getName(BuildContext context) => space.displayname; - - @override - Room? getSpace(BuildContext context) => space; - - @override - List getRooms(BuildContext context) { - return Matrix.of(context) - .client - .rooms - .where((room) => roomCheck(room, context)) - .toList(); - } - - bool roomCheck(Room room, BuildContext context) { - if (!_roomCheckCommon(room, context)) { - return false; - } - if (_roomInsideSpace(room, space)) { - return true; - } - if (AppConfig.showDirectChatsInSpaces) { - if (room.isDirectChat && - room.summary.mHeroes != null && - room.summary.mHeroes!.any((userId) { - final user = space.getState(EventTypes.RoomMember, userId)?.asUser; - return user != null && user.membership == Membership.join; - })) { - return true; - } - } - return false; - } - - @override - bool stillValid(BuildContext context) => - Matrix.of(context).client.getRoomById(space.id) != null; - - @override - bool operator ==(Object other) { - return hashCode == other.hashCode; - } - - @override - int get hashCode => space.id.hashCode; -} diff --git a/lib/pages/chat_list/status_msg_list.dart b/lib/pages/chat_list/status_msg_list.dart new file mode 100644 index 0000000000..563ceb9f2b --- /dev/null +++ b/lib/pages/chat_list/status_msg_list.dart @@ -0,0 +1,322 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class StatusMessageList extends StatelessWidget { + final void Function() onStatusEdit; + const StatusMessageList({ + required this.onStatusEdit, + super.key, + }); + + static const double height = 116; + + void _onStatusTab(BuildContext context, Profile profile) { + final client = Matrix.of(context).client; + if (profile.userId == client.userID) return onStatusEdit(); + + showAdaptiveBottomSheet( + context: context, + builder: (c) => UserBottomSheet( + profile: profile, + outerContext: context, + ), + ); + return; + } + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final interestingPresences = client.interestingPresences; + + return StreamBuilder( + stream: client.onSync.stream.rateLimit(const Duration(seconds: 3)), + builder: (context, snapshot) { + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: Curves.easeInOut, + child: FutureBuilder( + initialData: interestingPresences + // ignore: deprecated_member_use + .map((userId) => client.presences[userId]) + .whereType(), + future: Future.wait( + client.interestingPresences.map( + (userId) => client.fetchCurrentPresence( + userId, + fetchOnlyFromCached: true, + ), + ), + ), + builder: (context, snapshot) { + final presences = + snapshot.data?.where(isInterestingPresence).toList(); + + // If no other presences than the own entry is interesting, we + // hide the presence header. + if (presences == null || presences.length <= 1) { + return const SizedBox.shrink(); + } + + // Make sure own entry is at the first position. Sort by last + // active instead. + presences.sort((a, b) { + if (a.userid == client.userID) return -1; + if (b.userid == client.userID) return 1; + return b.sortOrderDateTime.compareTo(a.sortOrderDateTime); + }); + + return SizedBox( + height: StatusMessageList.height, + child: ListView.builder( + padding: const EdgeInsets.all(8), + scrollDirection: Axis.horizontal, + itemCount: presences.length, + itemBuilder: (context, i) => PresenceAvatar( + presence: presences[i], + height: StatusMessageList.height, + onTap: (profile) => _onStatusTab(context, profile), + ), + ), + ); + }, + ), + ); + }, + ); + } +} + +class PresenceAvatar extends StatelessWidget { + final CachedPresence presence; + final double height; + final void Function(Profile) onTap; + + const PresenceAvatar({ + required this.presence, + required this.height, + required this.onTap, + super.key, + }); + + @override + Widget build(BuildContext context) { + final avatarSize = height - 16 - 16 - 8; + final client = Matrix.of(context).client; + return FutureBuilder( + future: client.getProfileFromUserId(presence.userid), + builder: (context, snapshot) { + final theme = Theme.of(context); + + final profile = snapshot.data; + final displayName = profile?.displayName ?? + presence.userid.localpart ?? + presence.userid; + final statusMsg = presence.statusMsg; + + const statusMsgBubbleElevation = 6.0; + final statusMsgBubbleShadowColor = theme.colorScheme.surface; + final statusMsgBubbleColor = Colors.white.withAlpha(230); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: SizedBox( + width: avatarSize, + child: Column( + children: [ + HoverBuilder( + builder: (context, hovered) { + return AnimatedScale( + scale: hovered ? 1.15 : 1.0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: InkWell( + borderRadius: BorderRadius.circular(avatarSize), + onTap: profile == null ? null : () => onTap(profile), + child: Material( + borderRadius: BorderRadius.circular(avatarSize), + child: Stack( + children: [ + Container( + padding: const EdgeInsets.all(3), + decoration: BoxDecoration( + gradient: presence.gradient, + borderRadius: + BorderRadius.circular(avatarSize), + ), + child: Avatar( + name: displayName, + mxContent: profile?.avatarUrl, + size: avatarSize - 6, + ), + ), + if (presence.userid == client.userID) + Positioned( + right: 0, + bottom: 0, + child: SizedBox( + width: 24, + height: 24, + child: FloatingActionButton.small( + heroTag: null, + onPressed: () => onTap( + profile ?? + Profile(userId: presence.userid), + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + child: const Icon( + Icons.add_outlined, + size: 16, + ), + ), + ), + ), + if (statusMsg != null) ...[ + Positioned( + left: 0, + top: 0, + right: 8, + child: Material( + elevation: statusMsgBubbleElevation, + shadowColor: statusMsgBubbleShadowColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: statusMsgBubbleColor, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Text( + statusMsg, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.black, + fontSize: 10.5, + ), + ), + ), + ), + ), + Positioned( + left: 8, + top: 32, + child: Material( + color: statusMsgBubbleColor, + elevation: statusMsgBubbleElevation, + shadowColor: statusMsgBubbleShadowColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + child: const SizedBox( + width: 8, + height: 8, + ), + ), + ), + Positioned( + left: 14, + top: 40, + child: Material( + color: statusMsgBubbleColor, + elevation: statusMsgBubbleElevation, + shadowColor: statusMsgBubbleShadowColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + child: const SizedBox( + width: 4, + height: 4, + ), + ), + ), + ], + ], + ), + ), + ), + ); + }, + ), + const Spacer(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Text( + displayName, + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 13, + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} + +extension on Client { + Set get interestingPresences { + final allHeroes = rooms.map((room) => room.summary.mHeroes).fold( + {}, + (previousValue, element) => previousValue..addAll(element ?? {}), + ); + allHeroes.add(userID!); + return allHeroes; + } +} + +bool isInterestingPresence(CachedPresence presence) => + !presence.presence.isOffline || (presence.statusMsg?.isNotEmpty ?? false); + +extension on CachedPresence { + DateTime get sortOrderDateTime => + lastActiveTimestamp ?? + (currentlyActive == true + ? DateTime.now() + : DateTime.fromMillisecondsSinceEpoch(0)); + LinearGradient get gradient => presence.isOnline == true + ? LinearGradient( + colors: [ + Colors.green, + Colors.green.shade200, + Colors.green.shade900, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ) + : presence.isUnavailable + ? LinearGradient( + colors: [ + Colors.yellow, + Colors.yellow.shade200, + Colors.yellow.shade900, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ) + : LinearGradient( + colors: [ + Colors.grey, + Colors.grey.shade200, + Colors.grey.shade900, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ); +} diff --git a/lib/pages/chat_list/stories_header.dart b/lib/pages/chat_list/stories_header.dart deleted file mode 100644 index 8ef8556ed1..0000000000 --- a/lib/pages/chat_list/stories_header.dart +++ /dev/null @@ -1,309 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:collection/collection.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -enum ContextualRoomAction { - mute, - unmute, - leave, -} - -class StoriesHeader extends StatelessWidget { - final String filter; - const StoriesHeader({required this.filter, Key? key}) : super(key: key); - - void _addToStoryAction(BuildContext context) => - VRouter.of(context).to('/stories/create'); - - void _goToStoryAction(BuildContext context, String roomId) async { - final room = Matrix.of(context).client.getRoomById(roomId); - if (room == null) return; - if (room.membership != Membership.join) { - final result = await showFutureLoadingDialog( - context: context, - future: room.join, - ); - if (result.error != null) return; - } - VRouter.of(context).toSegments(['stories', roomId]); - } - - void _contextualActions(BuildContext context, Room room) async { - final action = await showModalActionSheet( - cancelLabel: L10n.of(context)!.cancel, - context: context, - actions: [ - if (room.pushRuleState != PushRuleState.notify) - SheetAction( - label: L10n.of(context)!.unmuteChat, - key: ContextualRoomAction.unmute, - icon: Icons.notifications_outlined, - ) - else - SheetAction( - label: L10n.of(context)!.muteChat, - key: ContextualRoomAction.mute, - icon: Icons.notifications_off_outlined, - ), - SheetAction( - label: L10n.of(context)!.unsubscribeStories, - key: ContextualRoomAction.leave, - icon: Icons.unsubscribe_outlined, - isDestructiveAction: true, - ), - ], - ); - if (action == null) return; - switch (action) { - case ContextualRoomAction.mute: - await showFutureLoadingDialog( - context: context, - future: () => room.setPushRuleState(PushRuleState.dontNotify), - ); - break; - case ContextualRoomAction.unmute: - await showFutureLoadingDialog( - context: context, - future: () => room.setPushRuleState(PushRuleState.notify), - ); - break; - case ContextualRoomAction.leave: - await showFutureLoadingDialog( - context: context, - future: () => room.leave(), - ); - break; - } - } - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - return StreamBuilder( - stream: Matrix.of(context).onShareContentChanged.stream, - builder: (context, _) => StreamBuilder( - stream: client.onSync.stream - .where((syncUpdate) => syncUpdate.hasRoomUpdate), - builder: (context, snapshot) { - if (Matrix.of(context).shareContent != null) { - return ListTile( - leading: CircleAvatar( - radius: Avatar.defaultSize / 2, - backgroundColor: Theme.of(context).colorScheme.surface, - foregroundColor: Theme.of(context).textTheme.bodyText1?.color, - child: const Icon(Icons.camera_alt_outlined), - ), - title: Text(L10n.of(context)!.addToStory), - onTap: () => _addToStoryAction(context), - ); - } - if (client.storiesRooms.isEmpty || - !client.storiesRooms.any((room) => room.displayname - .toLowerCase() - .contains(filter.toLowerCase()))) { - return Container(); - } - final ownStoryRoom = client.storiesRooms - .firstWhereOrNull((r) => r.creatorId == client.userID); - final stories = [ - if (ownStoryRoom != null) ownStoryRoom, - ...client.storiesRooms..remove(ownStoryRoom), - ]; - return SizedBox( - height: 98, - child: ListView.builder( - padding: const EdgeInsets.symmetric(horizontal: 12), - scrollDirection: Axis.horizontal, - itemCount: stories.length, - itemBuilder: (context, i) { - final room = stories[i]; - return FutureBuilder( - future: room.getCreatorProfile(), - builder: (context, snapshot) { - final userId = room.creatorId; - final displayname = snapshot.data?.displayName ?? - userId?.localpart ?? - 'Unknown'; - final avatarUrl = snapshot.data?.avatarUrl; - if (!displayname - .toLowerCase() - .contains(filter.toLowerCase())) { - return Container(); - } - return _StoryButton( - profile: Profile( - displayName: displayname, - avatarUrl: avatarUrl, - userId: userId ?? 'Unknown', - ), - heroTag: 'stories_${room.id}', - hasPosts: room.hasPosts || room == ownStoryRoom, - showEditFab: userId == client.userID, - unread: room.membership == Membership.invite || - (room.hasNewMessages && room.hasPosts), - onPressed: () => _goToStoryAction(context, room.id), - onLongPressed: () => - _contextualActions(context, room), - ); - }); - }, - ), - ); - }), - ); - } -} - -extension on Room { - Future getCreatorProfile() => - client.getProfileFromUserId(getState(EventTypes.RoomCreate)!.senderId); - - bool get hasPosts { - if (membership == Membership.invite) return true; - final lastEvent = this.lastEvent; - if (lastEvent == null) return false; - if (lastEvent.type != EventTypes.Message) return false; - if (DateTime.now().difference(lastEvent.originServerTs).inHours > - ClientStoriesExtension.lifeTimeInHours) { - return false; - } - return true; - } -} - -class _StoryButton extends StatelessWidget { - final Profile profile; - final bool showEditFab; - final bool unread; - final bool hasPosts; - final void Function() onPressed; - final void Function()? onLongPressed; - final String heroTag; - - const _StoryButton({ - required this.profile, - required this.onPressed, - required this.heroTag, - this.showEditFab = false, - this.hasPosts = true, - this.unread = false, - this.onLongPressed, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 78, - child: InkWell( - borderRadius: BorderRadius.circular(7), - onTap: onPressed, - onLongPress: onLongPressed, - child: Opacity( - opacity: hasPosts ? 1 : 0.4, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Column( - children: [ - const SizedBox(height: 8), - Material( - borderRadius: BorderRadius.circular(Avatar.defaultSize), - child: Container( - padding: const EdgeInsets.all(3), - decoration: BoxDecoration( - gradient: unread - ? const LinearGradient( - colors: [ - Colors.red, - Colors.purple, - Colors.orange, - ], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ) - : null, - color: unread - ? null - : Theme.of(context).colorScheme.surfaceVariant, - borderRadius: BorderRadius.circular(Avatar.defaultSize), - ), - child: Stack( - children: [ - Material( - color: Theme.of(context).colorScheme.surface, - borderRadius: - BorderRadius.circular(Avatar.defaultSize), - child: Padding( - padding: const EdgeInsets.all(2.0), - child: CircleAvatar( - radius: 30, - backgroundColor: - Theme.of(context).colorScheme.surface, - foregroundColor: - Theme.of(context).textTheme.bodyText1?.color, - child: Hero( - tag: heroTag, - child: Avatar( - mxContent: profile.avatarUrl, - name: profile.displayName, - size: 100, - fontSize: 24, - ), - ), - ), - ), - ), - if (showEditFab) - Positioned( - right: 0, - bottom: 0, - child: SizedBox( - width: 24, - height: 24, - child: FloatingActionButton.small( - heroTag: null, - onPressed: () => - VRouter.of(context).to('/stories/create'), - child: const Icon( - Icons.add_outlined, - size: 16, - ), - ), - ), - ), - ], - ), - ), - ), - Center( - child: Text( - profile.displayName ?? '', - maxLines: 1, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, - fontWeight: unread ? FontWeight.bold : null, - ), - ), - ), - ], - ), - ), - ), - ), - ); - } -} - -extension on Room { - String? get creatorId => getState(EventTypes.RoomCreate)?.senderId; -} diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart new file mode 100644 index 0000000000..c777d286e2 --- /dev/null +++ b/lib/pages/chat_members/chat_members.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; +import 'chat_members_view.dart'; + +class ChatMembersPage extends StatefulWidget { + final String roomId; + const ChatMembersPage({required this.roomId, super.key}); + + @override + State createState() => ChatMembersController(); +} + +class ChatMembersController extends State { + List? members; + List? filteredMembers; + Object? error; + + final TextEditingController filterController = TextEditingController(); + + void setFilter([_]) async { + final filter = filterController.text.toLowerCase().trim(); + + if (filter.isEmpty) { + setState(() { + filteredMembers = members + ?..sort((b, a) => a.powerLevel.compareTo(b.powerLevel)); + }); + return; + } + setState(() { + filteredMembers = members + ?.where( + (user) => + user.displayName?.toLowerCase().contains(filter) ?? + user.id.toLowerCase().contains(filter), + ) + .toList() + ?..sort((b, a) => a.powerLevel.compareTo(b.powerLevel)); + }); + } + + void refreshMembers() async { + try { + setState(() { + error = null; + }); + final participants = await Matrix.of(context) + .client + .getRoomById(widget.roomId) + ?.requestParticipants(); + + if (!mounted) return; + + setState(() { + members = participants; + }); + setFilter(); + } catch (e, s) { + Logs() + .d('Unable to request participants. Try again in 3 seconds...', e, s); + setState(() { + error = e; + }); + } + } + + @override + void initState() { + super.initState(); + refreshMembers(); + } + + @override + Widget build(BuildContext context) => ChatMembersView(this); +} diff --git a/lib/pages/chat_members/chat_members_view.dart b/lib/pages/chat_members/chat_members_view.dart new file mode 100644 index 0000000000..be53f99c7e --- /dev/null +++ b/lib/pages/chat_members/chat_members_view.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import '../../widgets/layouts/max_width_body.dart'; +import '../../widgets/matrix.dart'; +import '../chat_details/participant_list_item.dart'; +import 'chat_members.dart'; + +class ChatMembersView extends StatelessWidget { + final ChatMembersController controller; + const ChatMembersView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = + Matrix.of(context).client.getRoomById(controller.widget.roomId); + if (room == null) { + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).oopsSomethingWentWrong), + ), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final members = controller.filteredMembers; + + final roomCount = (room.summary.mJoinedMemberCount ?? 0) + + (room.summary.mInvitedMemberCount ?? 0); + + final error = controller.error; + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text( + L10n.of(context).countParticipants(roomCount), + ), + actions: [ + if (room.canInvite) + IconButton( + onPressed: () => context.go('/rooms/${room.id}/invite'), + icon: const Icon( + Icons.person_add_outlined, + ), + ), + ], + ), + body: MaxWidthBody( + withScrolling: false, + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: error != null + ? Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.error_outline), + Text(error.toLocalizedString(context)), + const SizedBox(height: 8), + OutlinedButton.icon( + onPressed: controller.refreshMembers, + icon: const Icon(Icons.refresh_outlined), + label: Text(L10n.of(context).tryAgain), + ), + ], + ), + ), + ) + : members == null + ? const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(), + ), + ) + : ListView.builder( + shrinkWrap: true, + itemCount: members.length + 1, + itemBuilder: (context, i) => i == 0 + ? Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + controller: controller.filterController, + onChanged: controller.setFilter, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + prefixIcon: const Icon(Icons.search_outlined), + hintText: L10n.of(context).search, + ), + ), + ) + : ParticipantListItem(members[i - 1]), + ), + ), + ); + } +} diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index 372edc5f44..e42917b940 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -2,18 +2,17 @@ import 'dart:developer'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; class ChatPermissionsSettings extends StatefulWidget { - const ChatPermissionsSettings({Key? key}) : super(key: key); + const ChatPermissionsSettings({super.key}); @override ChatPermissionsSettingsController createState() => @@ -21,21 +20,29 @@ class ChatPermissionsSettings extends StatefulWidget { } class ChatPermissionsSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; - void editPowerLevel(BuildContext context, String key, int currentLevel, - {String? category}) async { + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + void editPowerLevel( + BuildContext context, + String key, + int currentLevel, { + int? newLevel, + String? category, + }) async { final room = Matrix.of(context).client.getRoomById(roomId!)!; if (!room.canSendEvent(EventTypes.RoomPowerLevels)) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.noPermission))); + SnackBar(content: Text(L10n.of(context).noPermission)), + ); return; } - final newLevel = - await PermissionSliderDialog(initialPermission: currentLevel) - .show(context); + newLevel ??= await showPermissionChooser( + context, + currentLevel: currentLevel, + ); if (newLevel == null) return; final content = Map.from( - room.getState(EventTypes.RoomPowerLevels)!.content); + room.getState(EventTypes.RoomPowerLevels)!.content, + ); if (category != null) { if (!content.containsKey(category)) { content[category] = {}; @@ -64,38 +71,6 @@ class ChatPermissionsSettingsController extends State { false), ); - void updateRoomAction(Capabilities capabilities) async { - final room = Matrix.of(context).client.getRoomById(roomId!)!; - final String roomVersion = - room.getState(EventTypes.RoomCreate)!.content['room_version'] ?? '1'; - final newVersion = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.replaceRoomWithNewerVersion, - actions: capabilities.mRoomVersions!.available.entries - .where((r) => r.key != roomVersion) - .map((version) => AlertDialogAction( - key: version.key, - label: - '${version.key} (${version.value.toString().split('.').last})')) - .toList(), - ); - if (newVersion == null || - OkCancelResult.cancel == - await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - title: L10n.of(context)!.areYouSure, - )) { - return; - } - await showFutureLoadingDialog( - context: context, - future: () => room.client.upgradeRoom(roomId!, newVersion), - ).then((_) => VRouter.of(context).pop()); - } - @override Widget build(BuildContext context) => ChatPermissionsSettingsView(this); } diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart index 645d235887..b29fa9eed1 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; import 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart'; @@ -12,24 +11,18 @@ import 'package:fluffychat/widgets/matrix.dart'; class ChatPermissionsSettingsView extends StatelessWidget { final ChatPermissionsSettingsController controller; - const ChatPermissionsSettingsView(this.controller, {Key? key}) - : super(key: key); + const ChatPermissionsSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( appBar: AppBar( - leading: VRouter.of(context).path.startsWith('/spaces/') - ? null - : IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => VRouter.of(context) - .toSegments(['rooms', controller.roomId!]), - ), - title: Text(L10n.of(context)!.editChatPermissions), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).chatPermissions), ), body: MaxWidthBody( - withScrolling: true, child: StreamBuilder( stream: controller.onChanged, builder: (context, _) { @@ -38,95 +31,108 @@ class ChatPermissionsSettingsView extends StatelessWidget { ? null : Matrix.of(context).client.getRoomById(roomId); if (room == null) { - return Center(child: Text(L10n.of(context)!.noRoomsFound)); + return Center(child: Text(L10n.of(context).noRoomsFound)); } - final powerLevelsContent = Map.from( - room.getState(EventTypes.RoomPowerLevels)!.content); + final powerLevelsContent = Map.from( + room.getState(EventTypes.RoomPowerLevels)?.content ?? {}, + ); final powerLevels = Map.from(powerLevelsContent) ..removeWhere((k, v) => v is! int); - final eventsPowerLevels = - Map.from(powerLevelsContent['events'] ?? {}) - ..removeWhere((k, v) => v is! int); + final eventsPowerLevels = Map.from( + powerLevelsContent.tryGetMap('events') ?? {}, + )..removeWhere((k, v) => v is! int); return Column( children: [ + ListTile( + leading: const Icon(Icons.info_outlined), + subtitle: Text( + L10n.of(context).chatPermissionsDescription, + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).chatPermissions, + style: TextStyle( + color: theme.colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), Column( mainAxisSize: MainAxisSize.min, children: [ - for (var entry in powerLevels.entries) + for (final entry in powerLevels.entries) PermissionsListTile( permissionKey: entry.key, permission: entry.value, - onTap: () => controller.editPowerLevel( - context, entry.key, entry.value), + onChanged: (level) => controller.editPowerLevel( + context, + entry.key, + entry.value, + newLevel: level, + ), + canEdit: room.canChangePowerLevel, ), - const Divider(thickness: 1), + Divider(color: theme.dividerColor), ListTile( title: Text( - L10n.of(context)!.notifications, + L10n.of(context).notifications, style: TextStyle( - color: Theme.of(context).primaryColor, + color: theme.colorScheme.primary, fontWeight: FontWeight.bold, ), ), ), - Builder(builder: (context) { - const key = 'rooms'; - final int value = powerLevelsContent - .containsKey('notifications') - ? powerLevelsContent['notifications']['rooms'] ?? 0 - : 0; - return PermissionsListTile( - permissionKey: key, - permission: value, - category: 'notifications', - onTap: () => controller.editPowerLevel( - context, key, value, - category: 'notifications'), - ); - }), - const Divider(thickness: 1), + Builder( + builder: (context) { + const key = 'rooms'; + final value = powerLevelsContent + .containsKey('notifications') + ? powerLevelsContent + .tryGetMap('notifications') + ?.tryGet('rooms') ?? + 0 + : 0; + return PermissionsListTile( + permissionKey: key, + permission: value, + category: 'notifications', + canEdit: room.canChangePowerLevel, + onChanged: (level) => controller.editPowerLevel( + context, + key, + value, + newLevel: level, + category: 'notifications', + ), + ); + }, + ), + Divider(color: theme.dividerColor), ListTile( title: Text( - L10n.of(context)!.configureChat, + L10n.of(context).configureChat, style: TextStyle( - color: Theme.of(context).primaryColor, + color: theme.colorScheme.primary, fontWeight: FontWeight.bold, ), ), ), - for (var entry in eventsPowerLevels.entries) + for (final entry in eventsPowerLevels.entries) PermissionsListTile( permissionKey: entry.key, category: 'events', - permission: entry.value, - onTap: () => controller.editPowerLevel( - context, entry.key, entry.value, - category: 'events'), - ), - if (room.canSendEvent(EventTypes.RoomTombstone)) ...{ - const Divider(thickness: 1), - FutureBuilder( - future: room.client.getCapabilities(), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); - } - final String roomVersion = room - .getState(EventTypes.RoomCreate)! - .content['room_version'] ?? - '1'; - - return ListTile( - title: Text( - '${L10n.of(context)!.roomVersion}: $roomVersion'), - onTap: () => - controller.updateRoomAction(snapshot.data!), - ); - }, + permission: entry.value ?? 0, + canEdit: room.canChangePowerLevel, + onChanged: (level) => controller.editPowerLevel( + context, + entry.key, + entry.value ?? 0, + newLevel: level, + category: 'events', + ), ), - }, ], ), ], diff --git a/lib/pages/chat_permissions_settings/permission_list_tile.dart b/lib/pages/chat_permissions_settings/permission_list_tile.dart index f16a40d8a0..bb5e03dccf 100644 --- a/lib/pages/chat_permissions_settings/permission_list_tile.dart +++ b/lib/pages/chat_permissions_settings/permission_list_tile.dart @@ -3,61 +3,67 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; + class PermissionsListTile extends StatelessWidget { final String permissionKey; final int permission; final String? category; - final void Function()? onTap; + final void Function(int? level)? onChanged; + final bool canEdit; const PermissionsListTile({ - Key? key, + super.key, required this.permissionKey, required this.permission, this.category, - this.onTap, - }) : super(key: key); + required this.onChanged, + required this.canEdit, + }); String getLocalizedPowerLevelString(BuildContext context) { if (category == null) { switch (permissionKey) { case 'users_default': - return L10n.of(context)!.defaultPermissionLevel; + return L10n.of(context).defaultPermissionLevel; case 'events_default': - return L10n.of(context)!.sendMessages; + return L10n.of(context).sendMessages; case 'state_default': - return L10n.of(context)!.configureChat; + return L10n.of(context).changeGeneralChatSettings; case 'ban': - return L10n.of(context)!.banFromChat; + return L10n.of(context).banFromChat; case 'kick': - return L10n.of(context)!.kickFromChat; + return L10n.of(context).kickFromChat; case 'redact': - return L10n.of(context)!.deleteMessage; + return L10n.of(context).deleteMessage; case 'invite': - return L10n.of(context)!.inviteContact; + return L10n.of(context).inviteOtherUsers; } } else if (category == 'notifications') { switch (permissionKey) { case 'rooms': - return L10n.of(context)!.notifications; + return L10n.of(context).sendRoomNotifications; } } else if (category == 'events') { switch (permissionKey) { case EventTypes.RoomName: - return L10n.of(context)!.changeTheNameOfTheGroup; + return L10n.of(context).changeTheNameOfTheGroup; + case EventTypes.RoomTopic: + return L10n.of(context).changeTheDescriptionOfTheGroup; case EventTypes.RoomPowerLevels: - return L10n.of(context)!.editChatPermissions; + return L10n.of(context).changeTheChatPermissions; case EventTypes.HistoryVisibility: - return L10n.of(context)!.visibilityOfTheChatHistory; + return L10n.of(context).changeTheVisibilityOfChatHistory; case EventTypes.RoomCanonicalAlias: - return L10n.of(context)!.setInvitationLink; + return L10n.of(context).changeTheCanonicalRoomAlias; case EventTypes.RoomAvatar: - return L10n.of(context)!.editRoomAvatar; + return L10n.of(context).editRoomAvatar; case EventTypes.RoomTombstone: - return L10n.of(context)!.replaceRoomWithNewerVersion; + return L10n.of(context).replaceRoomWithNewerVersion; case EventTypes.Encryption: - return L10n.of(context)!.enableEncryption; + return L10n.of(context).enableEncryption; case 'm.room.server_acl': - return L10n.of(context)!.editBlockedServers; + return L10n.of(context).editBlockedServers; } } return permissionKey; @@ -65,40 +71,56 @@ class PermissionsListTile extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final color = permission >= 100 + ? Colors.orangeAccent + : permission >= 50 + ? Colors.blueAccent + : Colors.greenAccent; return ListTile( - onTap: onTap, - leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: const Icon(Icons.edit_attributes_outlined), + title: Text( + getLocalizedPowerLevelString(context), + style: theme.textTheme.titleSmall, ), - title: Text(getLocalizedPowerLevelString(context)), - subtitle: Row( - children: [ - Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: BorderRadius.circular(8), + trailing: Material( + color: color.withAlpha(32), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: DropdownButton( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + underline: const SizedBox.shrink(), + onChanged: canEdit ? onChanged : null, + value: permission, + items: [ + DropdownMenuItem( + value: permission < 50 ? permission : 0, + child: Text( + L10n.of(context).userLevel(permission < 50 ? permission : 0), + ), + ), + DropdownMenuItem( + value: permission < 100 && permission >= 50 ? permission : 50, + child: Text( + L10n.of(context).moderatorLevel( + permission < 100 && permission >= 50 ? permission : 50, + ), + ), + ), + DropdownMenuItem( + value: permission >= 100 ? permission : 100, + child: Text( + L10n.of(context) + .adminLevel(permission >= 100 ? permission : 100), + ), ), - child: Center( - child: Text(permission.toString()), + DropdownMenuItem( + value: null, + child: Text(L10n.of(context).custom), ), - ), - const SizedBox(width: 8), - Text(permission.toLocalizedPowerLevelString(context)), - ], + ], + ), ), ); } } - -extension on int { - String toLocalizedPowerLevelString(BuildContext context) { - return this == 100 - ? L10n.of(context)!.admin - : this >= 50 - ? L10n.of(context)!.moderator - : L10n.of(context)!.participant; - } -} diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart new file mode 100644 index 0000000000..59a2f26e28 --- /dev/null +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -0,0 +1,175 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; + +class ChatSearchFilesTab extends StatelessWidget { + final Room room; + final Stream<(List, String?)>? searchStream; + final void Function({ + String? prevBatch, + List? previousSearchResult, + }) startSearch; + + const ChatSearchFilesTab({ + required this.room, + required this.startSearch, + required this.searchStream, + super.key, + }); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: searchStream, + builder: (context, snapshot) { + final theme = Theme.of(context); + final events = snapshot.data?.$1; + if (searchStream == null || events == null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator.adaptive(strokeWidth: 2), + const SizedBox(height: 8), + Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + ), + ), + ], + ); + } + + if (events.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.file_present_outlined, size: 64), + const SizedBox(height: 8), + Text(L10n.of(context).nothingFound), + ], + ); + } + + return SelectionArea( + child: ListView.builder( + padding: const EdgeInsets.all(8.0), + itemCount: events.length + 1, + itemBuilder: (context, i) { + if (i == events.length) { + if (snapshot.connectionState != ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ); + } + final nextBatch = snapshot.data?.$2; + if (nextBatch == null) { + return const SizedBox.shrink(); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: () => startSearch( + prevBatch: nextBatch, + previousSearchResult: events, + ), + icon: const Icon( + Icons.arrow_downward_outlined, + ), + label: Text(L10n.of(context).searchMore), + ), + ), + ); + } + final event = events[i]; + final filename = event.content.tryGet('filename') ?? + event.content.tryGet('body') ?? + L10n.of(context).unknownEvent('File'); + final filetype = (filename.contains('.') + ? filename.split('.').last.toUpperCase() + : event.content + .tryGetMap('info') + ?.tryGet('mimetype') + ?.toUpperCase() ?? + 'UNKNOWN'); + final sizeString = event.sizeString; + final prevEvent = i > 0 ? events[i - 1] : null; + final sameEnvironment = prevEvent == null + ? false + : prevEvent.originServerTs + .sameEnvironment(event.originServerTs); + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!sameEnvironment) ...[ + Row( + children: [ + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + event.originServerTs.localizedTime(context), + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + ], + ), + const SizedBox(height: 4), + ], + Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.onInverseSurface, + clipBehavior: Clip.hardEdge, + child: ListTile( + leading: const Icon(Icons.file_present_outlined), + title: Text( + filename, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text('$sizeString | $filetype'), + onTap: () => event.saveFile(context), + ), + ), + ], + ), + ); + }, + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat_search/chat_search_images_tab.dart b/lib/pages/chat_search/chat_search_images_tab.dart new file mode 100644 index 0000000000..a930ed02d8 --- /dev/null +++ b/lib/pages/chat_search/chat_search_images_tab.dart @@ -0,0 +1,168 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:intl/intl.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat/events/image_bubble.dart'; +import 'package:fluffychat/pages/chat/events/video_player.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; + +class ChatSearchImagesTab extends StatelessWidget { + final Room room; + final Stream<(List, String?)>? searchStream; + final void Function({ + String? prevBatch, + List? previousSearchResult, + }) startSearch; + + const ChatSearchImagesTab({ + required this.room, + required this.startSearch, + required this.searchStream, + super.key, + }); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: searchStream, + builder: (context, snapshot) { + final theme = Theme.of(context); + final events = snapshot.data?.$1; + if (searchStream == null || events == null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator.adaptive(strokeWidth: 2), + const SizedBox(height: 8), + Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + ), + ), + ], + ); + } + if (events.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.photo_outlined, size: 64), + const SizedBox(height: 8), + Text(L10n.of(context).nothingFound), + ], + ); + } + final eventsByMonth = >{}; + for (final event in events) { + final month = DateTime( + event.originServerTs.year, + event.originServerTs.month, + ); + eventsByMonth[month] ??= []; + eventsByMonth[month]!.add(event); + } + final eventsByMonthList = eventsByMonth.entries.toList(); + + const padding = 8.0; + + return ListView.builder( + itemCount: eventsByMonth.length + 1, + itemBuilder: (context, i) { + if (i == eventsByMonth.length) { + if (snapshot.connectionState != ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ); + } + final nextBatch = snapshot.data?.$2; + if (nextBatch == null) { + return const SizedBox.shrink(); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: () => startSearch( + prevBatch: nextBatch, + previousSearchResult: events, + ), + icon: const Icon( + Icons.arrow_downward_outlined, + ), + label: Text(L10n.of(context).searchMore), + ), + ), + ); + } + + final monthEvents = eventsByMonthList[i].value; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 4), + Row( + children: [ + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + DateFormat.yMMMM( + Localizations.localeOf(context).languageCode, + ).format(eventsByMonthList[i].key), + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + ], + ), + GridView.count( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + mainAxisSpacing: padding, + crossAxisSpacing: padding, + padding: const EdgeInsets.all(padding), + crossAxisCount: 3, + children: monthEvents.map( + (event) { + if (event.messageType == MessageTypes.Video) { + return EventVideoPlayer(event); + } + return ImageBubble( + event, + fit: BoxFit.cover, + ); + }, + ).toList(), + ), + ], + ); + }, + ); + }, + ); + } +} diff --git a/lib/pages/chat_search/chat_search_message_tab.dart b/lib/pages/chat_search/chat_search_message_tab.dart new file mode 100644 index 0000000000..7c7024e8d0 --- /dev/null +++ b/lib/pages/chat_search/chat_search_message_tab.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; + +class ChatSearchMessageTab extends StatelessWidget { + final String searchQuery; + final Room room; + final Stream<(List, String?)>? searchStream; + final void Function({ + String? prevBatch, + List? previousSearchResult, + }) startSearch; + + const ChatSearchMessageTab({ + required this.searchQuery, + required this.room, + required this.searchStream, + required this.startSearch, + super.key, + }); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + key: ValueKey(searchQuery), + stream: searchStream, + builder: (context, snapshot) { + final theme = Theme.of(context); + if (searchStream == null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.search_outlined, size: 64), + const SizedBox(height: 8), + Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + ), + ), + ], + ); + } + final events = snapshot.data?.$1 ?? []; + + return SelectionArea( + child: ListView.separated( + itemCount: events.length + 1, + separatorBuilder: (context, _) => Divider( + color: theme.dividerColor, + height: 1, + ), + itemBuilder: (context, i) { + if (i == events.length) { + if (snapshot.connectionState != ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ); + } + final nextBatch = snapshot.data?.$2; + if (nextBatch == null) { + return const SizedBox.shrink(); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: () => startSearch( + prevBatch: nextBatch, + previousSearchResult: events, + ), + icon: const Icon( + Icons.arrow_downward_outlined, + ), + label: Text(L10n.of(context).searchMore), + ), + ), + ); + } + final event = events[i]; + final sender = event.senderFromMemoryOrFallback; + final displayname = sender.calcDisplayname( + i18n: MatrixLocals(L10n.of(context)), + ); + return _MessageSearchResultListTile( + sender: sender, + displayname: displayname, + event: event, + room: room, + ); + }, + ), + ); + }, + ); + } +} + +class _MessageSearchResultListTile extends StatelessWidget { + const _MessageSearchResultListTile({ + required this.sender, + required this.displayname, + required this.event, + required this.room, + }); + + final User sender; + final String displayname; + final Event event; + final Room room; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ListTile( + title: Row( + children: [ + Avatar( + mxContent: sender.avatarUrl, + name: displayname, + size: 16, + ), + const SizedBox(width: 8), + Text( + displayname, + ), + Expanded( + child: Text( + ' | ${event.originServerTs.localizedTimeShort(context)}', + style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + subtitle: Linkify( + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + text: event + .calcLocalizedBodyFallback( + plaintextBody: true, + removeMarkdown: true, + MatrixLocals( + L10n.of(context), + ), + ) + .trim(), + maxLines: 7, + overflow: TextOverflow.ellipsis, + ), + trailing: IconButton( + icon: const Icon( + Icons.chevron_right_outlined, + ), + onPressed: () => context.go( + '/${Uri( + pathSegments: ['rooms', room.id], + queryParameters: {'event': event.eventId}, + )}', + ), + ), + ); + } +} diff --git a/lib/pages/chat_search/chat_search_page.dart b/lib/pages/chat_search/chat_search_page.dart new file mode 100644 index 0000000000..40109d0b64 --- /dev/null +++ b/lib/pages/chat_search/chat_search_page.dart @@ -0,0 +1,196 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_search/chat_search_view.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ChatSearchPage extends StatefulWidget { + final String roomId; + const ChatSearchPage({required this.roomId, super.key}); + + @override + ChatSearchController createState() => ChatSearchController(); +} + +class ChatSearchController extends State + with SingleTickerProviderStateMixin { + Room? get room => Matrix.of(context).client.getRoomById(widget.roomId); + + final TextEditingController searchController = TextEditingController(); + late final TabController tabController; + + Timeline? timeline; + + Stream<(List, String?)>? searchStream; + Stream<(List, String?)>? galleryStream; + Stream<(List, String?)>? fileStream; + + void restartSearch() { + if (searchController.text.isEmpty) { + setState(() { + searchStream = null; + }); + return; + } + setState(() { + searchStream = const Stream.empty(); + }); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + startMessageSearch(); + }); + } + + void startMessageSearch({ + String? prevBatch, + List? previousSearchResult, + }) async { + final timeline = this.timeline ??= await room!.getTimeline(); + + if (tabController.index == 0 && searchController.text.isEmpty) { + return; + } + + setState(() { + searchStream = timeline + .startSearch( + searchTerm: searchController.text, + prevBatch: prevBatch, + requestHistoryCount: 1000, + limit: 32, + ) + .map( + (result) => ( + [ + if (previousSearchResult != null) ...previousSearchResult, + ...result.$1, + ], + result.$2, + ), + ) + // Deduplication workaround for + // https://github.com/famedly/matrix-dart-sdk/issues/1831 + .map( + (result) => ( + { + for (final event in result.$1) event.eventId: event, + }.values.toList(), + result.$2, + ), + ) + .asBroadcastStream(); + }); + } + + void startGallerySearch({ + String? prevBatch, + List? previousSearchResult, + }) async { + final timeline = this.timeline ??= await room!.getTimeline(); + + setState(() { + galleryStream = timeline + .startSearch( + searchFunc: (event) => { + MessageTypes.Image, + MessageTypes.Video, + }.contains(event.messageType), + prevBatch: prevBatch, + requestHistoryCount: 1000, + limit: 32, + ) + .map( + (result) => ( + [ + if (previousSearchResult != null) ...previousSearchResult, + ...result.$1, + ], + result.$2, + ), + ) + // Deduplication workaround for + // https://github.com/famedly/matrix-dart-sdk/issues/1831 + .map( + (result) => ( + { + for (final event in result.$1) event.eventId: event, + }.values.toList(), + result.$2, + ), + ) + .asBroadcastStream(); + }); + } + + void startFileSearch({ + String? prevBatch, + List? previousSearchResult, + }) async { + final timeline = this.timeline ??= await room!.getTimeline(); + + setState(() { + fileStream = timeline + .startSearch( + searchFunc: (event) => + event.messageType == MessageTypes.File || + (event.messageType == MessageTypes.Audio && + !event.content.containsKey('org.matrix.msc3245.voice')), + prevBatch: prevBatch, + requestHistoryCount: 1000, + limit: 32, + ) + .map( + (result) => ( + [ + if (previousSearchResult != null) ...previousSearchResult, + ...result.$1, + ], + result.$2, + ), + ) + // Deduplication workaround for + // https://github.com/famedly/matrix-dart-sdk/issues/1831 + .map( + (result) => ( + { + for (final event in result.$1) event.eventId: event, + }.values.toList(), + result.$2, + ), + ) + .asBroadcastStream(); + }); + } + + void _onTabChanged() { + switch (tabController.index) { + case 1: + startGallerySearch(); + break; + case 2: + startFileSearch(); + break; + default: + restartSearch(); + break; + } + } + + @override + void initState() { + super.initState(); + tabController = TabController(initialIndex: 0, length: 3, vsync: this); + tabController.addListener(_onTabChanged); + } + + @override + void dispose() { + tabController.removeListener(_onTabChanged); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ChatSearchView(this); +} diff --git a/lib/pages/chat_search/chat_search_view.dart b/lib/pages/chat_search/chat_search_view.dart new file mode 100644 index 0000000000..1f458ca98e --- /dev/null +++ b/lib/pages/chat_search/chat_search_view.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class ChatSearchView extends StatelessWidget { + final ChatSearchController controller; + + const ChatSearchView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = controller.room; + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ), + ); + } + + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + titleSpacing: 0, + title: Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + ), + ), + ), + body: MaxWidthBody( + withScrolling: false, + child: Column( + children: [ + if (FluffyThemes.isThreeColumnMode(context)) + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), + child: TextField( + controller: controller.searchController, + onSubmitted: (_) => controller.restartSearch(), + autofocus: true, + enabled: controller.tabController.index == 0, + decoration: InputDecoration( + hintText: L10n.of(context).search, + suffixIcon: const Icon(Icons.search_outlined), + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + ), + ), + ), + TabBar( + controller: controller.tabController, + tabs: [ + Tab(child: Text(L10n.of(context).messages)), + Tab(child: Text(L10n.of(context).gallery)), + Tab(child: Text(L10n.of(context).files)), + ], + ), + Expanded( + child: TabBarView( + controller: controller.tabController, + children: [ + ChatSearchMessageTab( + searchQuery: controller.searchController.text, + room: room, + startSearch: controller.startMessageSearch, + searchStream: controller.searchStream, + ), + ChatSearchImagesTab( + room: room, + startSearch: controller.startGallerySearch, + searchStream: controller.galleryStream, + ), + ChatSearchFilesTab( + room: room, + startSearch: controller.startFileSearch, + searchStream: controller.fileStream, + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/connect/connect_page.dart b/lib/pages/connect/connect_page.dart deleted file mode 100644 index 01086becd3..0000000000 --- a/lib/pages/connect/connect_page.dart +++ /dev/null @@ -1,191 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pages/connect/connect_page_view.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class ConnectPage extends StatefulWidget { - const ConnectPage({Key? key}) : super(key: key); - - @override - State createState() => ConnectPageController(); -} - -class ConnectPageController extends State { - final TextEditingController usernameController = TextEditingController(); - String? signupError; - bool loading = false; - - void pickAvatar() async { - final source = !PlatformInfos.isMobile - ? ImageSource.gallery - : await showModalActionSheet( - context: context, - title: L10n.of(context)!.changeYourAvatar, - actions: [ - SheetAction( - key: ImageSource.camera, - label: L10n.of(context)!.openCamera, - isDefaultAction: true, - icon: Icons.camera_alt_outlined, - ), - SheetAction( - key: ImageSource.gallery, - label: L10n.of(context)!.openGallery, - icon: Icons.photo_outlined, - ), - ], - ); - if (source == null) return; - final picked = await ImagePicker().pickImage( - source: source, - imageQuality: 50, - maxWidth: 512, - maxHeight: 512, - ); - setState(() { - Matrix.of(context).loginAvatar = picked; - }); - } - - void signUp() async { - usernameController.text = usernameController.text.trim(); - final localpart = - usernameController.text.toLowerCase().replaceAll(' ', '_'); - if (localpart.isEmpty) { - setState(() { - signupError = L10n.of(context)!.pleaseChooseAUsername; - }); - return; - } - - setState(() { - signupError = null; - loading = true; - }); - - try { - try { - await Matrix.of(context).getLoginClient().register(username: localpart); - } on MatrixException catch (e) { - if (!e.requireAdditionalAuthentication) rethrow; - } - setState(() { - loading = false; - }); - Matrix.of(context).loginUsername = usernameController.text; - VRouter.of(context).to('signup'); - } catch (e, s) { - Logs().d('Sign up failed', e, s); - setState(() { - signupError = e.toLocalizedString(context); - loading = false; - }); - } - } - - bool _supportsFlow(String flowType) => - Matrix.of(context) - .loginHomeserverSummary - ?.loginFlows - .any((flow) => flow.type == flowType) ?? - false; - - bool get supportsSso => - (PlatformInfos.isMobile || - PlatformInfos.isWeb || - PlatformInfos.isMacOS) && - _supportsFlow('m.login.sso'); - - bool get supportsLogin => _supportsFlow('m.login.password'); - - void login() => VRouter.of(context).to('login'); - - Map? _rawLoginTypes; - - List? get identityProviders { - final loginTypes = _rawLoginTypes; - if (loginTypes == null) return null; - final rawProviders = loginTypes.tryGetList('flows')!.singleWhere((flow) => - flow['type'] == AuthenticationTypes.sso)['identity_providers']; - final list = (rawProviders as List) - .map((json) => IdentityProvider.fromJson(json)) - .toList(); - if (PlatformInfos.isCupertinoStyle) { - list.sort((a, b) => a.brand == 'apple' ? -1 : 1); - } - return list; - } - - void ssoLoginAction(String id) async { - final redirectUrl = kIsWeb - ? html.window.origin! + '/web/auth.html' - : AppConfig.appOpenUrlScheme.toLowerCase() + '://login'; - final url = - '${Matrix.of(context).getLoginClient().homeserver?.toString()}/_matrix/client/r0/login/sso/redirect/${Uri.encodeComponent(id)}?redirectUrl=${Uri.encodeQueryComponent(redirectUrl)}'; - final urlScheme = Uri.parse(redirectUrl).scheme; - final result = await FlutterWebAuth.authenticate( - url: url, - callbackUrlScheme: urlScheme, - ); - final token = Uri.parse(result).queryParameters['loginToken']; - if (token?.isEmpty ?? false) return; - - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).getLoginClient().login( - LoginType.mLoginToken, - token: token, - initialDeviceDisplayName: PlatformInfos.clientName, - ), - ); - } - - @override - void initState() { - super.initState(); - if (supportsSso) { - Matrix.of(context) - .getLoginClient() - .request( - RequestType.GET, - '/client/r0/login', - ) - .then((loginTypes) => setState(() { - _rawLoginTypes = loginTypes; - })); - } - } - - @override - Widget build(BuildContext context) => ConnectPageView(this); -} - -class IdentityProvider { - final String? id; - final String? name; - final String? icon; - final String? brand; - - IdentityProvider({this.id, this.name, this.icon, this.brand}); - - factory IdentityProvider.fromJson(Map json) => - IdentityProvider( - id: json['id'], - name: json['name'], - icon: json['icon'], - brand: json['brand'], - ); -} diff --git a/lib/pages/connect/connect_page_view.dart b/lib/pages/connect/connect_page_view.dart deleted file mode 100644 index 2695726e14..0000000000 --- a/lib/pages/connect/connect_page_view.dart +++ /dev/null @@ -1,176 +0,0 @@ -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/pages/connect/connect_page.dart'; -import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'sso_button.dart'; - -class ConnectPageView extends StatelessWidget { - final ConnectPageController controller; - const ConnectPageView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final avatar = Matrix.of(context).loginAvatar; - final identityProviders = controller.identityProviders; - return LoginScaffold( - appBar: AppBar( - automaticallyImplyLeading: !controller.loading, - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - centerTitle: true, - title: Text( - Matrix.of(context).getLoginClient().homeserver?.host ?? '', - style: const TextStyle(color: Colors.white), - ), - ), - body: ListView( - children: [ - if (Matrix.of(context).loginRegistrationSupported ?? false) ...[ - Padding( - padding: const EdgeInsets.all(16.0), - child: Center( - child: Stack( - children: [ - Material( - borderRadius: BorderRadius.circular(64), - elevation: 10, - color: Colors.transparent, - clipBehavior: Clip.hardEdge, - child: CircleAvatar( - radius: 64, - backgroundColor: Colors.white.withAlpha(200), - child: avatar == null - ? const Icon( - Icons.person_outlined, - color: Colors.black, - size: 64, - ) - : FutureBuilder( - future: avatar.readAsBytes(), - builder: (context, snapshot) { - final bytes = snapshot.data; - if (bytes == null) { - return const CircularProgressIndicator - .adaptive(); - } - return Image.memory( - bytes, - fit: BoxFit.cover, - width: 128, - height: 128, - ); - }, - ), - ), - ), - Positioned( - bottom: 0, - right: 0, - child: FloatingActionButton( - mini: true, - onPressed: controller.pickAvatar, - backgroundColor: Colors.white, - foregroundColor: Colors.black, - child: const Icon(Icons.camera_alt_outlined), - ), - ), - ], - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - controller: controller.usernameController, - onSubmitted: (_) => controller.signUp(), - decoration: InputDecoration( - prefixIcon: const Icon(Icons.account_box_outlined), - hintText: L10n.of(context)!.chooseAUsername, - errorText: controller.signupError, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Hero( - tag: 'loginButton', - child: ElevatedButton( - onPressed: controller.loading ? () {} : controller.signUp, - child: controller.loading - ? const LinearProgressIndicator() - : Text(L10n.of(context)!.signUp), - ), - ), - ), - Row( - children: [ - const Expanded(child: Divider(color: Colors.white)), - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - L10n.of(context)!.or, - style: const TextStyle(color: Colors.white), - ), - ), - const Expanded(child: Divider(color: Colors.white)), - ], - ), - ], - if (controller.supportsSso) - identityProviders == null - ? const SizedBox( - height: 74, - child: Center( - child: CircularProgressIndicator.adaptive( - backgroundColor: Colors.white, - )), - ) - : Center( - child: identityProviders.length == 1 - ? Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - onPressed: () => controller - .ssoLoginAction(identityProviders.single.id!), - child: Text(identityProviders.single.name ?? - identityProviders.single.brand ?? - L10n.of(context)!.loginWithOneClick), - ), - ) - : Wrap( - children: [ - for (final identityProvider in identityProviders) - SsoButton( - onPressed: () => controller - .ssoLoginAction(identityProvider.id!), - identityProvider: identityProvider, - ), - ].toList(), - ), - ), - if (controller.supportsLogin) - Padding( - padding: const EdgeInsets.all(16.0), - child: Hero( - tag: 'signinButton', - child: ElevatedButton( - onPressed: controller.loading ? () {} : controller.login, - child: Text(L10n.of(context)!.login), - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/pages/connect/sso_button.dart b/lib/pages/connect/sso_button.dart deleted file mode 100644 index 1a099da2ea..0000000000 --- a/lib/pages/connect/sso_button.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pages/connect/connect_page.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class SsoButton extends StatelessWidget { - final IdentityProvider identityProvider; - final void Function()? onPressed; - const SsoButton({ - Key? key, - required this.identityProvider, - this.onPressed, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onPressed, - borderRadius: BorderRadius.circular(7), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Material( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - clipBehavior: Clip.hardEdge, - child: Padding( - padding: const EdgeInsets.all(4.0), - child: identityProvider.icon == null - ? const Icon(Icons.web_outlined) - : CachedNetworkImage( - imageUrl: Uri.parse(identityProvider.icon!) - .getDownloadLink( - Matrix.of(context).getLoginClient()) - .toString(), - width: 32, - height: 32, - ), - ), - ), - const SizedBox(height: 8), - Text( - identityProvider.name ?? - identityProvider.brand ?? - L10n.of(context)!.singlesignon, - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index 294e2ed338..566583f5e8 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -1,18 +1,19 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart' show IterableExtension; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/device_settings/device_settings_view.dart'; import 'package:fluffychat/pages/key_verification/key_verification_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../../widgets/matrix.dart'; class DevicesSettings extends StatefulWidget { - const DevicesSettings({Key? key}) : super(key: key); + const DevicesSettings({super.key}); @override DevicesSettingsController createState() => DevicesSettingsController(); @@ -28,63 +29,73 @@ class DevicesSettingsController extends State { void reload() => setState(() => devices = null); - bool loadingDeletingDevices = false; - String? errorDeletingDevices; + bool? chatBackupEnabled; + + @override + void initState() { + _checkChatBackup(); + super.initState(); + } + + void _checkChatBackup() async { + final client = Matrix.of(context).client; + if (client.encryption?.keyManager.enabled == true) { + if (await client.encryption?.keyManager.isCached() == false || + await client.encryption?.crossSigning.isCached() == false || + client.isUnknownSession && !mounted) { + setState(() { + chatBackupEnabled = false; + }); + return; + } + } + } void removeDevicesAction(List devices) async { if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).remove, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).removeDevicesDescription, + isDestructive: true, ) == - OkCancelResult.cancel) return; + OkCancelResult.cancel) { + return; + } final matrix = Matrix.of(context); final deviceIds = []; for (final userDevice in devices) { deviceIds.add(userDevice.deviceId); } - try { - setState(() { - loadingDeletingDevices = true; - errorDeletingDevices = null; - }); - await matrix.client.uiaRequestBackground( + await showFutureLoadingDialog( + context: context, + delay: false, + future: () => matrix.client.uiaRequestBackground( (auth) => matrix.client.deleteDevices( deviceIds, auth: auth, ), - ); - reload(); - } catch (e, s) { - Logs().v('Error while deleting devices', e, s); - setState(() => errorDeletingDevices = e.toString()); - } finally { - setState(() => loadingDeletingDevices = false); - } + ), + ); + reload(); } void renameDeviceAction(Device device) async { final displayName = await showTextInputDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.changeDeviceName, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: device.displayName, - ) - ], + title: L10n.of(context).changeDeviceName, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: device.displayName, ); if (displayName == null) return; final success = await showFutureLoadingDialog( context: context, future: () => Matrix.of(context) .client - .updateDevice(device.deviceId, displayName: displayName.single), + .updateDevice(device.deviceId, displayName: displayName), ); if (success.error == null) { reload(); @@ -92,7 +103,15 @@ class DevicesSettingsController extends State { } void verifyDeviceAction(Device device) async { - final req = Matrix.of(context) + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).verifyOtherDevice, + message: L10n.of(context).verifyOtherDeviceDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + final req = await Matrix.of(context) .client .userDeviceKeys[Matrix.of(context).client.userID!]! .deviceKeys[device.deviceId]! diff --git a/lib/pages/device_settings/device_settings_view.dart b/lib/pages/device_settings/device_settings_view.dart index 5ac489fbb0..01880512c6 100644 --- a/lib/pages/device_settings/device_settings_view.dart +++ b/lib/pages/device_settings/device_settings_view.dart @@ -9,19 +9,20 @@ import 'user_device_list_item.dart'; class DevicesSettingsView extends StatelessWidget { final DevicesSettingsController controller; - const DevicesSettingsView(this.controller, {Key? key}) : super(key: key); + const DevicesSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.devices), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).devices), ), body: MaxWidthBody( child: FutureBuilder( future: controller.loadUserDevices(context), builder: (BuildContext context, snapshot) { + final theme = Theme.of(context); if (snapshot.hasError) { return Center( child: Column( @@ -35,16 +36,47 @@ class DevicesSettingsView extends StatelessWidget { } if (!snapshot.hasData || controller.devices == null) { return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2)); + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); } return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), itemCount: controller.notThisDevice.length + 1, itemBuilder: (BuildContext context, int i) { if (i == 0) { return Column( mainAxisSize: MainAxisSize.min, children: [ - if (controller.thisDevice != null) + if (controller.chatBackupEnabled == false) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: ListTile( + leading: const CircleAvatar( + child: Icon(Icons.info_outlined), + ), + subtitle: Text( + L10n.of(context) + .noticeChatBackupDeviceVerification, + ), + ), + ), + if (controller.thisDevice != null) ...[ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + alignment: Alignment.centerLeft, + child: Text( + L10n.of(context).thisDevice, + style: TextStyle( + fontWeight: FontWeight.bold, + color: theme.colorScheme.primary, + ), + textAlign: TextAlign.left, + ), + ), UserDeviceListItem( controller.thisDevice!, rename: controller.renameDeviceAction, @@ -53,24 +85,39 @@ class DevicesSettingsView extends StatelessWidget { block: controller.blockDeviceAction, unblock: controller.unblockDeviceAction, ), - const Divider(height: 1), + ], if (controller.notThisDevice.isNotEmpty) - ListTile( - title: Text( - controller.errorDeletingDevices ?? - L10n.of(context)!.removeAllOtherDevices, - style: const TextStyle(color: Colors.red), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: SizedBox( + width: double.infinity, + child: TextButton.icon( + label: Text( + L10n.of(context).removeAllOtherDevices, + ), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.onErrorContainer, + backgroundColor: + theme.colorScheme.errorContainer, + ), + icon: const Icon(Icons.delete_outline), + onPressed: () => controller.removeDevicesAction( + controller.notThisDevice, + ), + ), + ), + ) + else + Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text(L10n.of(context).noOtherDevicesFound), ), - trailing: controller.loadingDeletingDevices - ? const CircularProgressIndicator.adaptive( - strokeWidth: 2) - : const Icon(Icons.delete_outline), - onTap: controller.loadingDeletingDevices - ? null - : () => controller.removeDevicesAction( - controller.notThisDevice), ), - const Divider(height: 1), ], ); } diff --git a/lib/pages/device_settings/user_device_list_item.dart b/lib/pages/device_settings/user_device_list_item.dart index e65dc6db04..5c9e803290 100644 --- a/lib/pages/device_settings/user_device_list_item.dart +++ b/lib/pages/device_settings/user_device_list_item.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; import '../../utils/date_time_extension.dart'; -import '../../utils/matrix_sdk_extensions.dart/device_extension.dart'; +import '../../utils/matrix_sdk_extensions/device_extension.dart'; import '../../widgets/matrix.dart'; enum UserDeviceListItemAction { @@ -31,112 +32,122 @@ class UserDeviceListItem extends StatelessWidget { required this.verify, required this.block, required this.unblock, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { - final keys = Matrix.of(context) - .client - .userDeviceKeys[Matrix.of(context).client.userID] + final client = Matrix.of(context).client; + final keys = client.userDeviceKeys[Matrix.of(context).client.userID] ?.deviceKeys[userDevice.deviceId]; + final isOwnDevice = userDevice.deviceId == client.deviceID; - return ListTile( - onTap: () async { - final action = await showModalActionSheet( - context: context, - title: '${userDevice.displayName} (${userDevice.deviceId})', - actions: [ - SheetAction( - key: UserDeviceListItemAction.rename, - label: L10n.of(context)!.changeDeviceName, - ), - if (keys != null) ...{ - SheetAction( - key: UserDeviceListItemAction.verify, - label: L10n.of(context)!.verifyStart, - ), - if (!keys.blocked) - SheetAction( - key: UserDeviceListItemAction.block, - label: L10n.of(context)!.blockDevice, - isDestructiveAction: true, - ), - if (keys.blocked) - SheetAction( - key: UserDeviceListItemAction.unblock, - label: L10n.of(context)!.unblockDevice, - isDestructiveAction: true, + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + onTap: () async { + final action = await showModalActionPopup( + context: context, + title: '${userDevice.displayName} (${userDevice.deviceId})', + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: UserDeviceListItemAction.rename, + icon: const Icon(Icons.edit_outlined), + label: L10n.of(context).changeDeviceName, ), - }, - SheetAction( - key: UserDeviceListItemAction.remove, - label: L10n.of(context)!.delete, - isDestructiveAction: true, - ), - ], - ); - if (action == null) return; - switch (action) { - case UserDeviceListItemAction.rename: - rename(userDevice); - break; - case UserDeviceListItemAction.remove: - remove(userDevice); - break; - case UserDeviceListItemAction.verify: - verify(userDevice); - break; - case UserDeviceListItemAction.block: - block(userDevice); - break; - case UserDeviceListItemAction.unblock: - unblock(userDevice); - break; - } - }, - leading: CircleAvatar( - foregroundColor: Colors.white, - backgroundColor: keys == null - ? Colors.grey[700] - : keys.blocked - ? Colors.red - : keys.verified - ? Colors.green - : Colors.orange, - child: Icon(userDevice.icon), - ), - title: Row( - children: [ - Expanded( - child: Text( - userDevice.displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - if (keys != null) - Text( - keys.blocked - ? L10n.of(context)!.blocked - : keys.verified - ? L10n.of(context)!.verified - : L10n.of(context)!.unverified, - style: TextStyle( - color: keys.blocked + if (!isOwnDevice && keys != null) ...{ + AdaptiveModalAction( + value: UserDeviceListItemAction.verify, + icon: const Icon(Icons.verified_outlined), + label: L10n.of(context).verifyStart, + ), + if (!keys.blocked) + AdaptiveModalAction( + value: UserDeviceListItemAction.block, + icon: const Icon(Icons.block_outlined), + label: L10n.of(context).blockDevice, + isDestructive: true, + ), + if (keys.blocked) + AdaptiveModalAction( + value: UserDeviceListItemAction.unblock, + icon: const Icon(Icons.block), + label: L10n.of(context).unblockDevice, + isDestructive: true, + ), + }, + if (!isOwnDevice) + AdaptiveModalAction( + value: UserDeviceListItemAction.remove, + icon: const Icon(Icons.delete_outlined), + label: L10n.of(context).delete, + isDestructive: true, + ), + ], + ); + if (action == null) return; + switch (action) { + case UserDeviceListItemAction.rename: + rename(userDevice); + break; + case UserDeviceListItemAction.remove: + remove(userDevice); + break; + case UserDeviceListItemAction.verify: + verify(userDevice); + break; + case UserDeviceListItemAction.block: + block(userDevice); + break; + case UserDeviceListItemAction.unblock: + unblock(userDevice); + break; + } + }, + leading: CircleAvatar( + foregroundColor: Colors.white, + backgroundColor: keys == null + ? Colors.grey[700] + : keys.blocked ? Colors.red : keys.verified ? Colors.green : Colors.orange, - ), + child: Icon(userDevice.icon), + ), + title: Text( + userDevice.displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + L10n.of(context).lastActiveAgo( + DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0) + .localizedTimeShort(context), ), - ], - ), - subtitle: Text( - L10n.of(context)!.lastActiveAgo( - DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0) - .localizedTimeShort(context)), - style: const TextStyle(fontWeight: FontWeight.w300), + style: const TextStyle(fontWeight: FontWeight.w300), + ), + trailing: keys == null + ? null + : Text( + keys.blocked + ? L10n.of(context).blocked + : keys.verified + ? L10n.of(context).verified + : L10n.of(context).unverified, + style: TextStyle( + color: keys.blocked + ? Colors.red + : keys.verified + ? Colors.green + : Colors.orange, + ), + ), + ), ), ); } diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index 212324ca9d..edcc6868c6 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -21,21 +21,27 @@ import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; -import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' hide VideoRenderer; import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; -import 'package:pedantic/pedantic.dart'; -import 'package:wakelock/wakelock.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/voip/video_renderer.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'pip/pip_view.dart'; class _StreamView extends StatelessWidget { - const _StreamView(this.wrappedStream, - {Key? key, this.mainView = false, required this.matrixClient}) - : super(key: key); + const _StreamView( + this.wrappedStream, { + this.mainView = false, + required this.matrixClient, + }); final WrappedMediaStream wrappedStream; final Client matrixClient; @@ -64,43 +70,43 @@ class _StreamView extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - decoration: const BoxDecoration( - color: Colors.black54, - ), - child: Stack( - alignment: Alignment.center, - children: [ - if (videoMuted) - Container( - color: Colors.transparent, - ), - if (!videoMuted) - RTCVideoView( - // yes, it must explicitly be casted even though I do not feel - // comfortable with it... - wrappedStream.renderer as RTCVideoRenderer, - mirror: mirrored, - objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, - ), - if (videoMuted) - Positioned( - child: Avatar( + decoration: const BoxDecoration( + color: Colors.black54, + ), + child: Stack( + alignment: Alignment.center, + children: [ + VideoRenderer( + wrappedStream, + mirror: mirrored, + fit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, + ), + if (videoMuted) ...[ + Container(color: Colors.black54), + Positioned( + child: Avatar( mxContent: avatarUrl, name: displayName, size: mainView ? 96 : 48, client: matrixClient, // textSize: mainView ? 36 : 24, // matrixClient: matrixClient, - )), - if (!isScreenSharing) - Positioned( - left: 4.0, - bottom: 4.0, - child: Icon(audioMuted ? Icons.mic_off : Icons.mic, - color: Colors.white, size: 18.0), - ) + ), + ), ], - )); + if (!isScreenSharing) + Positioned( + left: 4.0, + bottom: 4.0, + child: Icon( + audioMuted ? Icons.mic_off : Icons.mic, + color: Colors.white, + size: 18.0, + ), + ), + ], + ), + ); } } @@ -111,61 +117,58 @@ class Calling extends StatefulWidget { final CallSession call; final Client client; - const Calling( - {required this.context, - required this.call, - required this.client, - required this.callId, - this.onClear, - Key? key}) - : super(key: key); + const Calling({ + required this.context, + required this.call, + required this.client, + required this.callId, + this.onClear, + super.key, + }); @override - _MyCallingPage createState() => _MyCallingPage(); + MyCallingPage createState() => MyCallingPage(); } -class _MyCallingPage extends State { - Room? get room => call?.room; +class MyCallingPage extends State { + Room? get room => call.room; - String get displayName => call?.displayName ?? ''; + String get displayName => call.room.getLocalizedDisplayname( + MatrixLocals(L10n.of(widget.context)), + ); String get callId => widget.callId; - CallSession? get call => widget.call; + CallSession get call => widget.call; MediaStream? get localStream { - if (call != null && call!.localUserMediaStream != null) { - return call!.localUserMediaStream!.stream!; + if (call.localUserMediaStream != null) { + return call.localUserMediaStream!.stream!; } return null; } MediaStream? get remoteStream { - if (call != null && call!.getRemoteStreams.isNotEmpty) { - return call!.getRemoteStreams[0].stream!; + if (call.getRemoteStreams.isNotEmpty) { + return call.getRemoteStreams[0].stream!; } return null; } - bool get speakerOn => call?.speakerOn ?? false; - - bool get isMicrophoneMuted => call?.isMicrophoneMuted ?? false; + bool get isMicrophoneMuted => call.isMicrophoneMuted; - bool get isLocalVideoMuted => call?.isLocalVideoMuted ?? false; + bool get isLocalVideoMuted => call.isLocalVideoMuted; - bool get isScreensharingEnabled => call?.screensharingEnabled ?? false; + bool get isScreensharingEnabled => call.screensharingEnabled; - bool get isRemoteOnHold => call?.remoteOnHold ?? false; + bool get isRemoteOnHold => call.remoteOnHold; - bool get voiceonly => call == null || call?.type == CallType.kVoice; + bool get voiceonly => call.type == CallType.kVoice; - bool get connecting => call?.state == CallState.kConnecting; + bool get connecting => call.state == CallState.kConnecting; - bool get connected => call?.state == CallState.kConnected; + bool get connected => call.state == CallState.kConnected; - bool get mirrored => call?.facingMode == 'user'; - - List get streams => call?.streams ?? []; double? _localVideoHeight; double? _localVideoWidth; EdgeInsetsGeometry? _localVideoMargin; @@ -191,19 +194,18 @@ class _MyCallingPage extends State { void initialize() async { final call = this.call; - if (call == null) return; - call.onCallStateChanged.stream.listen(_handleCallState); call.onCallEventChanged.stream.listen((event) { - if (event == CallEvent.kFeedsChanged) { + if (event == CallStateChange.kFeedsChanged) { setState(() { call.tryRemoveStopedStreams(); }); - } else if (event == CallEvent.kLocalHoldUnhold || - event == CallEvent.kRemoteHoldUnhold) { + } else if (event == CallStateChange.kLocalHoldUnhold || + event == CallStateChange.kRemoteHoldUnhold) { setState(() {}); Logs().i( - 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}'); + 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}', + ); } }); _state = call.state; @@ -211,7 +213,7 @@ class _MyCallingPage extends State { if (call.type == CallType.kVideo) { try { // Enable wakelock (keep screen on) - unawaited(Wakelock.enable()); + unawaited(WakelockPlus.enable()); } catch (_) {} } } @@ -221,9 +223,9 @@ class _MyCallingPage extends State { const Duration(seconds: 2), () => widget.onClear?.call(), ); - if (call?.type == CallType.kVideo) { + if (call.type == CallType.kVideo) { try { - unawaited(Wakelock.disable()); + unawaited(WakelockPlus.disable()); } catch (_) {} } } @@ -231,25 +233,31 @@ class _MyCallingPage extends State { @override void dispose() { super.dispose(); - call?.cleanUp.call(); + call.cleanUp.call(); } void _resizeLocalVideo(Orientation orientation) { final shortSide = min( - MediaQuery.of(context).size.width, MediaQuery.of(context).size.height); + MediaQuery.of(widget.context).size.width, + MediaQuery.of(widget.context).size.height, + ); _localVideoMargin = remoteStream != null ? const EdgeInsets.only(top: 20.0, right: 20.0) : EdgeInsets.zero; _localVideoWidth = remoteStream != null ? shortSide / 3 - : MediaQuery.of(context).size.width; + : MediaQuery.of(widget.context).size.width; _localVideoHeight = remoteStream != null ? shortSide / 4 - : MediaQuery.of(context).size.height; + : MediaQuery.of(widget.context).size.height; } void _handleCallState(CallState state) { Logs().v('CallingPage::handleCallState: ${state.toString()}'); + if ({CallState.kConnected, CallState.kEnded}.contains(state)) { + HapticFeedback.heavyImpact(); + } + if (mounted) { setState(() { _state = state; @@ -260,53 +268,70 @@ class _MyCallingPage extends State { void _answerCall() { setState(() { - call?.answer(); + call.answer(); }); } void _hangUp() { setState(() { - if (call != null && (call?.isRinging ?? false)) { - call?.reject(); + if (call.isRinging) { + call.reject(); } else { - call?.hangup(); + call.hangup(reason: CallErrorCode.userHangup); } }); } void _muteMic() { setState(() { - call?.setMicrophoneMuted(!call!.isMicrophoneMuted); + call.setMicrophoneMuted(!call.isMicrophoneMuted); }); } - void _screenSharing() { + void _screenSharing() async { + if (PlatformInfos.isAndroid) { + if (!call.screensharingEnabled) { + FlutterForegroundTask.init( + androidNotificationOptions: AndroidNotificationOptions( + channelId: 'notification_channel_id', + channelName: 'Foreground Notification', + channelDescription: + L10n.of(widget.context).foregroundServiceRunning, + ), + iosNotificationOptions: const IOSNotificationOptions(), + foregroundTaskOptions: const ForegroundTaskOptions(), + ); + FlutterForegroundTask.startService( + notificationTitle: L10n.of(widget.context).screenSharingTitle, + notificationText: L10n.of(widget.context).screenSharingDetail, + ); + } else { + FlutterForegroundTask.stopService(); + } + } + setState(() { - call?.setScreensharingEnabled(!call!.screensharingEnabled); + call.setScreensharingEnabled(!call.screensharingEnabled); }); } void _remoteOnHold() { setState(() { - call?.setRemoteOnHold(!call!.remoteOnHold); + call.setRemoteOnHold(!call.remoteOnHold); }); } void _muteCamera() { setState(() { - call?.setLocalVideoMuted(!call!.isLocalVideoMuted); + call.setLocalVideoMuted(!call.isLocalVideoMuted); }); } void _switchCamera() async { - if (call!.localUserMediaStream != null) { + if (call.localUserMediaStream != null) { await Helper.switchCamera( - call!.localUserMediaStream!.stream!.getVideoTracks()[0]); - if (PlatformInfos.isMobile) { - call!.facingMode == 'user' - ? call!.facingMode = 'environment' - : call!.facingMode = 'user'; - } + call.localUserMediaStream!.stream!.getVideoTracks()[0], + ); } setState(() {}); } @@ -320,7 +345,7 @@ class _MyCallingPage extends State { */ List _buildActionButtons(bool isFloating) { - if (isFloating || call == null) { + if (isFloating) { return []; } @@ -336,7 +361,7 @@ class _MyCallingPage extends State { child: Icon(_speakerOn ? Icons.volume_up : Icons.volume_off), onPressed: _switchSpeaker, foregroundColor: Colors.black54, - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(widget.context).backgroundColor, ); */ final hangupButton = FloatingActionButton( @@ -392,7 +417,7 @@ class _MyCallingPage extends State { case CallState.kInviteSent: case CallState.kCreateAnswer: case CallState.kConnecting: - return call!.isOutgoing + return call.isOutgoing ? [hangupButton] : [answerButton, hangupButton]; case CallState.kConnected: @@ -411,16 +436,10 @@ class _MyCallingPage extends State { hangupButton, ]; case CallState.kFledgling: - // TODO: Handle this case. - break; case CallState.kWaitLocalMedia: - // TODO: Handle this case. - break; case CallState.kCreateOffer: - // TODO: Handle this case. - break; + case CallState.kEnding: case null: - // TODO: Handle this case. break; } return []; @@ -430,33 +449,40 @@ class _MyCallingPage extends State { final stackWidgets = []; final call = this.call; - if (call == null || call.callHasEnded) { + if (call.callHasEnded) { return stackWidgets; } if (call.localHold || call.remoteOnHold) { var title = ''; if (call.localHold) { - title = '${call.displayName} held the call.'; + title = '${call.room.getLocalizedDisplayname( + MatrixLocals(L10n.of(widget.context)), + )} held the call.'; } else if (call.remoteOnHold) { title = 'You held the call.'; } - stackWidgets.add(Center( - child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon( - Icons.pause, - size: 48.0, - color: Colors.white, + stackWidgets.add( + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.pause, + size: 48.0, + color: Colors.white, + ), + Text( + title, + style: const TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + ], ), - Text( - title, - style: const TextStyle( - color: Colors.white, - fontSize: 24.0, - ), - ) - ]), - )); + ), + ); return stackWidgets; } @@ -470,10 +496,15 @@ class _MyCallingPage extends State { } if (primaryStream != null) { - stackWidgets.add(Center( - child: _StreamView(primaryStream, - mainView: true, matrixClient: widget.client), - )); + stackWidgets.add( + Center( + child: _StreamView( + primaryStream, + mainView: true, + matrixClient: widget.client, + ), + ), + ); } if (isFloating || !connected) { @@ -490,47 +521,58 @@ class _MyCallingPage extends State { if (call.remoteScreenSharingStream != null) { final remoteUserMediaStream = call.remoteUserMediaStream; - secondaryStreamViews.add(SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(remoteUserMediaStream!, matrixClient: widget.client), - )); + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: + _StreamView(remoteUserMediaStream!, matrixClient: widget.client), + ), + ); secondaryStreamViews.add(const SizedBox(height: 10)); } final localStream = call.localUserMediaStream ?? call.localScreenSharingStream; if (localStream != null && !isFloating) { - secondaryStreamViews.add(SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(localStream, matrixClient: widget.client), - )); + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView(localStream, matrixClient: widget.client), + ), + ); secondaryStreamViews.add(const SizedBox(height: 10)); } if (call.localScreenSharingStream != null && !isFloating) { - secondaryStreamViews.add(SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(call.remoteUserMediaStream!, - matrixClient: widget.client), - )); + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + call.remoteUserMediaStream!, + matrixClient: widget.client, + ), + ), + ); secondaryStreamViews.add(const SizedBox(height: 10)); } if (secondaryStreamViews.isNotEmpty) { - stackWidgets.add(Container( - padding: const EdgeInsets.fromLTRB(0, 20, 0, 120), - alignment: Alignment.bottomRight, - child: Container( - width: _localVideoWidth, - margin: _localVideoMargin, - child: Column( - children: secondaryStreamViews, + stackWidgets.add( + Container( + padding: const EdgeInsets.fromLTRB(0, 20, 0, 120), + alignment: Alignment.bottomRight, + child: Container( + width: _localVideoWidth, + margin: _localVideoMargin, + child: Column( + children: secondaryStreamViews, + ), ), ), - )); + ); } return stackWidgets; @@ -538,27 +580,31 @@ class _MyCallingPage extends State { @override Widget build(BuildContext context) { - return PIPView(builder: (context, isFloating) { - return Scaffold( + return PIPView( + builder: (context, isFloating) { + return Scaffold( resizeToAvoidBottomInset: !isFloating, floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButton: SizedBox( - width: 320.0, - height: 150.0, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: _buildActionButtons(isFloating))), + width: 320.0, + height: 150.0, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: _buildActionButtons(isFloating), + ), + ), body: OrientationBuilder( - builder: (BuildContext context, Orientation orientation) { - return Container( + builder: (BuildContext context, Orientation orientation) { + return Container( decoration: const BoxDecoration( color: Colors.black87, ), - child: Stack(children: [ - ..._buildContent(orientation, isFloating), - if (!isFloating) - Positioned( + child: Stack( + children: [ + ..._buildContent(orientation, isFloating), + if (!isFloating) + Positioned( top: 24.0, left: 24.0, child: IconButton( @@ -567,9 +613,15 @@ class _MyCallingPage extends State { onPressed: () { PIPView.of(context)?.setFloating(true); }, - )) - ])); - })); - }); + ), + ), + ], + ), + ); + }, + ), + ); + }, + ); } } diff --git a/lib/pages/dialer/pip/constants.dart b/lib/pages/dialer/pip/constants.dart deleted file mode 100644 index 5dfbd72dbb..0000000000 --- a/lib/pages/dialer/pip/constants.dart +++ /dev/null @@ -1 +0,0 @@ -const defaultAnimationDuration = Duration(milliseconds: 200); diff --git a/lib/pages/dialer/pip/pip_view.dart b/lib/pages/dialer/pip/pip_view.dart index 15a1753955..d9aa3d90f8 100644 --- a/lib/pages/dialer/pip/pip_view.dart +++ b/lib/pages/dialer/pip/pip_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'constants.dart'; +import 'package:fluffychat/config/themes.dart'; import 'dismiss_keyboard.dart'; class PIPView extends StatefulWidget { @@ -15,13 +15,13 @@ class PIPView extends StatefulWidget { ) builder; const PIPView({ - Key? key, + super.key, required this.builder, this.initialCorner = PIPViewCorner.topRight, this.floatingWidth, this.floatingHeight, this.avoidKeyboard = true, - }) : super(key: key); + }); @override PIPViewState createState() => PIPViewState(); @@ -45,11 +45,11 @@ class PIPViewState extends State with TickerProviderStateMixin { super.initState(); _corner = widget.initialCorner; _toggleFloatingAnimationController = AnimationController( - duration: defaultAnimationDuration, + duration: FluffyThemes.animationDuration, vsync: this, ); _dragAnimationController = AnimationController( - duration: defaultAnimationDuration, + duration: FluffyThemes.animationDuration, vsync: this, ); } @@ -198,9 +198,11 @@ class PIPViewState extends State with TickerProviderStateMixin { : Tween( begin: _dragOffset, end: calculatedOffset, - ).transform(_dragAnimationController.isAnimating - ? dragAnimationValue - : toggleFloatingAnimationValue); + ).transform( + _dragAnimationController.isAnimating + ? dragAnimationValue + : toggleFloatingAnimationValue, + ); final borderRadius = Tween( begin: 0, end: 10, @@ -328,8 +330,6 @@ Map _calculateOffsets({ return Offset(left, bottom); case PIPViewCorner.bottomRight: return Offset(right, bottom); - default: - throw Exception('Not implemented.'); } } diff --git a/lib/pages/homeserver_picker/homeserver_bottom_sheet.dart b/lib/pages/homeserver_picker/homeserver_bottom_sheet.dart deleted file mode 100644 index 316d1cf258..0000000000 --- a/lib/pages/homeserver_picker/homeserver_bottom_sheet.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix_homeserver_recommendations/matrix_homeserver_recommendations.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class HomeserverBottomSheet extends StatelessWidget { - final HomeserverBenchmarkResult homeserver; - const HomeserverBottomSheet({required this.homeserver, Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final responseTime = homeserver.responseTime; - final description = homeserver.homeserver.description; - final rules = homeserver.homeserver.rules; - final privacy = homeserver.homeserver.privacyPolicy; - final registration = homeserver.homeserver.registration; - final jurisdiction = homeserver.homeserver.jurisdiction; - final homeserverSoftware = homeserver.homeserver.homeserverSoftware; - return Scaffold( - appBar: AppBar( - title: Text(homeserver.homeserver.baseUrl.host), - ), - body: ListView(children: [ - if (description != null && description.isNotEmpty) - ListTile( - leading: const Icon(Icons.info_outlined), - title: Text(description), - ), - if (jurisdiction != null && jurisdiction.isNotEmpty) - ListTile( - leading: const Icon(Icons.location_city_outlined), - title: Text(jurisdiction), - ), - if (homeserverSoftware != null && homeserverSoftware.isNotEmpty) - ListTile( - leading: const Icon(Icons.domain_outlined), - title: Text(homeserverSoftware), - ), - ListTile( - onTap: () => launch(homeserver.homeserver.baseUrl.toString()), - leading: const Icon(Icons.link_outlined), - title: Text(homeserver.homeserver.baseUrl.toString()), - ), - if (registration != null) - ListTile( - onTap: () => launch(registration.toString()), - leading: const Icon(Icons.person_add_outlined), - title: Text(registration.toString()), - ), - if (rules != null) - ListTile( - onTap: () => launch(rules.toString()), - leading: const Icon(Icons.visibility_outlined), - title: Text(rules.toString()), - ), - if (privacy != null) - ListTile( - onTap: () => launch(privacy.toString()), - leading: const Icon(Icons.shield_outlined), - title: Text(privacy.toString()), - ), - if (responseTime != null) - ListTile( - leading: const Icon(Icons.timer_outlined), - title: Text('${responseTime.inMilliseconds}ms'), - ), - ]), - ); - } -} diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart index c1f7876d46..e379937cac 100644 --- a/lib/pages/homeserver_picker/homeserver_picker.dart +++ b/lib/pages/homeserver_picker/homeserver_picker.dart @@ -1,19 +1,31 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hive_flutter/hive_flutter.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_homeserver_recommendations/matrix_homeserver_recommendations.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pages/homeserver_picker/homeserver_bottom_sheet.dart'; import 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/tor_stub.dart' + if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; + class HomeserverPicker extends StatefulWidget { - const HomeserverPicker({Key? key}) : super(key: key); + final bool addMultiAccount; + const HomeserverPicker({required this.addMultiAccount, super.key}); @override HomeserverPickerController createState() => HomeserverPickerController(); @@ -21,130 +33,242 @@ class HomeserverPicker extends StatefulWidget { class HomeserverPickerController extends State { bool isLoading = false; + bool isLoggingIn = false; + final TextEditingController homeserverController = TextEditingController( text: AppConfig.defaultHomeserver, ); - final FocusNode homeserverFocusNode = FocusNode(); + String? error; - List? benchmarkResults; - bool displayServerList = false; - bool get loadingHomeservers => - AppConfig.allowOtherHomeservers && benchmarkResults == null; - String searchTerm = ''; + bool isTorBrowser = false; - void _updateFocus() { - if (benchmarkResults == null) _loadHomeserverList(); - if (homeserverFocusNode.hasFocus) { - setState(() { - displayServerList = true; - }); - } + Future _checkTorBrowser() async { + if (!kIsWeb) return; + + Hive.openBox('test').then((value) => null).catchError( + (e, s) async { + await showOkAlertDialog( + context: context, + title: L10n.of(context).indexedDbErrorTitle, + message: L10n.of(context).indexedDbErrorLong, + ); + _checkTorBrowser(); + }, + ); + + final isTor = await TorBrowserDetector.isTorBrowser; + isTorBrowser = isTor; } - void showServerInfo(HomeserverBenchmarkResult server) => showModalBottomSheet( - context: context, - builder: (_) => HomeserverBottomSheet( - homeserver: server, - ), - ); + String? _lastCheckedUrl; - void onChanged(String text) => setState(() { - searchTerm = text; - }); + Timer? _checkHomeserverCooldown; - List get filteredHomeservers => benchmarkResults! - .where((element) => - element.homeserver.baseUrl.host.contains(searchTerm) || - (element.homeserver.description?.contains(searchTerm) ?? false)) - .toList(); + tryCheckHomeserverActionWithCooldown([_]) { + _checkHomeserverCooldown?.cancel(); + _checkHomeserverCooldown = Timer( + const Duration(milliseconds: 500), + checkHomeserverAction, + ); + } - void _loadHomeserverList() async { - try { - final homeserverList = await JoinmatrixOrgParser().fetchHomeservers(); - final benchmark = await HomeserverListProvider.benchmarkHomeserver( - homeserverList, - timeout: const Duration(seconds: 10), - ); - setState(() { - benchmarkResults = benchmark; - }); - } catch (e, s) { - Logs().e('Homeserver benchmark failed', e, s); - benchmarkResults = []; - } + void tryCheckHomeserverActionWithoutCooldown([_]) { + _checkHomeserverCooldown?.cancel(); + _lastCheckedUrl = null; + checkHomeserverAction(); } - void setServer(String server) => setState(() { - homeserverController.text = server; - searchTerm = ''; - homeserverFocusNode.unfocus(); - displayServerList = false; - }); + void onSubmitted([_]) { + if (isLoading || _checkHomeserverCooldown?.isActive == true) { + return tryCheckHomeserverActionWithoutCooldown(); + } + if (supportsSso) return ssoLoginAction(); + if (supportsPasswordLogin) return login(); + return tryCheckHomeserverActionWithoutCooldown(); + } /// Starts an analysis of the given homeserver. It uses the current domain and /// makes sure that it is prefixed with https. Then it searches for the /// well-known information and forwards to the login page depending on the /// login type. - Future checkHomeserverAction() async { + Future checkHomeserverAction([_]) async { + final homeserverInput = + homeserverController.text.trim().toLowerCase().replaceAll(' ', '-'); + + if (homeserverInput.isEmpty || !homeserverInput.contains('.')) { + setState(() { + error = loginFlows = null; + isLoading = false; + Matrix.of(context).getLoginClient().homeserver = null; + _lastCheckedUrl = null; + }); + return; + } + if (_lastCheckedUrl == homeserverInput) return; + + _lastCheckedUrl = homeserverInput; setState(() { - homeserverFocusNode.unfocus(); - error = null; + error = loginFlows = null; isLoading = true; - searchTerm = ''; - displayServerList = false; }); try { - homeserverController.text = - homeserverController.text.trim().toLowerCase().replaceAll(' ', '-'); - var homeserver = Uri.parse(homeserverController.text); + var homeserver = Uri.parse(homeserverInput); if (homeserver.scheme.isEmpty) { - homeserver = Uri.https(homeserverController.text, ''); + homeserver = Uri.https(homeserverInput, ''); } - final matrix = Matrix.of(context); - matrix.loginHomeserverSummary = - await matrix.getLoginClient().checkHomeserver(homeserver); - final ssoSupported = matrix.loginHomeserverSummary!.loginFlows - .any((flow) => flow.type == 'm.login.sso'); - - try { - await Matrix.of(context).getLoginClient().register(); - matrix.loginRegistrationSupported = true; - } on MatrixException catch (e) { - matrix.loginRegistrationSupported = e.requireAdditionalAuthentication; + final client = Matrix.of(context).getLoginClient(); + final (_, _, loginFlows) = await client.checkHomeserver(homeserver); + this.loginFlows = loginFlows; + } catch (e) { + setState( + () => error = (e).toLocalizedString( + context, + ExceptionContext.checkHomeserver, + ), + ); + } finally { + if (mounted) { + setState(() => isLoading = false); } + } + } - if (!ssoSupported && matrix.loginRegistrationSupported == false) { - // Server does not support SSO or registration. We can skip to login page: - VRouter.of(context).to('login'); - } else { - VRouter.of(context).to('connect'); - } + List? loginFlows; + + bool _supportsFlow(String flowType) => + loginFlows?.any((flow) => flow.type == flowType) ?? false; + + bool get supportsSso => _supportsFlow('m.login.sso'); + + bool isDefaultPlatform = + (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS); + + bool get supportsPasswordLogin => _supportsFlow('m.login.password'); + + void ssoLoginAction() async { + final redirectUrl = kIsWeb + ? Uri.parse(html.window.location.href) + .resolveUri( + Uri(pathSegments: ['auth.html']), + ) + .toString() + : isDefaultPlatform + ? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login' + : 'http://localhost:3001//login'; + + final url = Matrix.of(context).getLoginClient().homeserver!.replace( + path: '/_matrix/client/v3/login/sso/redirect', + queryParameters: {'redirectUrl': redirectUrl}, + ); + + final urlScheme = isDefaultPlatform + ? Uri.parse(redirectUrl).scheme + : "http://localhost:3001"; + final result = await FlutterWebAuth2.authenticate( + url: url.toString(), + callbackUrlScheme: urlScheme, + options: const FlutterWebAuth2Options(), + ); + final token = Uri.parse(result).queryParameters['loginToken']; + if (token?.isEmpty ?? false) return; + + setState(() { + error = null; + isLoading = isLoggingIn = true; + }); + try { + await Matrix.of(context).getLoginClient().login( + LoginType.mLoginToken, + token: token, + initialDeviceDisplayName: PlatformInfos.clientName, + ); } catch (e) { - setState(() => error = (e).toLocalizedString(context)); + setState(() { + error = e.toLocalizedString(context); + }); } finally { if (mounted) { - setState(() => isLoading = false); + setState(() { + isLoading = isLoggingIn = false; + }); } } } - @override - void dispose() { - homeserverFocusNode.removeListener(_updateFocus); - super.dispose(); + void login() async { + if (!supportsPasswordLogin) { + homeserverController.text = AppConfig.defaultHomeserver; + await checkHomeserverAction(); + } + context.push( + '${GoRouter.of(context).routeInformationProvider.value.uri.path}/login', + ); } @override void initState() { - homeserverFocusNode.addListener(_updateFocus); + _checkTorBrowser(); super.initState(); + WidgetsBinding.instance.addPostFrameCallback(checkHomeserverAction); } @override - Widget build(BuildContext context) { - Matrix.of(context).navigatorContext = context; - return HomeserverPickerView(this); + Widget build(BuildContext context) => HomeserverPickerView(this); + + Future restoreBackup() async { + final picked = await selectFiles(context); + final file = picked.firstOrNull; + if (file == null) return; + setState(() { + error = null; + isLoading = isLoggingIn = true; + }); + try { + final client = Matrix.of(context).getLoginClient(); + await client.importDump(String.fromCharCodes(await file.readAsBytes())); + Matrix.of(context).initMatrix(); + } catch (e) { + setState(() { + error = e.toLocalizedString(context); + }); + } finally { + if (mounted) { + setState(() { + isLoading = isLoggingIn = false; + }); + } + } } + + void onMoreAction(MoreLoginActions action) { + switch (action) { + case MoreLoginActions.passwordLogin: + login(); + case MoreLoginActions.privacy: + launchUrlString(AppConfig.privacyUrl); + case MoreLoginActions.about: + PlatformInfos.showDialog(context); + } + } +} + +enum MoreLoginActions { passwordLogin, privacy, about } + +class IdentityProvider { + final String? id; + final String? name; + final String? icon; + final String? brand; + + IdentityProvider({this.id, this.name, this.icon, this.brand}); + + factory IdentityProvider.fromJson(Map json) => + IdentityProvider( + id: json['id'], + name: json['name'], + icon: json['icon'], + brand: json['brand'], + ); } diff --git a/lib/pages/homeserver_picker/homeserver_picker_view.dart b/lib/pages/homeserver_picker/homeserver_picker_view.dart index 23938723f4..1d022f68e2 100644 --- a/lib/pages/homeserver_picker/homeserver_picker_view.dart +++ b/lib/pages/homeserver_picker/homeserver_picker_view.dart @@ -1,147 +1,254 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../config/themes.dart'; import 'homeserver_picker.dart'; class HomeserverPickerView extends StatelessWidget { final HomeserverPickerController controller; - const HomeserverPickerView(this.controller, {Key? key}) : super(key: key); + const HomeserverPickerView( + this.controller, { + super.key, + }); @override Widget build(BuildContext context) { - final benchmarkResults = controller.benchmarkResults; + final theme = Theme.of(context); + return LoginScaffold( - appBar: VRouter.of(context).path == '/home' - ? null - : AppBar(title: Text(L10n.of(context)!.addAccount)), - body: SafeArea( - child: Column( - children: [ - Expanded( - child: ListView( - children: [ - Container( - alignment: Alignment.center, - height: 256, - child: Image.asset('assets/info-logo.png'), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - focusNode: controller.homeserverFocusNode, - controller: controller.homeserverController, - onChanged: controller.onChanged, - decoration: InputDecoration( - prefixText: '${L10n.of(context)!.homeserver}: ', - hintText: L10n.of(context)!.enterYourHomeserver, - suffixIcon: const Icon(Icons.search), - errorText: controller.error, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), + enforceMobileMode: Matrix.of(context).client.isLogged(), + appBar: AppBar( + centerTitle: true, + title: Text( + controller.widget.addMultiAccount + ? L10n.of(context).addAccount + : L10n.of(context).login, + ), + actions: [ + PopupMenuButton( + onSelected: controller.onMoreAction, + itemBuilder: (_) => [ + PopupMenuItem( + value: MoreLoginActions.passwordLogin, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.login_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).loginWithMatrixId), + ], + ), + ), + PopupMenuItem( + value: MoreLoginActions.privacy, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.privacy_tip_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).privacy), + ], + ), + ), + PopupMenuItem( + value: MoreLoginActions.about, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.info_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).about), + ], + ), + ), + ], + ), + ], + ), + body: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: constraints.maxHeight), + child: IntrinsicHeight( + child: Column( + children: [ + // display a prominent banner to import session for TOR browser + // users. This feature is just some UX sugar as TOR users are + // usually forced to logout as TOR browser is non-persistent + AnimatedContainer( + height: controller.isTorBrowser ? 64 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + child: Material( + clipBehavior: Clip.hardEdge, + borderRadius: const BorderRadius.vertical( + bottom: Radius.circular(8), + ), + color: theme.colorScheme.surface, + child: ListTile( + leading: const Icon(Icons.vpn_key), + title: Text(L10n.of(context).hydrateTor), + subtitle: Text(L10n.of(context).hydrateTorLong), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: controller.restoreBackup, + ), + ), + ), + Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Hero( + tag: 'info-logo', + child: Image.asset( + './assets/banner_transparent.png', + fit: BoxFit.fitWidth, + ), ), - readOnly: !AppConfig.allowOtherHomeservers, - onSubmitted: (_) => controller.checkHomeserverAction(), - autocorrect: false, ), - ), - if (controller.displayServerList) + const SizedBox(height: 32), Padding( - padding: const EdgeInsets.all(16.0), - child: Material( - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), - color: Colors.white.withAlpha(200), - clipBehavior: Clip.hardEdge, - child: benchmarkResults == null - ? const Center( - child: Padding( - padding: EdgeInsets.all(16.0), - child: CircularProgressIndicator.adaptive(), - )) - : Column( - children: controller.filteredHomeservers - .map( - (server) => ListTile( - trailing: IconButton( - icon: const Icon( - Icons.info_outlined, - color: Colors.black, - ), - onPressed: () => - controller.showServerInfo(server), - ), - onTap: () => controller.setServer( - server.homeserver.baseUrl.host), - title: Text( - server.homeserver.baseUrl.host, - style: const TextStyle( - color: Colors.black), - ), - subtitle: Text( - server.homeserver.description ?? '', - style: TextStyle( - color: Colors.grey.shade700), + padding: const EdgeInsets.symmetric(horizontal: 32.0), + child: SelectableLinkify( + text: L10n.of(context).welcomeText, + style: TextStyle( + color: theme.colorScheme.onSecondaryContainer, + fontWeight: FontWeight.w500, + ), + textAlign: TextAlign.center, + linkStyle: TextStyle( + color: theme.colorScheme.secondary, + decorationColor: theme.colorScheme.secondary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + const Spacer(), + Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextField( + onChanged: + controller.tryCheckHomeserverActionWithCooldown, + onSubmitted: controller.onSubmitted, + onTap: + controller.tryCheckHomeserverActionWithCooldown, + controller: controller.homeserverController, + autocorrect: false, + keyboardType: TextInputType.url, + decoration: InputDecoration( + prefixIcon: controller.isLoading + ? Container( + width: 16, + height: 16, + alignment: Alignment.center, + child: const SizedBox( + width: 16, + height: 16, + child: + CircularProgressIndicator.adaptive( + strokeWidth: 2, ), ), ) - .toList(), + : const Icon(Icons.search_outlined), + filled: false, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), ), - ), - ), - Wrap( - alignment: WrapAlignment.center, - children: [ - TextButton( - onPressed: () => launch(AppConfig.privacyUrl), - child: Text( - L10n.of(context)!.privacy, - style: const TextStyle( - decoration: TextDecoration.underline, - color: Colors.white, + hintText: AppConfig.defaultHomeserver, + hintStyle: TextStyle( + color: theme.colorScheme.surfaceTint, + ), + labelText: 'Sign in with:', + errorText: controller.error, + errorMaxLines: 4, + suffixIcon: IconButton( + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text( + L10n.of(context).whatIsAHomeserver, + ), + content: Linkify( + text: L10n.of(context) + .homeserverDescription, + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => launchUrl( + Uri.https('servers.joinmatrix.org'), + ), + child: Text( + L10n.of(context) + .discoverHomeservers, + ), + ), + AdaptiveDialogAction( + onPressed: Navigator.of(context).pop, + child: Text(L10n.of(context).close), + ), + ], + ), + ); + }, + icon: const Icon(Icons.info_outlined), + ), + ), ), - ), - ), - TextButton( - onPressed: () => PlatformInfos.showDialog(context), - child: Text( - L10n.of(context)!.about, - style: const TextStyle( - decoration: TextDecoration.underline, - color: Colors.white, + const SizedBox(height: 32), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: + controller.isLoggingIn || controller.isLoading + ? null + : controller.supportsSso + ? controller.ssoLoginAction + : controller.supportsPasswordLogin + ? controller.login + : null, + child: Text(L10n.of(context).continueText), ), - ), + TextButton( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.secondary, + textStyle: theme.textTheme.labelMedium, + ), + onPressed: + controller.isLoggingIn || controller.isLoading + ? null + : controller.restoreBackup, + child: Text(L10n.of(context).hydrate), + ), + ], ), - ], - ), - ], - ), - ), - Container( - padding: const EdgeInsets.all(16), - width: double.infinity, - child: Hero( - tag: 'loginButton', - child: ElevatedButton( - onPressed: controller.isLoading - ? null - : controller.checkHomeserverAction, - child: controller.isLoading - ? const LinearProgressIndicator() - : Text(L10n.of(context)!.connect), + ), + ], ), ), ), - ], - ), + ); + }, ), ); } diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index 241ec06493..07601ee602 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -1,18 +1,18 @@ import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/image_viewer/image_viewer_view.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/event_extension.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import '../../utils/matrix_sdk_extensions/event_extension.dart'; class ImageViewer extends StatefulWidget { final Event event; - final void Function()? onLoaded; + final BuildContext outerContext; - const ImageViewer(this.event, {Key? key, this.onLoaded}) : super(key: key); + const ImageViewer(this.event, {required this.outerContext, super.key}); @override ImageViewerController createState() => ImageViewerController(); @@ -20,16 +20,18 @@ class ImageViewer extends StatefulWidget { class ImageViewerController extends State { /// Forward this image to another room. - void forwardAction() { - Matrix.of(context).shareContent = widget.event.content; - VRouter.of(context).to('/rooms'); - } + void forwardAction() => showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: [ContentShareItem(widget.event.content)], + ), + ); /// Save this file with a system call. - void saveFileAction() => widget.event.saveFile(context); + void saveFileAction(BuildContext context) => widget.event.saveFile(context); /// Save this file with a system call. - void shareFileAction() => widget.event.shareFile(context); + void shareFileAction(BuildContext context) => widget.event.shareFile(context); static const maxScaleFactor = 1.5; diff --git a/lib/pages/image_viewer/image_viewer_view.dart b/lib/pages/image_viewer/image_viewer_view.dart index 94e29e9b8b..b727cc92b5 100644 --- a/lib/pages/image_viewer/image_viewer_view.dart +++ b/lib/pages/image_viewer/image_viewer_view.dart @@ -2,50 +2,69 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:fluffychat/pages/chat/events/image_bubble.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import 'image_viewer.dart'; class ImageViewerView extends StatelessWidget { final ImageViewerController controller; - const ImageViewerView(this.controller, {Key? key}) : super(key: key); + const ImageViewerView(this.controller, {super.key}); @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.black, + backgroundColor: Colors.black.withAlpha(128), extendBodyBehindAppBar: true, appBar: AppBar( elevation: 0, leading: IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), icon: const Icon(Icons.close), onPressed: Navigator.of(context).pop, color: Colors.white, - tooltip: L10n.of(context)!.close, + tooltip: L10n.of(context).close, ), - backgroundColor: const Color(0x44000000), + backgroundColor: Colors.transparent, actions: [ IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), icon: const Icon(Icons.reply_outlined), onPressed: controller.forwardAction, color: Colors.white, - tooltip: L10n.of(context)!.share, + tooltip: L10n.of(context).share, ), - if (!PlatformInfos.isIOS) - IconButton( - icon: const Icon(Icons.download_outlined), - onPressed: controller.saveFileAction, - color: Colors.white, - tooltip: L10n.of(context)!.downloadFile, + const SizedBox(width: 8), + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), ), + icon: const Icon(Icons.download_outlined), + onPressed: () => controller.saveFileAction(context), + color: Colors.white, + tooltip: L10n.of(context).downloadFile, + ), + const SizedBox(width: 8), if (PlatformInfos.isMobile) - IconButton( - onPressed: controller.shareFileAction, - tooltip: L10n.of(context)!.share, - color: Colors.white, - icon: Icon(Icons.adaptive.share_outlined), - ) + // Use builder context to correctly position the share dialog on iPad + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Builder( + builder: (context) => IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + onPressed: () => controller.shareFileAction(context), + tooltip: L10n.of(context).share, + color: Colors.white, + icon: Icon(Icons.adaptive.share_outlined), + ), + ), + ), ], ), body: InteractiveViewer( @@ -53,15 +72,14 @@ class ImageViewerView extends StatelessWidget { maxScale: 10.0, onInteractionEnd: controller.onInteractionEnds, child: Center( - child: ImageBubble( - controller.widget.event, - tapToView: false, - onLoaded: controller.widget.onLoaded, - fit: BoxFit.contain, - backgroundColor: Colors.black, - maxSize: false, - thumbnailOnly: false, - animated: true, + child: Hero( + tag: controller.widget.event.eventId, + child: MxcImage( + event: controller.widget.event, + fit: BoxFit.contain, + isThumbnail: false, + animated: true, + ), ), ), ), diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index cba0dd8f59..8cb722b21d 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -2,18 +2,20 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/localized_exception_extension.dart'; class InvitationSelection extends StatefulWidget { - const InvitationSelection({Key? key}) : super(key: key); + final String roomId; + const InvitationSelection({ + super.key, + required this.roomId, + }); @override InvitationSelectionController createState() => @@ -27,21 +29,22 @@ class InvitationSelectionController extends State { List foundProfiles = []; Timer? coolDown; - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => widget.roomId; Future> getContacts(BuildContext context) async { final client = Matrix.of(context).client; final room = client.getRoomById(roomId!)!; - final participants = await room.requestParticipants(); + + final participants = (room.summary.mJoinedMemberCount ?? 0) > 100 + ? room.getParticipants() + : await room.requestParticipants(); participants.removeWhere( (u) => ![Membership.join, Membership.invite].contains(u.membership), ); - final participantsIds = participants.map((p) => p.stateKey).toList(); final contacts = client.rooms .where((r) => r.isDirectChat) .map((r) => r.unsafeGetUserFromMemoryOrFallback(r.directChatMatrixID!)) - .toList() - ..removeWhere((u) => participantsIds.contains(u.stateKey)); + .toList(); contacts.sort( (a, b) => a.calcDisplayname().toLowerCase().compareTo( b.calcDisplayname().toLowerCase(), @@ -50,31 +53,26 @@ class InvitationSelectionController extends State { return contacts; } - void inviteAction(BuildContext context, String id) async { + void inviteAction(BuildContext context, String id, String displayname) async { final room = Matrix.of(context).client.getRoomById(roomId!)!; - if (OkCancelResult.ok != - await showOkCancelAlertDialog( - context: context, - title: L10n.of(context)!.inviteContactToGroup(room.displayname), - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - )) { - return; - } + final success = await showFutureLoadingDialog( context: context, future: () => room.invite(id), ); if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(L10n.of(context)!.contactHasBeenInvitedToTheGroup))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context).contactHasBeenInvitedToTheGroup), + ), + ); } } void searchUserWithCoolDown(String text) async { coolDown?.cancel(); coolDown = Timer( - const Duration(seconds: 1), + const Duration(milliseconds: 500), () => searchUser(context, text), ); } @@ -94,7 +92,8 @@ class InvitationSelectionController extends State { response = await matrix.client.searchUserDirectory(text, limit: 10); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text((e).toLocalizedString(context)))); + SnackBar(content: Text((e).toLocalizedString(context))), + ); return; } finally { setState(() => loading = false); @@ -103,19 +102,12 @@ class InvitationSelectionController extends State { foundProfiles = List.from(response.results); if (text.isValidMatrixId && foundProfiles.indexWhere((profile) => text == profile.userId) == -1) { - setState(() => foundProfiles = [ - Profile.fromJson({'user_id': text}), - ]); + setState( + () => foundProfiles = [ + Profile.fromJson({'user_id': text}), + ], + ); } - final participants = Matrix.of(context) - .client - .getRoomById(roomId!)! - .getParticipants() - .where((user) => - [Membership.join, Membership.invite].contains(user.membership)) - .toList(); - foundProfiles.removeWhere((profile) => - participants.indexWhere((u) => u.id == profile.userId) != -1); }); } diff --git a/lib/pages/invitation_selection/invitation_selection_view.dart b/lib/pages/invitation_selection/invitation_selection_view.dart index 910ad9c182..55671c03c3 100644 --- a/lib/pages/invitation_selection/invitation_selection_view.dart +++ b/lib/pages/invitation_selection/invitation_selection_view.dart @@ -2,9 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; +import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -12,87 +13,189 @@ import 'package:fluffychat/widgets/matrix.dart'; class InvitationSelectionView extends StatelessWidget { final InvitationSelectionController controller; - const InvitationSelectionView(this.controller, {Key? key}) : super(key: key); + const InvitationSelectionView(this.controller, {super.key}); @override Widget build(BuildContext context) { - final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; - final groupName = room.name.isEmpty ? L10n.of(context)!.group : room.name; + final room = + Matrix.of(context).client.getRoomById(controller.widget.roomId); + if (room == null) { + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).oopsSomethingWentWrong), + ), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final groupName = room.name.isEmpty ? L10n.of(context).group : room.name; + final theme = Theme.of(context); return Scaffold( appBar: AppBar( - leading: VRouter.of(context).path.startsWith('/spaces/') - ? null - : IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => VRouter.of(context) - .toSegments(['rooms', controller.roomId!]), - ), + leading: const Center(child: BackButton()), titleSpacing: 0, - title: TextField( - autofocus: true, - decoration: InputDecoration( - hintText: L10n.of(context)!.inviteContactToGroup(groupName), - suffixIconConstraints: const BoxConstraints( - maxWidth: 48, - maxHeight: 48, - minWidth: 48, - ), - suffixIcon: controller.loading - ? const CircularProgressIndicator.adaptive() - : const Icon(Icons.search_outlined), - contentPadding: const EdgeInsets.symmetric(horizontal: 16), - ), - onChanged: controller.searchUserWithCoolDown, - ), + title: Text(L10n.of(context).inviteContact), ), body: MaxWidthBody( - withScrolling: true, - child: controller.foundProfiles.isNotEmpty - ? ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: controller.foundProfiles.length, - itemBuilder: (BuildContext context, int i) => ListTile( - leading: Avatar( - mxContent: controller.foundProfiles[i].avatarUrl, - name: controller.foundProfiles[i].displayName ?? - controller.foundProfiles[i].userId, + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), ), - title: Text( - controller.foundProfiles[i].displayName ?? - controller.foundProfiles[i].userId.localpart!, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, ), - subtitle: Text(controller.foundProfiles[i].userId), - onTap: () => controller.inviteAction( - context, controller.foundProfiles[i].userId), + hintText: L10n.of(context).inviteContactToGroup(groupName), + prefixIcon: controller.loading + ? const Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 12, + ), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ) + : const Icon(Icons.search_outlined), ), - ) - : FutureBuilder>( - future: controller.getContacts(context), - builder: (BuildContext context, snapshot) { - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ); - } - final contacts = snapshot.data!; - return ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: contacts.length, - itemBuilder: (BuildContext context, int i) => ListTile( - leading: Avatar( - mxContent: contacts[i].avatarUrl, - name: contacts[i].calcDisplayname(), - ), - title: Text(contacts[i].calcDisplayname()), - subtitle: Text(contacts[i].id), - onTap: () => - controller.inviteAction(context, contacts[i].id), - ), - ); - }, + onChanged: controller.searchUserWithCoolDown, ), + ), + StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == room.id), + builder: (context, snapshot) { + final participants = + room.getParticipants().map((user) => user.id).toSet(); + return controller.foundProfiles.isNotEmpty + ? ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: controller.foundProfiles.length, + itemBuilder: (BuildContext context, int i) => + _InviteContactListTile( + profile: controller.foundProfiles[i], + isMember: participants + .contains(controller.foundProfiles[i].userId), + onTap: () => controller.inviteAction( + context, + controller.foundProfiles[i].userId, + controller.foundProfiles[i].displayName ?? + controller.foundProfiles[i].userId.localpart ?? + L10n.of(context).user, + ), + ), + ) + : FutureBuilder>( + future: controller.getContacts(context), + builder: (BuildContext context, snapshot) { + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final contacts = snapshot.data!; + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: contacts.length, + itemBuilder: (BuildContext context, int i) => + _InviteContactListTile( + user: contacts[i], + profile: Profile( + avatarUrl: contacts[i].avatarUrl, + displayName: contacts[i].displayName ?? + contacts[i].id.localpart ?? + L10n.of(context).user, + userId: contacts[i].id, + ), + isMember: participants.contains(contacts[i].id), + onTap: () => controller.inviteAction( + context, + contacts[i].id, + contacts[i].displayName ?? + contacts[i].id.localpart ?? + L10n.of(context).user, + ), + ), + ); + }, + ); + }, + ), + ], + ), + ), + ); + } +} + +class _InviteContactListTile extends StatelessWidget { + final Profile profile; + final User? user; + final bool isMember; + final void Function() onTap; + + const _InviteContactListTile({ + required this.profile, + this.user, + required this.isMember, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final l10n = L10n.of(context); + + return ListTile( + leading: Avatar( + mxContent: profile.avatarUrl, + name: profile.displayName, + presenceUserId: profile.userId, + onTap: () => showAdaptiveBottomSheet( + context: context, + builder: (c) => UserBottomSheet( + user: user, + profile: profile, + outerContext: context, + ), + ), + ), + title: Text( + profile.displayName ?? profile.userId.localpart ?? l10n.user, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + profile.userId, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: theme.colorScheme.secondary, + ), + ), + trailing: TextButton.icon( + onPressed: isMember ? null : onTap, + label: Text(isMember ? l10n.participant : l10n.invite), + icon: Icon(isMember ? Icons.check : Icons.add), ), ); } diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index d9213178d6..3dfa75be64 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -1,48 +1,37 @@ import 'dart:convert'; import 'dart:ui'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; -import '../../utils/beautify_string_extension.dart'; -import '../../widgets/adaptive_flat_button.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; class KeyVerificationDialog extends StatefulWidget { - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - barrierDismissible: true, - builder: (context) => this, - useRootNavigator: false, - ) - : showDialog( - context: context, - barrierDismissible: true, - builder: (context) => this, - useRootNavigator: false, - ); + Future show(BuildContext context) => showAdaptiveDialog( + context: context, + builder: (context) => this, + barrierDismissible: false, + ); final KeyVerification request; const KeyVerificationDialog({ - Key? key, + super.key, required this.request, - }) : super(key: key); + }); @override - _KeyVerificationPageState createState() => _KeyVerificationPageState(); + KeyVerificationPageState createState() => KeyVerificationPageState(); } -class _KeyVerificationPageState extends State { +class KeyVerificationPageState extends State { void Function()? originalOnUpdate; late final List sasEmoji; @@ -81,30 +70,33 @@ class _KeyVerificationPageState extends State { if (input.isEmpty) return; final valid = await showFutureLoadingDialog( - context: context, - future: () async { - // make sure the loading spinner shows before we test the keys - await Future.delayed(const Duration(milliseconds: 100)); - var valid = false; - try { - await widget.request.openSSSS(keyOrPassphrase: input); - valid = true; - } catch (_) { - valid = false; - } - return valid; - }); + context: context, + future: () async { + // make sure the loading spinner shows before we test the keys + await Future.delayed(const Duration(milliseconds: 100)); + var valid = false; + try { + await widget.request.openSSSS(keyOrPassphrase: input); + valid = true; + } catch (_) { + valid = false; + } + return valid; + }, + ); if (valid.error != null) { await showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.incorrectPassphraseOrKey, + title: L10n.of(context).incorrectPassphraseOrKey, ); } } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + User? user; final directChatId = widget.request.client.getDirectChatFromUserId(widget.request.userId); @@ -115,10 +107,14 @@ class _KeyVerificationPageState extends State { } final displayName = user?.calcDisplayname() ?? widget.request.userId.localpart!; - var title = Text(L10n.of(context)!.verifyTitle); + var title = Text(L10n.of(context).verifyTitle); Widget body; final buttons = []; + switch (widget.request.state) { + case KeyVerificationState.showQRSuccess: + case KeyVerificationState.confirmQRScan: + throw 'Not implemented'; case KeyVerificationState.askSSSS: // prompt the user for their ssss passphrase / key final textEditingController = TextEditingController(); @@ -128,8 +124,10 @@ class _KeyVerificationPageState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text(L10n.of(context)!.askSSSSSign, - style: const TextStyle(fontSize: 20)), + Text( + L10n.of(context).askSSSSSign, + style: const TextStyle(fontSize: 20), + ), Container(height: 10), TextField( controller: textEditingController, @@ -143,125 +141,121 @@ class _KeyVerificationPageState extends State { maxLines: 1, obscureText: true, decoration: InputDecoration( - hintText: L10n.of(context)!.passphraseOrKey, - prefixStyle: TextStyle(color: Theme.of(context).primaryColor), - suffixStyle: TextStyle(color: Theme.of(context).primaryColor), + hintText: L10n.of(context).passphraseOrKey, + prefixStyle: TextStyle(color: theme.colorScheme.primary), + suffixStyle: TextStyle(color: theme.colorScheme.primary), border: const OutlineInputBorder(), ), ), ], ), ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.submit, - onPressed: () => checkInput(textEditingController.text), - )); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.skip, - onPressed: () => widget.request.openSSSS(skip: true), - )); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).submit, + ), + onPressed: () => checkInput(textEditingController.text), + ), + ); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).skip, + ), + onPressed: () => widget.request.openSSSS(skip: true), + ), + ); break; case KeyVerificationState.askAccept: - title = Text(L10n.of(context)!.newVerificationRequest); + title = Text(L10n.of(context).newVerificationRequest); body = Column( mainAxisSize: MainAxisSize.min, children: [ - Row(children: [ - if (!PlatformInfos.isCupertinoStyle) - Avatar(mxContent: user?.avatarUrl, name: displayName), - const SizedBox(width: 12), - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: PlatformInfos.isCupertinoStyle - ? CrossAxisAlignment.center - : CrossAxisAlignment.start, - children: [ - Text( - displayName, - style: const TextStyle(fontSize: 16), - ), - Text( - '${widget.request.userId} - ${widget.request.deviceId}', - style: const TextStyle( - fontWeight: FontWeight.w300, - fontSize: 14, - ), - ), - ], - ), - ), - ]), const SizedBox(height: 16), - Image.asset('assets/verification.png', fit: BoxFit.contain), + Avatar( + mxContent: user?.avatarUrl, + name: displayName, + size: Avatar.defaultSize * 2, + ), const SizedBox(height: 16), Text( - L10n.of(context)!.askVerificationRequest(displayName), - ) + L10n.of(context).askVerificationRequest(displayName), + ), ], ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.reject, - textColor: Colors.red, - onPressed: () => widget.request - .rejectVerification() - .then((_) => Navigator.of(context, rootNavigator: false).pop()), - )); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.accept, - onPressed: () => widget.request.acceptVerification(), - )); + buttons.add( + TextButton.icon( + icon: const Icon(Icons.close), + style: TextButton.styleFrom(foregroundColor: Colors.red), + label: Text(L10n.of(context).reject), + onPressed: () => widget.request + .rejectVerification() + .then((_) => Navigator.of(context, rootNavigator: false).pop()), + ), + ); + buttons.add( + TextButton.icon( + icon: const Icon(Icons.check), + label: Text(L10n.of(context).accept), + onPressed: () => widget.request.acceptVerification(), + ), + ); break; + case KeyVerificationState.askChoice: case KeyVerificationState.waitingAccept: - body = Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset('assets/verification.png', fit: BoxFit.contain), - const SizedBox(height: 16), - const CircularProgressIndicator.adaptive(strokeWidth: 2), - const SizedBox(height: 16), - Text( - L10n.of(context)!.waitingPartnerAcceptRequest, - textAlign: TextAlign.center, - ), - ], + body = Center( + child: Column( + children: [ + Stack( + alignment: Alignment.center, + children: [ + Avatar( + mxContent: user?.avatarUrl, + name: displayName, + ), + const SizedBox( + width: Avatar.defaultSize + 2, + height: Avatar.defaultSize + 2, + child: CircularProgressIndicator(strokeWidth: 2), + ), + ], + ), + const SizedBox(height: 16), + Text( + L10n.of(context).waitingPartnerAcceptRequest, + textAlign: TextAlign.center, + ), + ], + ), + ); + buttons.add( + TextButton.icon( + icon: const Icon(Icons.close), + label: Text(L10n.of(context).cancel), + onPressed: () => widget.request.cancel(), + ), ); - final key = widget.request.client.userDeviceKeys[widget.request.userId] - ?.deviceKeys[widget.request.deviceId]; - if (key != null) { - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.verifyManual, - onPressed: () async { - final result = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.verifyManual, - message: key.ed25519Key?.beautified ?? 'Key not found', - ); - if (result == OkCancelResult.ok) { - await key.setVerified(true); - } - await widget.request.cancel(); - Navigator.of(context, rootNavigator: false).pop(); - }, - )); - } break; case KeyVerificationState.askSas: TextSpan compareWidget; // maybe add a button to switch between the two and only determine default // view for if "emoji" is a present sasType or not? - String compareText; + if (widget.request.sasTypes.contains('emoji')) { - compareText = L10n.of(context)!.compareEmojiMatch; + title = Text( + L10n.of(context).compareEmojiMatch, + maxLines: 1, + style: const TextStyle(fontSize: 16), + ); compareWidget = TextSpan( children: widget.request.sasEmojis .map((e) => WidgetSpan(child: _Emoji(e, sasEmoji))) .toList(), ); } else { - compareText = L10n.of(context)!.compareNumbersMatch; + title = Text(L10n.of(context).compareNumbersMatch); final numbers = widget.request.sasNumbers; final numbstr = '${numbers[0]}-${numbers[1]}-${numbers[2]}'; compareWidget = @@ -270,34 +264,34 @@ class _KeyVerificationPageState extends State { body = Column( mainAxisSize: MainAxisSize.min, children: [ - Center( - child: Text( - compareText, - style: const TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - ), - const SizedBox(height: 10), Text.rich( compareWidget, textAlign: TextAlign.center, ), ], ); - buttons.add(AdaptiveFlatButton( - textColor: Colors.red, - label: L10n.of(context)!.theyDontMatch, - onPressed: () => widget.request.rejectSas(), - )); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.theyMatch, - onPressed: () => widget.request.acceptSas(), - )); + buttons.add( + TextButton.icon( + icon: const Icon(Icons.close), + style: TextButton.styleFrom( + foregroundColor: Colors.red, + ), + label: Text(L10n.of(context).theyDontMatch), + onPressed: () => widget.request.rejectSas(), + ), + ); + buttons.add( + TextButton.icon( + icon: const Icon(Icons.check_outlined), + label: Text(L10n.of(context).theyMatch), + onPressed: () => widget.request.acceptSas(), + ), + ); break; case KeyVerificationState.waitingSas: final acceptText = widget.request.sasTypes.contains('emoji') - ? L10n.of(context)!.waitingPartnerEmoji - : L10n.of(context)!.waitingPartnerNumbers; + ? L10n.of(context).waitingPartnerEmoji + : L10n.of(context).waitingPartnerNumbers; body = Column( mainAxisSize: MainAxisSize.min, children: [ @@ -314,58 +308,61 @@ class _KeyVerificationPageState extends State { body = Column( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.check_circle_outlined, - color: Colors.green, size: 200.0), + const Icon( + Icons.check_circle_outlined, + color: Colors.green, + size: 128.0, + ), const SizedBox(height: 10), Text( - L10n.of(context)!.verifySuccess, + L10n.of(context).verifySuccess, textAlign: TextAlign.center, ), ], ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), - )); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).close, + ), + onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + ), + ); break; case KeyVerificationState.error: + title = const Text(''); body = Column( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.cancel, color: Colors.red, size: 200.0), - const SizedBox(height: 10), + const Icon(Icons.cancel, color: Colors.red, size: 128.0), + const SizedBox(height: 16), + // TODO: Add better error UI to user Text( 'Error ${widget.request.canceledCode}: ${widget.request.canceledReason}', textAlign: TextAlign.center, ), ], ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), - )); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).close, + ), + onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + ), + ); break; } - final content = SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(height: 16), - body, - ], - ), - ); - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: content, - actions: buttons, - ); - } - return AlertDialog( + + return AlertDialog.adaptive( title: title, - content: content, + content: SizedBox( + height: 256, + width: 256, + child: ListView( + children: [body], + ), + ), actions: buttons, ); } @@ -384,9 +381,10 @@ class _Emoji extends StatelessWidget { return emoji.name; } final translations = Map.from( - sasEmoji[emoji.number]['translated_descriptions']); + sasEmoji[emoji.number]['translated_descriptions'], + ); translations['en'] = emoji.name; - for (final locale in window.locales) { + for (final locale in PlatformDispatcher.instance.locales) { final wantLocaleParts = locale.toString().split('_'); final wantLanguage = wantLocaleParts.removeAt(0); for (final haveLocale in translations.keys) { @@ -408,7 +406,10 @@ class _Emoji extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text(emoji.emoji, style: const TextStyle(fontSize: 50)), - Text(getLocalizedName()), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Text(getLocalizedName()), + ), const SizedBox(height: 10, width: 5), ], ); diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 530fccafc2..4ad6ac41ae 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -2,18 +2,19 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:email_validator/email_validator.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/platform_infos.dart'; import 'login_view.dart'; class Login extends StatefulWidget { - const Login({Key? key}) : super(key: key); + const Login({super.key}); @override LoginController createState() => LoginController(); @@ -27,17 +28,18 @@ class LoginController extends State { bool loading = false; bool showPassword = false; - void toggleShowPassword() => setState(() => showPassword = !showPassword); + void toggleShowPassword() => + setState(() => showPassword = !loading && !showPassword); - void login([_]) async { + void login() async { final matrix = Matrix.of(context); if (usernameController.text.isEmpty) { - setState(() => usernameError = L10n.of(context)!.pleaseEnterYourUsername); + setState(() => usernameError = L10n.of(context).pleaseEnterYourUsername); } else { setState(() => usernameError = null); } if (passwordController.text.isEmpty) { - setState(() => passwordError = L10n.of(context)!.pleaseEnterYourPassword); + setState(() => passwordError = L10n.of(context).pleaseEnterYourPassword); } else { setState(() => passwordError = null); } @@ -47,6 +49,9 @@ class LoginController extends State { } setState(() => loading = true); + + _coolDown?.cancel(); + try { final username = usernameController.text; AuthenticationIdentifier identifier; @@ -63,15 +68,17 @@ class LoginController extends State { } else { identifier = AuthenticationUserIdentifier(user: username); } - await matrix.getLoginClient().login(LoginType.mLoginPassword, - identifier: identifier, - // To stay compatible with older server versions - // ignore: deprecated_member_use - user: identifier.type == AuthenticationIdentifierTypes.userId - ? username - : null, - password: passwordController.text, - initialDeviceDisplayName: PlatformInfos.clientName); + await matrix.getLoginClient().login( + LoginType.mLoginPassword, + identifier: identifier, + // To stay compatible with older server versions + // ignore: deprecated_member_use + user: identifier.type == AuthenticationIdentifierTypes.userId + ? username + : null, + password: passwordController.text, + initialDeviceDisplayName: PlatformInfos.clientName, + ); } on MatrixException catch (exception) { setState(() => passwordError = exception.errorMessage); return setState(() => loading = false); @@ -94,10 +101,10 @@ class LoginController extends State { } void _checkWellKnown(String userId) async { - setState(() => usernameError = null); + if (mounted) setState(() => usernameError = null); if (!userId.isValidMatrixId) return; + final oldHomeserver = Matrix.of(context).getLoginClient().homeserver; try { - final oldHomeserver = Matrix.of(context).getLoginClient().homeserver; var newDomain = Uri.https(userId.domain!, ''); Matrix.of(context).getLoginClient().homeserver = newDomain; DiscoveryInformation? wellKnownInformation; @@ -111,41 +118,40 @@ class LoginController extends State { // do nothing, newDomain is already set to a reasonable fallback } if (newDomain != oldHomeserver) { - await showFutureLoadingDialog( - context: context, - // do nothing if we error, we'll handle it below - future: () => Matrix.of(context) - .getLoginClient() - .checkHomeserver(newDomain) - .catchError((e) {}), - ); + await Matrix.of(context).getLoginClient().checkHomeserver(newDomain); + if (Matrix.of(context).getLoginClient().homeserver == null) { Matrix.of(context).getLoginClient().homeserver = oldHomeserver; // okay, the server we checked does not appear to be a matrix server Logs().v( - '$newDomain is not running a homeserver, asking to use $oldHomeserver'); + '$newDomain is not running a homeserver, asking to use $oldHomeserver', + ); final dialogResult = await showOkCancelAlertDialog( context: context, useRootNavigator: false, - message: - L10n.of(context)!.noMatrixServer(newDomain, oldHomeserver!), - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).noMatrixServer(newDomain, oldHomeserver!), + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, ); if (dialogResult == OkCancelResult.ok) { - setState(() => usernameError = null); + if (mounted) setState(() => usernameError = null); } else { Navigator.of(context, rootNavigator: false).pop(); return; } } - setState(() => usernameError = null); + usernameError = null; + if (mounted) setState(() {}); } else { - setState(() => - Matrix.of(context).getLoginClient().homeserver = oldHomeserver); + Matrix.of(context).getLoginClient().homeserver = oldHomeserver; + if (mounted) { + setState(() {}); + } } } catch (e) { - setState(() => usernameError = e.toString()); + Matrix.of(context).getLoginClient().homeserver = oldHomeserver; + usernameError = e.toLocalizedString(context); + if (mounted) setState(() {}); } } @@ -153,19 +159,14 @@ class LoginController extends State { final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.passwordForgotten, - message: L10n.of(context)!.enterAnEmailAddress, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - fullyCapitalizedForMaterial: false, - textFields: [ - DialogTextField( - initialText: - usernameController.text.isEmail ? usernameController.text : '', - hintText: L10n.of(context)!.enterAnEmailAddress, - keyboardType: TextInputType.emailAddress, - ), - ], + title: L10n.of(context).passwordForgotten, + message: L10n.of(context).enterAnEmailAddress, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + initialText: + usernameController.text.isEmail ? usernameController.text : '', + hintText: L10n.of(context).enterAnEmailAddress, + keyboardType: TextInputType.emailAddress, ); if (input == null) return; final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); @@ -174,7 +175,7 @@ class LoginController extends State { future: () => Matrix.of(context).getLoginClient().requestTokenToResetPasswordEmail( clientSecret, - input.single, + input, sendAttempt++, ), ); @@ -182,32 +183,26 @@ class LoginController extends State { final password = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.passwordForgotten, - message: L10n.of(context)!.chooseAStrongPassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - fullyCapitalizedForMaterial: false, - textFields: [ - const DialogTextField( - hintText: '******', - obscureText: true, - minLines: 1, - maxLines: 1, - ), - ], + title: L10n.of(context).passwordForgotten, + message: L10n.of(context).chooseAStrongPassword, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: '******', + obscureText: true, + minLines: 1, + maxLines: 1, ); if (password == null) return; final ok = await showOkAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.weSentYouAnEmail, - message: L10n.of(context)!.pleaseClickOnLink, - okLabel: L10n.of(context)!.iHaveClickedOnLink, - fullyCapitalizedForMaterial: false, + title: L10n.of(context).weSentYouAnEmail, + message: L10n.of(context).pleaseClickOnLink, + okLabel: L10n.of(context).iHaveClickedOnLink, ); if (ok != OkCancelResult.ok) return; final data = { - 'new_password': password.single, + 'new_password': password, 'logout_devices': false, "auth": AuthenticationThreePidCreds( type: AuthenticationTypes.emailIdentity, @@ -221,15 +216,16 @@ class LoginController extends State { context: context, future: () => Matrix.of(context).getLoginClient().request( RequestType.POST, - '/client/r0/account/password', + '/client/v3/account/password', data: data, ), ); if (success.error == null) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.passwordHasBeenChanged))); - usernameController.text = input.single; - passwordController.text = password.single; + SnackBar(content: Text(L10n.of(context).passwordHasBeenChanged)), + ); + usernameController.text = input; + passwordController.text = password; login(); } } @@ -243,6 +239,9 @@ class LoginController extends State { extension on String { static final RegExp _phoneRegex = RegExp(r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'); - bool get isEmail => EmailValidator.validate(this); + static final RegExp _emailRegex = RegExp(r'(.+)@(.+)\.(.+)'); + + bool get isEmail => _emailRegex.hasMatch(this); + bool get isPhoneNumber => _phoneRegex.hasMatch(this); } diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart index b74ac9f819..5b04bbad07 100644 --- a/lib/pages/login/login_view.dart +++ b/lib/pages/login/login_view.dart @@ -9,125 +9,135 @@ import 'login.dart'; class LoginView extends StatelessWidget { final LoginController controller; - const LoginView(this.controller, {Key? key}) : super(key: key); + const LoginView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final homeserver = Matrix.of(context) + .getLoginClient() + .homeserver + .toString() + .replaceFirst('https://', ''); + final title = L10n.of(context).logInTo(homeserver); + final titleParts = title.split(homeserver); + return LoginScaffold( + enforceMobileMode: Matrix.of(context).client.isLogged(), appBar: AppBar( + leading: controller.loading ? null : const Center(child: BackButton()), automaticallyImplyLeading: !controller.loading, - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - centerTitle: true, - title: Text( - L10n.of(context)!.logInTo(Matrix.of(context) - .getLoginClient() - .homeserver - .toString() - .replaceFirst('https://', '')), - style: const TextStyle(color: Colors.white), + titleSpacing: !controller.loading ? 0 : null, + title: Text.rich( + TextSpan( + children: [ + TextSpan(text: titleParts.first), + TextSpan( + text: homeserver, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + TextSpan(text: titleParts.last), + ], + ), + style: const TextStyle(fontSize: 18), ), ), - body: Builder(builder: (context) { - return AutofillGroup( - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - readOnly: controller.loading, - autocorrect: false, - autofocus: true, - onChanged: controller.checkWellKnownWithCoolDown, - controller: controller.usernameController, - textInputAction: TextInputAction.next, - keyboardType: TextInputType.emailAddress, - autofillHints: - controller.loading ? null : [AutofillHints.username], - decoration: InputDecoration( - prefixIcon: const Icon(Icons.account_box_outlined), - errorText: controller.usernameError, - hintText: L10n.of(context)!.emailOrUsername, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), + body: Builder( + builder: (context) { + return AutofillGroup( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + children: [ + Hero( + tag: 'info-logo', + child: Image.asset('assets/banner_transparent.png'), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: TextField( + readOnly: controller.loading, + autocorrect: false, + autofocus: true, + onChanged: controller.checkWellKnownWithCoolDown, + controller: controller.usernameController, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.emailAddress, + autofillHints: + controller.loading ? null : [AutofillHints.username], + decoration: InputDecoration( + prefixIcon: const Icon(Icons.account_box_outlined), + errorText: controller.usernameError, + errorStyle: const TextStyle(color: Colors.orange), + hintText: '@username:domain', + labelText: L10n.of(context).emailOrUsername, + ), ), ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - readOnly: controller.loading, - autocorrect: false, - autofillHints: - controller.loading ? null : [AutofillHints.password], - controller: controller.passwordController, - textInputAction: TextInputAction.next, - obscureText: !controller.showPassword, - onSubmitted: controller.login, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.lock_outlined), - errorText: controller.passwordError, - suffixIcon: IconButton( - tooltip: L10n.of(context)!.showPassword, - icon: Icon( - controller.showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined, - color: Colors.black, + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: TextField( + readOnly: controller.loading, + autocorrect: false, + autofillHints: + controller.loading ? null : [AutofillHints.password], + controller: controller.passwordController, + textInputAction: TextInputAction.go, + obscureText: !controller.showPassword, + onSubmitted: (_) => controller.login(), + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outlined), + errorText: controller.passwordError, + errorStyle: const TextStyle(color: Colors.orange), + suffixIcon: IconButton( + onPressed: controller.toggleShowPassword, + icon: Icon( + controller.showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + color: Colors.black, + ), ), - onPressed: controller.toggleShowPassword, + hintText: '******', + labelText: L10n.of(context).password, ), - hintText: L10n.of(context)!.password, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), ), ), - ), - Hero( - tag: 'signinButton', - child: Padding( - padding: const EdgeInsets.all(16), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), child: ElevatedButton( - onPressed: controller.loading - ? null - : () => controller.login(context), + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: controller.loading ? null : controller.login, child: controller.loading ? const LinearProgressIndicator() - : Text(L10n.of(context)!.login), + : Text(L10n.of(context).login), ), ), - ), - Row( - children: [ - const Expanded(child: Divider(color: Colors.white)), - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - L10n.of(context)!.or, - style: const TextStyle(color: Colors.white), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: TextButton( + onPressed: controller.loading + ? () {} + : controller.passwordForgotten, + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, ), + child: Text(L10n.of(context).passwordForgotten), ), - const Expanded(child: Divider(color: Colors.white)), - ], - ), - Padding( - padding: const EdgeInsets.all(16), - child: ElevatedButton( - onPressed: - controller.loading ? () {} : controller.passwordForgotten, - style: ElevatedButton.styleFrom(onPrimary: Colors.red), - child: Text(L10n.of(context)!.passwordForgotten), ), - ), - ], - ), - ); - }), + const SizedBox(height: 16), + ], + ), + ); + }, + ), ); } } diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index d5ae96376a..1fc59b18ea 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -1,44 +1,143 @@ +import 'dart:typed_data'; + import 'package:flutter/material.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart' as sdk; -import 'package:vrouter/vrouter.dart'; +import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/new_group/new_group_view.dart'; +import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/widgets/matrix.dart'; class NewGroup extends StatefulWidget { - const NewGroup({Key? key}) : super(key: key); + final CreateGroupType createGroupType; + const NewGroup({ + this.createGroupType = CreateGroupType.group, + super.key, + }); @override NewGroupController createState() => NewGroupController(); } class NewGroupController extends State { - TextEditingController controller = TextEditingController(); + TextEditingController nameController = TextEditingController(); + bool publicGroup = false; + bool groupCanBeFound = true; + + Uint8List? avatar; + + Uri? avatarUrl; + + Object? error; + + bool loading = false; + + CreateGroupType get createGroupType => + _createGroupType ?? widget.createGroupType; + + CreateGroupType? _createGroupType; + + void setCreateGroupType(Set b) => + setState(() => _createGroupType = b.single); void setPublicGroup(bool b) => setState(() => publicGroup = b); - void submitAction([_]) async { - final client = Matrix.of(context).client; - final roomID = await showFutureLoadingDialog( - context: context, - future: () async { - final roomId = await client.createGroupChat( + void setGroupCanBeFound(bool b) => setState(() => groupCanBeFound = b); + + void selectPhoto() async { + final photo = await selectFiles( + context, + type: FileSelectorType.images, + allowMultiple: false, + ); + final bytes = await photo.singleOrNull?.readAsBytes(); + + setState(() { + avatarUrl = null; + avatar = bytes; + }); + } + + Future _createGroup() async { + if (!mounted) return; + final roomId = await Matrix.of(context).client.createGroupChat( + visibility: + groupCanBeFound ? sdk.Visibility.public : sdk.Visibility.private, + preset: publicGroup + ? sdk.CreateRoomPreset.publicChat + : sdk.CreateRoomPreset.privateChat, + groupName: nameController.text.isNotEmpty ? nameController.text : null, + initialState: [ + if (avatar != null) + sdk.StateEvent( + type: sdk.EventTypes.RoomAvatar, + content: {'url': avatarUrl.toString()}, + ), + ], + ); + if (!mounted) return; + context.go('/rooms/$roomId/invite'); + } + + Future _createSpace() async { + if (!mounted) return; + final spaceId = await Matrix.of(context).client.createRoom( preset: publicGroup ? sdk.CreateRoomPreset.publicChat : sdk.CreateRoomPreset.privateChat, - groupName: controller.text.isNotEmpty ? controller.text : null, + creationContent: {'type': RoomCreationTypes.mSpace}, + visibility: publicGroup ? sdk.Visibility.public : null, + roomAliasName: publicGroup + ? nameController.text.trim().toLowerCase().replaceAll(' ', '_') + : null, + name: nameController.text.trim(), + powerLevelContentOverride: {'events_default': 100}, + initialState: [ + if (avatar != null) + sdk.StateEvent( + type: sdk.EventTypes.RoomAvatar, + content: {'url': avatarUrl.toString()}, + ), + ], ); - return roomId; - }, - ); - if (roomID.error == null) { - VRouter.of(context).toSegments(['rooms', roomID.result!, 'invite']); + if (!mounted) return; + context.pop(spaceId); + } + + void submitAction([_]) async { + final client = Matrix.of(context).client; + + try { + setState(() { + loading = true; + error = null; + }); + + final avatar = this.avatar; + avatarUrl ??= avatar == null ? null : await client.uploadContent(avatar); + + if (!mounted) return; + + switch (createGroupType) { + case CreateGroupType.group: + await _createGroup(); + case CreateGroupType.space: + await _createSpace(); + } + } catch (e, s) { + sdk.Logs().d('Unable to create group', e, s); + setState(() { + error = e; + loading = false; + }); } } @override Widget build(BuildContext context) => NewGroupView(this); } + +enum CreateGroupType { group, space } diff --git a/lib/pages/new_group/new_group_view.dart b/lib/pages/new_group/new_group_view.dart index 628ab9399b..f4cfe3464a 100644 --- a/lib/pages/new_group/new_group_view.dart +++ b/lib/pages/new_group/new_group_view.dart @@ -2,53 +2,195 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; class NewGroupView extends StatelessWidget { final NewGroupController controller; - const NewGroupView(this.controller, {Key? key}) : super(key: key); + const NewGroupView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final avatar = controller.avatar; + final error = controller.error; return Scaffold( appBar: AppBar( - title: Text(L10n.of(context)!.createNewGroup), + leading: Center( + child: BackButton( + onPressed: controller.loading ? null : Navigator.of(context).pop, + ), + ), + title: Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).newSpace + : L10n.of(context).createGroup, + ), ), body: MaxWidthBody( child: Column( mainAxisSize: MainAxisSize.min, children: [ Padding( - padding: const EdgeInsets.all(12.0), + padding: const EdgeInsets.all(16.0), + child: SegmentedButton( + selected: {controller.createGroupType}, + onSelectionChanged: controller.setCreateGroupType, + segments: [ + ButtonSegment( + value: CreateGroupType.group, + label: Text(L10n.of(context).group), + ), + ButtonSegment( + value: CreateGroupType.space, + label: Text(L10n.of(context).space), + ), + ], + ), + ), + const SizedBox(height: 16), + InkWell( + borderRadius: BorderRadius.circular(90), + onTap: controller.loading ? null : controller.selectPhoto, + child: CircleAvatar( + radius: Avatar.defaultSize, + child: avatar == null + ? const Icon(Icons.add_a_photo_outlined) + : ClipRRect( + borderRadius: BorderRadius.circular(90), + child: Image.memory( + avatar, + width: Avatar.defaultSize * 2, + height: Avatar.defaultSize * 2, + fit: BoxFit.cover, + ), + ), + ), + ), + const SizedBox(height: 32), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), child: TextField( - controller: controller.controller, autofocus: true, + controller: controller.nameController, autocorrect: false, - textInputAction: TextInputAction.go, - onSubmitted: controller.submitAction, + readOnly: controller.loading, decoration: InputDecoration( - labelText: L10n.of(context)!.optionalGroupName, - prefixIcon: const Icon(Icons.people_outlined), - hintText: L10n.of(context)!.enterAGroupName), + prefixIcon: const Icon(Icons.people_outlined), + labelText: controller.createGroupType == CreateGroupType.space + ? L10n.of(context).spaceName + : L10n.of(context).groupName, + ), ), ), + const SizedBox(height: 16), SwitchListTile.adaptive( - title: Text(L10n.of(context)!.groupIsPublic), + contentPadding: const EdgeInsets.symmetric(horizontal: 32), + secondary: const Icon(Icons.public_outlined), + title: Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).spaceIsPublic + : L10n.of(context).groupIsPublic, + ), value: controller.publicGroup, - onChanged: controller.setPublicGroup, + onChanged: controller.loading ? null : controller.setPublicGroup, + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.publicGroup + ? SwitchListTile.adaptive( + contentPadding: + const EdgeInsets.symmetric(horizontal: 32), + secondary: const Icon(Icons.search_outlined), + title: Text(L10n.of(context).groupCanBeFoundViaSearch), + value: controller.groupCanBeFound, + onChanged: controller.loading + ? null + : controller.setGroupCanBeFound, + ) + : const SizedBox.shrink(), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.createGroupType == CreateGroupType.space + ? const SizedBox.shrink() + : SwitchListTile.adaptive( + contentPadding: + const EdgeInsets.symmetric(horizontal: 32), + secondary: Icon( + Icons.lock_outlined, + color: theme.colorScheme.onSurface, + ), + title: Text( + L10n.of(context).enableEncryption, + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + value: !controller.publicGroup, + onChanged: null, + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.createGroupType == CreateGroupType.space + ? ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 32), + trailing: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Icon(Icons.info_outlined), + ), + subtitle: Text(L10n.of(context).newSpaceDescription), + ) + : const SizedBox.shrink(), ), - Expanded( - child: Image.asset('assets/private_chat_wallpaper.png'), + Padding( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: + controller.loading ? null : controller.submitAction, + child: controller.loading + ? const LinearProgressIndicator() + : Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).createNewSpace + : L10n.of(context).createGroupAndInviteUsers, + ), + ), + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: error == null + ? const SizedBox.shrink() + : ListTile( + leading: Icon( + Icons.warning_outlined, + color: theme.colorScheme.error, + ), + title: Text( + error.toLocalizedString(context), + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ), ), ], ), ), - floatingActionButton: FloatingActionButton( - onPressed: controller.submitAction, - child: const Icon(Icons.arrow_forward_outlined), - ), ); } } diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart index 0a2a7be147..7cb177afce 100644 --- a/lib/pages/new_private_chat/new_private_chat.dart +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -7,13 +9,15 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart'; import 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart'; +import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/matrix.dart'; class NewPrivateChat extends StatefulWidget { - const NewPrivateChat({Key? key}) : super(key: key); + const NewPrivateChat({super.key}); @override NewPrivateChatController createState() => NewPrivateChatController(); @@ -22,89 +26,86 @@ class NewPrivateChat extends StatefulWidget { class NewPrivateChatController extends State { final TextEditingController controller = TextEditingController(); final FocusNode textFieldFocus = FocusNode(); - final formKey = GlobalKey(); - bool loading = false; - - bool _hideFab = false; - - // remove leading matrix.to from text field in order to simplify pasting - final List removeMatrixToFormatters = [ - FilteringTextInputFormatter.deny(NewPrivateChatController.prefix), - FilteringTextInputFormatter.deny(NewPrivateChatController.prefixNoProtocol), - ]; - bool get hideFab => _hideFab; + Future>? searchResponse; - static const Set supportedSigils = {'@', '!', '#'}; + Timer? _searchCoolDown; - static const String prefix = 'https://matrix.to/#/'; - static const String prefixNoProtocol = 'matrix.to/#/'; + static const Duration _coolDown = Duration(milliseconds: 500); - void setHideFab() { - if (textFieldFocus.hasFocus != _hideFab) { - setState(() => _hideFab = textFieldFocus.hasFocus); + void searchUsers([String? input]) async { + final searchTerm = input ?? controller.text; + if (searchTerm.isEmpty) { + _searchCoolDown?.cancel(); + setState(() { + searchResponse = _searchCoolDown = null; + }); + return; } - } - - @override - void initState() { - super.initState(); - textFieldFocus.addListener(setHideFab); - } - @override - void dispose() { - textFieldFocus.removeListener(setHideFab); - super.dispose(); + _searchCoolDown?.cancel(); + _searchCoolDown = Timer(_coolDown, () { + setState(() { + searchResponse = _searchUser(searchTerm); + }); + }); } - void submitAction([_]) async { - controller.text = controller.text.trim(); - if (!formKey.currentState!.validate()) return; - UrlLauncher(context, '$prefix${controller.text}').openMatrixToUrl(); - } + Future> _searchUser(String searchTerm) async { + final result = + await Matrix.of(context).client.searchUserDirectory(searchTerm); + final profiles = result.results; - String? validateForm(String? value) { - if (value!.isEmpty) { - return L10n.of(context)!.pleaseEnterAMatrixIdentifier; - } - if (!controller.text.isValidMatrixId || - !supportedSigils.contains(controller.text.sigil)) { - return L10n.of(context)!.makeSureTheIdentifierIsValid; + if (searchTerm.isValidMatrixId && + searchTerm.sigil == '@' && + !profiles.any((profile) => profile.userId == searchTerm)) { + profiles.add(Profile(userId: searchTerm)); } - if (controller.text == Matrix.of(context).client.userID) { - return L10n.of(context)!.youCannotInviteYourself; - } - return null; + + return profiles; } - void inviteAction() => FluffyShare.share( - 'https://matrix.to/#/${Matrix.of(context).client.userID}', - context, - ); + void inviteAction() => FluffyShare.shareInviteLink(context); void openScannerAction() async { if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; - if ((info.version.sdkInt ?? 16) < 21) { + if (info.version.sdkInt < 21) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - L10n.of(context)!.unsupportedAndroidVersionLong, + L10n.of(context).unsupportedAndroidVersionLong, ), ), ); return; } } - await showModalBottomSheet( + await showAdaptiveBottomSheet( context: context, - useRootNavigator: false, - //useSafeArea: false, - builder: (_) => const QrScannerModal(), + builder: (_) => QrScannerModal( + onScan: (link) => UrlLauncher(context, link).openMatrixToUrl(), + ), ); } + void copyUserId() async { + await Clipboard.setData( + ClipboardData(text: Matrix.of(context).client.userID!), + ); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).copiedToClipboard)), + ); + } + + void openUserModal(Profile profile) => showAdaptiveBottomSheet( + context: context, + builder: (c) => UserBottomSheet( + profile: profile, + outerContext: context, + ), + ); + @override Widget build(BuildContext context) => NewPrivateChatView(this); } diff --git a/lib/pages/new_private_chat/new_private_chat_view.dart b/lib/pages/new_private_chat/new_private_chat_view.dart index 671dfc6545..6dd01a13f7 100644 --- a/lib/pages/new_private_chat/new_private_chat_view.dart +++ b/lib/pages/new_private_chat/new_private_chat_view.dart @@ -1,114 +1,279 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:qr_flutter/qr_flutter.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import '../../widgets/qr_code_viewer.dart'; class NewPrivateChatView extends StatelessWidget { final NewPrivateChatController controller; - const NewPrivateChatView(this.controller, {Key? key}) : super(key: key); - - static const double _qrCodePadding = 8; + const NewPrivateChatView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final searchResponse = controller.searchResponse; + final userId = Matrix.of(context).client.userID!; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.newChat), - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + scrolledUnderElevation: 0, + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).newChat), + backgroundColor: theme.scaffoldBackgroundColor, actions: [ TextButton( - onPressed: () => VRouter.of(context).to('/newgroup'), - child: Text( - L10n.of(context)!.createNewGroup, - style: TextStyle(color: Theme.of(context).colorScheme.secondary), - ), - ) + onPressed: + UrlLauncher(context, AppConfig.startChatTutorial).launchUrl, + child: Text(L10n.of(context).help), + ), ], ), body: MaxWidthBody( - withScrolling: true, + withScrolling: false, + innerPadding: const EdgeInsets.symmetric(vertical: 8), child: Column( children: [ - Container( - margin: const EdgeInsets.all(_qrCodePadding), - alignment: Alignment.center, - padding: const EdgeInsets.all(_qrCodePadding * 2), - child: InkWell( - onTap: controller.inviteAction, - borderRadius: BorderRadius.circular(12), - child: Material( - borderRadius: BorderRadius.circular(12), - elevation: 6, - color: Colors.white, - shadowColor: const Color(0x44000000), - clipBehavior: Clip.hardEdge, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - QrImage( - data: - 'https://matrix.to/#/${Matrix.of(context).client.userID}', - version: QrVersions.auto, - size: min(MediaQuery.of(context).size.width - 16, 200), - ), - Image.asset('assets/share.png', width: 48, height: 48), - ], + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: TextField( + controller: controller.controller, + onChanged: controller.searchUsers, + decoration: InputDecoration( + hintText: L10n.of(context).searchForUsers, + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, ), + prefixIcon: searchResponse == null + ? const Icon(Icons.search_outlined) + : FutureBuilder( + future: searchResponse, + builder: (context, snapshot) { + if (snapshot.connectionState != + ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(10.0), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 1, + ), + ), + ); + } + return const Icon(Icons.search_outlined); + }, + ), + suffixIcon: controller.controller.text.isEmpty + ? null + : IconButton( + icon: const Icon(Icons.clear_outlined), + onPressed: () { + controller.controller.clear(); + controller.searchUsers(); + }, + ), ), ), ), - ListTile( - subtitle: Text( - L10n.of(context)!.createNewChatExplaination, - textAlign: TextAlign.center, - ), - ), - Padding( - padding: const EdgeInsets.all(12), - child: Form( - key: controller.formKey, - child: TextFormField( - controller: controller.controller, - autocorrect: false, - autofocus: !PlatformInfos.isMobile, - textInputAction: TextInputAction.go, - focusNode: controller.textFieldFocus, - onFieldSubmitted: controller.submitAction, - validator: controller.validateForm, - inputFormatters: controller.removeMatrixToFormatters, - decoration: InputDecoration( - labelText: L10n.of(context)!.typeInInviteLinkManually, - hintText: '@username', - prefixText: NewPrivateChatController.prefixNoProtocol, - suffixIcon: IconButton( - icon: const Icon(Icons.send_outlined), - onPressed: controller.submitAction, + Expanded( + child: AnimatedCrossFade( + duration: FluffyThemes.animationDuration, + crossFadeState: searchResponse == null + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: ListView( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18.0), + child: SelectableText.rich( + TextSpan( + children: [ + TextSpan( + text: L10n.of(context).yourGlobalUserIdIs, + ), + TextSpan( + text: Matrix.of(context).client.userID, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ), + ], + ), + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: 13, + ), + ), ), - ), + const SizedBox(height: 8), + ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + child: Icon(Icons.adaptive.share_outlined), + ), + title: Text(L10n.of(context).shareInviteLink), + onTap: controller.inviteAction, + ), + ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.tertiaryContainer, + foregroundColor: theme.colorScheme.onTertiaryContainer, + child: const Icon(Icons.group_add_outlined), + ), + title: Text(L10n.of(context).createGroup), + onTap: () => context.go('/rooms/newgroup'), + ), + if (PlatformInfos.isMobile) + ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.primaryContainer, + foregroundColor: theme.colorScheme.onPrimaryContainer, + child: const Icon(Icons.qr_code_scanner_outlined), + ), + title: Text(L10n.of(context).scanQrCode), + onTap: controller.openScannerAction, + ), + Center( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 64.0, + vertical: 24.0, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.primaryContainer, + clipBehavior: Clip.hardEdge, + child: InkWell( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + onTap: () => showQrCodeViewer( + context, + userId, + ), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: 256), + child: PrettyQrView.data( + data: 'https://matrix.to/#/$userId', + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 1, + color: + theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ), + secondChild: FutureBuilder( + future: searchResponse, + builder: (context, snapshot) { + final result = snapshot.data; + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: controller.searchUsers, + icon: const Icon(Icons.refresh_outlined), + label: Text(L10n.of(context).tryAgain), + ), + ], + ); + } + if (result == null) { + return const Center( + child: CircularProgressIndicator.adaptive(), + ); + } + if (result.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.search_outlined, size: 86), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + L10n.of(context).noUsersFoundWithQuery( + controller.controller.text, + ), + style: TextStyle( + color: theme.colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + ), + ], + ); + } + return ListView.builder( + itemCount: result.length, + itemBuilder: (context, i) { + final contact = result[i]; + final displayname = contact.displayName ?? + contact.userId.localpart ?? + contact.userId; + return ListTile( + leading: Avatar( + name: displayname, + mxContent: contact.avatarUrl, + presenceUserId: contact.userId, + ), + title: Text(displayname), + subtitle: Text(contact.userId), + onTap: () => controller.openUserModal(contact), + ); + }, + ); + }, ), ), ), ], ), ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, - floatingActionButton: PlatformInfos.isMobile && !controller.hideFab - ? FloatingActionButton.extended( - onPressed: controller.openScannerAction, - label: Text(L10n.of(context)!.scanQrCode), - icon: const Icon(Icons.camera_alt_outlined), - ) - : null, ); } } diff --git a/lib/pages/new_private_chat/qr_scanner_modal.dart b/lib/pages/new_private_chat/qr_scanner_modal.dart index 7368914193..f0c571ddd0 100644 --- a/lib/pages/new_private_chat/qr_scanner_modal.dart +++ b/lib/pages/new_private_chat/qr_scanner_modal.dart @@ -6,16 +6,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; -import 'package:fluffychat/utils/url_launcher.dart'; - class QrScannerModal extends StatefulWidget { - const QrScannerModal({Key? key}) : super(key: key); + final void Function(String) onScan; + const QrScannerModal({required this.onScan, super.key}); @override - _QrScannerModalState createState() => _QrScannerModalState(); + QrScannerModalState createState() => QrScannerModalState(); } -class _QrScannerModalState extends State { +class QrScannerModalState extends State { final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); QRViewController? controller; @@ -36,9 +35,9 @@ class _QrScannerModalState extends State { leading: IconButton( icon: const Icon(Icons.close_outlined), onPressed: Navigator.of(context).pop, - tooltip: L10n.of(context)!.close, + tooltip: L10n.of(context).close, ), - title: Text(L10n.of(context)!.scanQrCode), + title: Text(L10n.of(context).scanQrCode), ), body: Stack( children: [ @@ -46,7 +45,7 @@ class _QrScannerModalState extends State { key: qrKey, onQRViewCreated: _onQRViewCreated, overlay: QrScannerOverlayShape( - borderColor: Theme.of(context).primaryColor, + borderColor: Theme.of(context).colorScheme.primary, borderRadius: 10, borderLength: 30, borderWidth: 8, @@ -69,7 +68,8 @@ class _QrScannerModalState extends State { sub = controller.scannedDataStream.listen((scanData) { sub.cancel(); Navigator.of(context).pop(); - UrlLauncher(context, scanData.code).openMatrixToUrl(); + final data = scanData.code; + if (data != null) widget.onScan(data); }); } diff --git a/lib/pages/new_space/new_space.dart b/lib/pages/new_space/new_space.dart deleted file mode 100644 index 062b633604..0000000000 --- a/lib/pages/new_space/new_space.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart' as sdk; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/new_space/new_space_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class NewSpace extends StatefulWidget { - const NewSpace({Key? key}) : super(key: key); - - @override - NewSpaceController createState() => NewSpaceController(); -} - -class NewSpaceController extends State { - TextEditingController controller = TextEditingController(); - bool publicGroup = false; - - void setPublicGroup(bool b) => setState(() => publicGroup = b); - - void submitAction([_]) async { - final matrix = Matrix.of(context); - final roomID = await showFutureLoadingDialog( - context: context, - future: () => matrix.client.createRoom( - preset: publicGroup - ? sdk.CreateRoomPreset.publicChat - : sdk.CreateRoomPreset.privateChat, - creationContent: {'type': RoomCreationTypes.mSpace}, - visibility: publicGroup ? sdk.Visibility.public : null, - roomAliasName: publicGroup && controller.text.isNotEmpty - ? controller.text.trim().toLowerCase().replaceAll(' ', '_') - : null, - name: controller.text.isNotEmpty ? controller.text : null, - ), - ); - if (roomID.error == null) { - VRouter.of(context).toSegments(['rooms', roomID.result!, 'details']); - } - } - - @override - Widget build(BuildContext context) => NewSpaceView(this); -} diff --git a/lib/pages/new_space/new_space_view.dart b/lib/pages/new_space/new_space_view.dart deleted file mode 100644 index 7bbbd1a1f1..0000000000 --- a/lib/pages/new_space/new_space_view.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'new_space.dart'; - -class NewSpaceView extends StatelessWidget { - final NewSpaceController controller; - - const NewSpaceView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.createNewSpace), - ), - body: MaxWidthBody( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: TextField( - controller: controller.controller, - autofocus: true, - autocorrect: false, - textInputAction: TextInputAction.go, - onSubmitted: controller.submitAction, - decoration: InputDecoration( - labelText: L10n.of(context)!.spaceName, - prefixIcon: const Icon(Icons.people_outlined), - hintText: L10n.of(context)!.enterASpacepName), - ), - ), - SwitchListTile.adaptive( - title: Text(L10n.of(context)!.spaceIsPublic), - value: controller.publicGroup, - onChanged: controller.setPublicGroup, - ), - Expanded( - child: Image.asset('assets/private_chat_wallpaper.png'), - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: controller.submitAction, - child: const Icon(Icons.arrow_forward_outlined), - ), - ); - } -} diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 098756d4a3..6e822f4b7c 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -2,65 +2,109 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; +import 'package:collection/collection.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:image_picker/image_picker.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../../widgets/matrix.dart'; +import '../bootstrap/bootstrap_dialog.dart'; import 'settings_view.dart'; class Settings extends StatefulWidget { - const Settings({Key? key}) : super(key: key); + const Settings({super.key}); @override SettingsController createState() => SettingsController(); } class SettingsController extends State { - Future? crossSigningCachedFuture; - bool? crossSigningCached; - Future? megolmBackupCachedFuture; - bool? megolmBackupCached; - Future? profileFuture; - Profile? profile; + Future? profileFuture; bool profileUpdated = false; void updateProfile() => setState(() { profileUpdated = true; - profile = profileFuture = null; + profileFuture = null; }); + void setDisplaynameAction() async { + final profile = await profileFuture; + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).editDisplayname, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + initialText: + profile?.displayName ?? Matrix.of(context).client.userID!.localpart, + ); + if (input == null) return; + final matrix = Matrix.of(context); + final success = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.setDisplayName(matrix.client.userID!, input), + ); + if (success.error == null) { + updateProfile(); + } + } + + void logoutAction() async { + final noBackup = showChatBackupBanner == true; + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSureYouWantToLogout, + message: L10n.of(context).noBackupWarning, + isDestructive: noBackup, + okLabel: L10n.of(context).logout, + cancelLabel: L10n.of(context).cancel, + ) == + OkCancelResult.cancel) { + return; + } + final matrix = Matrix.of(context); + await showFutureLoadingDialog( + context: context, + future: () => matrix.client.logout(), + ); + } + void setAvatarAction() async { + final profile = await profileFuture; final actions = [ if (PlatformInfos.isMobile) - SheetAction( - key: AvatarAction.camera, - label: L10n.of(context)!.openCamera, + AdaptiveModalAction( + value: AvatarAction.camera, + label: L10n.of(context).openCamera, isDefaultAction: true, - icon: Icons.camera_alt_outlined, + icon: const Icon(Icons.camera_alt_outlined), ), - SheetAction( - key: AvatarAction.file, - label: L10n.of(context)!.openGallery, - icon: Icons.photo_outlined, + AdaptiveModalAction( + value: AvatarAction.file, + label: L10n.of(context).openGallery, + icon: const Icon(Icons.photo_outlined), ), if (profile?.avatarUrl != null) - SheetAction( - key: AvatarAction.remove, - label: L10n.of(context)!.removeYourAvatar, - isDestructiveAction: true, - icon: Icons.delete_outlined, + AdaptiveModalAction( + value: AvatarAction.remove, + label: L10n.of(context).removeYourAvatar, + isDestructive: true, + icon: const Icon(Icons.delete_outlined), ), ]; final action = actions.length == 1 - ? actions.single.key - : await showModalActionSheet( + ? actions.single.value + : await showModalActionPopup( context: context, - title: L10n.of(context)!.changeYourAvatar, + title: L10n.of(context).changeYourAvatar, + cancelLabel: L10n.of(context).cancel, actions: actions, ); if (action == null) return; @@ -89,12 +133,15 @@ class SettingsController extends State { name: result.path, ); } else { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; + final result = await selectFiles( + context, + type: FileSelectorType.images, + ); + final pickedFile = result.firstOrNull; + if (pickedFile == null) return; file = MatrixFile( - bytes: result.toUint8List(), - name: result.fileName!, + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, ); } final success = await showFutureLoadingDialog( @@ -107,30 +154,65 @@ class SettingsController extends State { } @override - Widget build(BuildContext context) { + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap()); + + super.initState(); + } + + void checkBootstrap() async { final client = Matrix.of(context).client; - profileFuture ??= client - .getProfileFromUserId( - client.userID!, - cache: !profileUpdated, - getFromRooms: !profileUpdated, - ) - .then((p) { - if (mounted) setState(() => profile = p); - return p; + if (!client.encryptionEnabled) return; + await client.accountDataLoading; + await client.userDeviceKeysLoading; + if (client.prevBatch == null) { + await client.onSync.stream.first; + } + final crossSigning = + await client.encryption?.crossSigning.isCached() ?? false; + final needsBootstrap = + await client.encryption?.keyManager.isCached() == false || + client.encryption?.crossSigning.enabled == false || + crossSigning == false; + final isUnknownSession = client.isUnknownSession; + setState(() { + showChatBackupBanner = needsBootstrap || isUnknownSession; }); - if (client.encryption != null) { - crossSigningCachedFuture ??= - client.encryption?.crossSigning.isCached().then((c) { - if (mounted) setState(() => crossSigningCached = c); - return c; - }); - megolmBackupCachedFuture ??= - client.encryption?.keyManager.isCached().then((c) { - if (mounted) setState(() => megolmBackupCached = c); - return c; - }); + } + + bool? crossSigningCached; + bool? showChatBackupBanner; + + void firstRunBootstrapAction([_]) async { + if (showChatBackupBanner != true) { + showOkAlertDialog( + context: context, + title: L10n.of(context).chatBackup, + message: L10n.of(context).onlineKeyBackupEnabled, + okLabel: L10n.of(context).close, + ); + return; } + await BootstrapDialog( + client: Matrix.of(context).client, + ).show(context); + checkBootstrap(); + } + + Future getOidcAccountManageUrl() async { + final client = Matrix.of(context).client; + final wellKnown = client.wellKnown ?? await client.getWellknown(); + return wellKnown.additionalProperties + .tryGetMap('org.matrix.msc2965.authentication') + ?.tryGet('account'); + } + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + profileFuture ??= client.getProfileFromUserId( + client.userID!, + ); return SettingsView(this); } } diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index 242c247c8a..00b8fe7c29 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -1,95 +1,208 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import '../../config/app_config.dart'; -import '../../widgets/content_banner.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; import 'settings.dart'; class SettingsView extends StatelessWidget { final SettingsController controller; - const SettingsView(this.controller, {Key? key}) : super(key: key); + const SettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final showChatBackupBanner = controller.showChatBackupBanner; return Scaffold( - body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) => - [ - SliverAppBar( - expandedHeight: 300.0, - floating: true, - pinned: true, - title: Text(L10n.of(context)!.settings), - backgroundColor: Theme.of(context).appBarTheme.backgroundColor, - flexibleSpace: FlexibleSpaceBar( - background: ContentBanner( - mxContent: controller.profile?.avatarUrl, - onEdit: controller.setAvatarAction, - defaultIcon: Icons.account_circle_outlined, - ), - ), - ), - ], - body: ListTileTheme( - iconColor: Theme.of(context).colorScheme.onBackground, - child: ListView( - children: [ - ListTile( - leading: const Icon(Icons.format_paint_outlined), - title: Text(L10n.of(context)!.changeTheme), - onTap: () => VRouter.of(context).to('/settings/style'), - ), - const Divider(thickness: 1), - ListTile( - leading: const Icon(Icons.notifications_outlined), - title: Text(L10n.of(context)!.notifications), - onTap: () => VRouter.of(context).to('/settings/notifications'), - ), - ListTile( - leading: const Icon(Icons.devices_outlined), - title: Text(L10n.of(context)!.devices), - onTap: () => VRouter.of(context).to('/settings/devices'), - ), - ListTile( - leading: const Icon(Icons.chat_bubble_outline_outlined), - title: Text(L10n.of(context)!.chat), - onTap: () => VRouter.of(context).to('/settings/chat'), - ), - ListTile( - leading: const Icon(Icons.account_circle_outlined), - title: Text(L10n.of(context)!.account), - onTap: () => VRouter.of(context).to('/settings/account'), - ), - ListTile( - leading: const Icon(Icons.shield_outlined), - title: Text(L10n.of(context)!.security), - onTap: () => VRouter.of(context).to('/settings/security'), - ), - const Divider(thickness: 1), - ListTile( - leading: const Icon(Icons.help_outline_outlined), - title: Text(L10n.of(context)!.help), - onTap: () => launch(AppConfig.supportUrl), - ), - ListTile( - leading: const Icon(Icons.shield_sharp), - title: Text(L10n.of(context)!.privacy), - onTap: () => launch(AppConfig.privacyUrl), - ), - ListTile( - leading: const Icon(Icons.info_outline_rounded), - title: Text(L10n.of(context)!.about), - onTap: () => PlatformInfos.showDialog(context), - ), - ], + appBar: AppBar( + leading: Center( + child: CloseButton( + onPressed: () => context.go('/rooms'), ), ), + title: Text(L10n.of(context).settings), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: FutureBuilder( + future: controller.getOidcAccountManageUrl(), + builder: (context, snapshot) { + final accountManageUrl = snapshot.data; + return ListView( + key: const Key('SettingsListViewContent'), + children: [ + FutureBuilder( + future: controller.profileFuture, + builder: (context, snapshot) { + final profile = snapshot.data; + final mxid = Matrix.of(context).client.userID ?? + L10n.of(context).user; + final displayname = + profile?.displayName ?? mxid.localpart ?? mxid; + return Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Avatar( + mxContent: profile?.avatarUrl, + name: displayname, + size: Avatar.defaultSize * 2.5, + ), + if (profile != null) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + elevation: 2, + onPressed: controller.setAvatarAction, + heroTag: null, + child: + const Icon(Icons.camera_alt_outlined), + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: controller.setDisplaynameAction, + icon: const Icon( + Icons.edit_outlined, + size: 16, + ), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + ), + label: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 18, + ), + ), + ), + TextButton.icon( + onPressed: () => + FluffyShare.share(mxid, context), + icon: const Icon( + Icons.copy_outlined, + size: 14, + ), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.secondary, + ), + label: Text( + mxid, + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + ), + ], + ); + }, + ), + if (accountManageUrl != null) + ListTile( + leading: const Icon(Icons.account_circle_outlined), + title: Text(L10n.of(context).manageAccount), + trailing: const Icon(Icons.open_in_new_outlined), + onTap: () => launchUrlString( + accountManageUrl, + mode: LaunchMode.inAppBrowserView, + ), + ), + Divider(color: theme.dividerColor), + if (showChatBackupBanner == null) + ListTile( + leading: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + trailing: const CircularProgressIndicator.adaptive(), + ) + else + SwitchListTile.adaptive( + controlAffinity: ListTileControlAffinity.trailing, + value: controller.showChatBackupBanner == false, + secondary: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + onChanged: controller.firstRunBootstrapAction, + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + leading: const Icon(Icons.format_paint_outlined), + title: Text(L10n.of(context).changeTheme), + onTap: () => context.go('/rooms/settings/style'), + ), + ListTile( + leading: const Icon(Icons.notifications_outlined), + title: Text(L10n.of(context).notifications), + onTap: () => context.go('/rooms/settings/notifications'), + ), + ListTile( + leading: const Icon(Icons.devices_outlined), + title: Text(L10n.of(context).devices), + onTap: () => context.go('/rooms/settings/devices'), + ), + ListTile( + leading: const Icon(Icons.forum_outlined), + title: Text(L10n.of(context).chat), + onTap: () => context.go('/rooms/settings/chat'), + ), + ListTile( + leading: const Icon(Icons.shield_outlined), + title: Text(L10n.of(context).security), + onTap: () => context.go('/rooms/settings/security'), + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.dns_outlined), + title: Text( + L10n.of(context).aboutHomeserver( + Matrix.of(context).client.userID?.domain ?? 'homeserver', + ), + ), + onTap: () => context.go('/rooms/settings/homeserver'), + ), + ListTile( + leading: const Icon(Icons.privacy_tip_outlined), + title: Text(L10n.of(context).privacy), + onTap: () => launchUrlString(AppConfig.privacyUrl), + ), + ListTile( + leading: const Icon(Icons.info_outline_rounded), + title: Text(L10n.of(context).about), + onTap: () => PlatformInfos.showDialog(context), + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.logout_outlined), + title: Text(L10n.of(context).logout), + onTap: controller.logoutAction, + ), + ], + ); + }, + ), ), ); } diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart index 56a7a8d0af..73ec227449 100644 --- a/lib/pages/settings_3pid/settings_3pid.dart +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -1,17 +1,18 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'settings_3pid_view.dart'; class Settings3Pid extends StatefulWidget { static int sendAttempt = 0; - const Settings3Pid({Key? key}) : super(key: key); + const Settings3Pid({super.key}); @override Settings3PidController createState() => Settings3PidController(); @@ -22,15 +23,11 @@ class Settings3PidController extends State { final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.enterAnEmailAddress, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.enterAnEmailAddress, - keyboardType: TextInputType.emailAddress, - ), - ], + title: L10n.of(context).enterAnEmailAddress, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).enterAnEmailAddress, + keyboardType: TextInputType.emailAddress, ); if (input == null) return; final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); @@ -38,7 +35,7 @@ class Settings3PidController extends State { context: context, future: () => Matrix.of(context).client.requestTokenToRegisterEmail( clientSecret, - input.single, + input, Settings3Pid.sendAttempt++, ), ); @@ -46,13 +43,14 @@ class Settings3PidController extends State { final ok = await showOkAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.weSentYouAnEmail, - message: L10n.of(context)!.pleaseClickOnLink, - okLabel: L10n.of(context)!.iHaveClickedOnLink, + title: L10n.of(context).weSentYouAnEmail, + message: L10n.of(context).pleaseClickOnLink, + okLabel: L10n.of(context).iHaveClickedOnLink, ); if (ok != OkCancelResult.ok) return; final success = await showFutureLoadingDialog( context: context, + delay: false, future: () => Matrix.of(context).client.uiaRequestBackground( (auth) => Matrix.of(context).client.add3PID( clientSecret, @@ -71,19 +69,20 @@ class Settings3PidController extends State { if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, ) != OkCancelResult.ok) { return; } final success = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.delete3pidFromAccount( - identifier.address, - identifier.medium, - )); + context: context, + future: () => Matrix.of(context).client.delete3pidFromAccount( + identifier.address, + identifier.medium, + ), + ); if (success.error != null) return; setState(() => request = null); } diff --git a/lib/pages/settings_3pid/settings_3pid_view.dart b/lib/pages/settings_3pid/settings_3pid_view.dart index 07ed7a4c6e..86b67a1b3a 100644 --- a/lib/pages/settings_3pid/settings_3pid_view.dart +++ b/lib/pages/settings_3pid/settings_3pid_view.dart @@ -10,28 +10,33 @@ import 'package:fluffychat/widgets/matrix.dart'; class Settings3PidView extends StatelessWidget { final Settings3PidController controller; - const Settings3PidView(this.controller, {Key? key}) : super(key: key); + const Settings3PidView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + controller.request ??= Matrix.of(context).client.getAccount3PIDs(); return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.passwordRecovery), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).passwordRecovery), actions: [ IconButton( icon: const Icon(Icons.add_outlined), onPressed: controller.add3PidAction, - tooltip: L10n.of(context)!.addEmail, - ) + tooltip: L10n.of(context).addEmail, + ), ], ), body: MaxWidthBody( + withScrolling: false, child: FutureBuilder?>( future: controller.request, - builder: (BuildContext context, - AsyncSnapshot?> snapshot) { + builder: ( + BuildContext context, + AsyncSnapshot?> snapshot, + ) { if (snapshot.hasError) { return Center( child: Text( @@ -42,14 +47,15 @@ class Settings3PidView extends StatelessWidget { } if (!snapshot.hasData) { return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2)); + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); } final identifier = snapshot.data!; return Column( children: [ ListTile( leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + backgroundColor: theme.scaffoldBackgroundColor, foregroundColor: identifier.isEmpty ? Colors.orange : Colors.grey, child: Icon( @@ -60,24 +66,24 @@ class Settings3PidView extends StatelessWidget { ), title: Text( identifier.isEmpty - ? L10n.of(context)!.noPasswordRecoveryDescription - : L10n.of(context)! + ? L10n.of(context).noPasswordRecoveryDescription + : L10n.of(context) .withTheseAddressesRecoveryDescription, ), ), - const Divider(height: 1), + const Divider(), Expanded( child: ListView.builder( itemCount: identifier.length, itemBuilder: (BuildContext context, int i) => ListTile( leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: Icon(identifier[i].iconData)), + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: Icon(identifier[i].iconData), + ), title: Text(identifier[i].address), trailing: IconButton( - tooltip: L10n.of(context)!.delete, + tooltip: L10n.of(context).delete, icon: const Icon(Icons.delete_forever_outlined), color: Colors.red, onPressed: () => controller.delete3Pid(identifier[i]), diff --git a/lib/pages/settings_account/settings_account.dart b/lib/pages/settings_account/settings_account.dart deleted file mode 100644 index 3bf2fa5d91..0000000000 --- a/lib/pages/settings_account/settings_account.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/settings_account/settings_account_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class SettingsAccount extends StatefulWidget { - const SettingsAccount({Key? key}) : super(key: key); - - @override - SettingsAccountController createState() => SettingsAccountController(); -} - -class SettingsAccountController extends State { - Future? profileFuture; - Profile? profile; - bool profileUpdated = false; - - void updateProfile() => setState(() { - profileUpdated = true; - profile = profileFuture = null; - }); - - void setDisplaynameAction() async { - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.editDisplayname, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - initialText: profile?.displayName ?? - Matrix.of(context).client.userID!.localpart, - ) - ], - ); - if (input == null) return; - final matrix = Matrix.of(context); - final success = await showFutureLoadingDialog( - context: context, - future: () => - matrix.client.setDisplayName(matrix.client.userID!, input.single), - ); - if (success.error == null) { - updateProfile(); - } - } - - void logoutAction() async { - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSureYouWantToLogout, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.cancel) { - return; - } - final matrix = Matrix.of(context); - await showFutureLoadingDialog( - context: context, - future: () => matrix.client.logout(), - ); - } - - void deleteAccountAction() async { - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.warning, - message: L10n.of(context)!.deactivateAccountWarning, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.cancel) { - return; - } - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.cancel) { - return; - } - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.pleaseEnterYourPassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - const DialogTextField( - obscureText: true, - hintText: '******', - minLines: 1, - maxLines: 1, - ) - ], - ); - if (input == null) return; - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.deactivateAccount( - auth: AuthenticationPassword( - password: input.single, - identifier: AuthenticationUserIdentifier( - user: Matrix.of(context).client.userID!), - ), - ), - ); - } - - void addAccountAction() => VRouter.of(context).to('add'); - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - profileFuture ??= client - .getProfileFromUserId( - client.userID!, - cache: !profileUpdated, - getFromRooms: !profileUpdated, - ) - .then((p) { - if (mounted) setState(() => profile = p); - return p; - }); - return SettingsAccountView(this); - } -} diff --git a/lib/pages/settings_account/settings_account_view.dart b/lib/pages/settings_account/settings_account_view.dart deleted file mode 100644 index 267bc07cfd..0000000000 --- a/lib/pages/settings_account/settings_account_view.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'settings_account.dart'; - -class SettingsAccountView extends StatelessWidget { - final SettingsAccountController controller; - const SettingsAccountView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text(L10n.of(context)!.account)), - body: ListTileTheme( - iconColor: Theme.of(context).textTheme.bodyText1!.color, - child: MaxWidthBody( - withScrolling: true, - child: Column( - children: [ - ListTile( - title: Text(L10n.of(context)!.yourUserId), - subtitle: Text(Matrix.of(context).client.userID!), - trailing: const Icon(Icons.copy_outlined), - onTap: () => FluffyShare.share( - Matrix.of(context).client.userID!, - context, - ), - ), - ListTile( - trailing: const Icon(Icons.edit_outlined), - title: Text(L10n.of(context)!.editDisplayname), - subtitle: Text(controller.profile?.displayName ?? - Matrix.of(context).client.userID!.localpart!), - onTap: controller.setDisplaynameAction, - ), - const Divider(height: 1), - ListTile( - trailing: const Icon(Icons.person_add_outlined), - title: Text(L10n.of(context)!.addAccount), - subtitle: Text(L10n.of(context)!.enableMultiAccounts), - onTap: controller.addAccountAction, - ), - ListTile( - trailing: const Icon(Icons.exit_to_app_outlined), - title: Text(L10n.of(context)!.logout), - onTap: controller.logoutAction, - ), - const Divider(height: 1), - ListTile( - trailing: const Icon(Icons.delete_outlined), - title: Text( - L10n.of(context)!.deleteAccount, - style: const TextStyle(color: Colors.red), - ), - onTap: controller.deleteAccountAction, - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/pages/settings_chat/settings_chat.dart b/lib/pages/settings_chat/settings_chat.dart index b25941669b..1c10355597 100644 --- a/lib/pages/settings_chat/settings_chat.dart +++ b/lib/pages/settings_chat/settings_chat.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'settings_chat_view.dart'; class SettingsChat extends StatefulWidget { - const SettingsChat({Key? key}) : super(key: key); + const SettingsChat({super.key}); @override SettingsChatController createState() => SettingsChatController(); diff --git a/lib/pages/settings_chat/settings_chat_view.dart b/lib/pages/settings_chat/settings_chat_view.dart index ed6ea93d7b..7efa65a1e6 100644 --- a/lib/pages/settings_chat/settings_chat_view.dart +++ b/lib/pages/settings_chat/settings_chat_view.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/voip/callkeep_manager.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; @@ -13,82 +14,114 @@ import 'settings_chat.dart'; class SettingsChatView extends StatelessWidget { final SettingsChatController controller; - const SettingsChatView(this.controller, {Key? key}) : super(key: key); + const SettingsChatView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( - appBar: AppBar(title: Text(L10n.of(context)!.chat)), + appBar: AppBar(title: Text(L10n.of(context).chat)), body: ListTileTheme( - iconColor: Theme.of(context).textTheme.bodyText1!.color, + iconColor: theme.textTheme.bodyLarge!.color, child: MaxWidthBody( - withScrolling: true, child: Column( children: [ SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.renderRichContent, + title: L10n.of(context).formattedMessages, + subtitle: L10n.of(context).formattedMessagesDescription, onChanged: (b) => AppConfig.renderHtml = b, storeKey: SettingKeys.renderHtml, defaultValue: AppConfig.renderHtml, ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.hideRedactedEvents, + title: L10n.of(context).hideMemberChangesInPublicChats, + subtitle: L10n.of(context).hideMemberChangesInPublicChatsBody, + onChanged: (b) => AppConfig.hideUnimportantStateEvents = b, + storeKey: SettingKeys.hideUnimportantStateEvents, + defaultValue: AppConfig.hideUnimportantStateEvents, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).hideRedactedMessages, + subtitle: L10n.of(context).hideRedactedMessagesBody, onChanged: (b) => AppConfig.hideRedactedEvents = b, storeKey: SettingKeys.hideRedactedEvents, defaultValue: AppConfig.hideRedactedEvents, ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.hideUnknownEvents, + title: L10n.of(context).hideInvalidOrUnknownMessageFormats, onChanged: (b) => AppConfig.hideUnknownEvents = b, storeKey: SettingKeys.hideUnknownEvents, defaultValue: AppConfig.hideUnknownEvents, ), if (PlatformInfos.isMobile) SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.autoplayImages, + title: L10n.of(context).autoplayImages, onChanged: (b) => AppConfig.autoplayImages = b, storeKey: SettingKeys.autoplayImages, defaultValue: AppConfig.autoplayImages, ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.sendOnEnter, + title: L10n.of(context).sendOnEnter, onChanged: (b) => AppConfig.sendOnEnter = b, storeKey: SettingKeys.sendOnEnter, - defaultValue: AppConfig.sendOnEnter, + defaultValue: AppConfig.sendOnEnter ?? !PlatformInfos.isMobile, ), - if (Matrix.of(context).webrtcIsSupported) - SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.experimentalVideoCalls, - onChanged: (b) { - AppConfig.experimentalVoip = b; - Matrix.of(context).createVoipPlugin(); - return; - }, - storeKey: SettingKeys.experimentalVoip, - defaultValue: AppConfig.experimentalVoip, + SettingsSwitchListTile.adaptive( + title: L10n.of(context).swipeRightToLeftToReply, + onChanged: (b) => AppConfig.swipeRightToLeftToReply = b, + storeKey: SettingKeys.swipeRightToLeftToReply, + defaultValue: AppConfig.swipeRightToLeftToReply, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).customEmojisAndStickers, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), ), - const Divider(height: 1), + ), ListTile( - title: Text(L10n.of(context)!.emoteSettings), - onTap: () => VRouter.of(context).to('emotes'), + title: Text(L10n.of(context).customEmojisAndStickers), + subtitle: Text(L10n.of(context).customEmojisAndStickersBody), + onTap: () => context.go('/rooms/settings/chat/emotes'), trailing: const Padding( padding: EdgeInsets.all(16.0), - child: Icon(Icons.insert_emoticon_outlined), + child: Icon(Icons.chevron_right_outlined), ), ), - const Divider(height: 1), - SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.showDirectChatsInSpaces, - onChanged: (b) => AppConfig.showDirectChatsInSpaces = b, - storeKey: SettingKeys.showDirectChatsInSpaces, - defaultValue: AppConfig.showDirectChatsInSpaces, + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).calls, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.separateChatTypes, - onChanged: (b) => AppConfig.separateChatTypes = b, - storeKey: SettingKeys.separateChatTypes, - defaultValue: AppConfig.separateChatTypes, + title: L10n.of(context).experimentalVideoCalls, + onChanged: (b) { + AppConfig.experimentalVoip = b; + Matrix.of(context).createVoipPlugin(); + return; + }, + storeKey: SettingKeys.experimentalVoip, + defaultValue: AppConfig.experimentalVoip, ), + if (PlatformInfos.isMobile) + ListTile( + title: Text(L10n.of(context).callingPermissions), + onTap: () => + CallKeepManager().checkoutPhoneAccountSetting(context), + trailing: const Padding( + padding: EdgeInsets.all(16.0), + child: Icon(Icons.call), + ), + ), ], ), ), diff --git a/lib/pages/settings_emotes/import_archive_dialog.dart b/lib/pages/settings_emotes/import_archive_dialog.dart new file mode 100644 index 0000000000..b2b5885f2d --- /dev/null +++ b/lib/pages/settings_emotes/import_archive_dialog.dart @@ -0,0 +1,360 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:archive/archive.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ImportEmoteArchiveDialog extends StatefulWidget { + final EmotesSettingsController controller; + final Archive archive; + + const ImportEmoteArchiveDialog({ + super.key, + required this.controller, + required this.archive, + }); + + @override + State createState() => + _ImportEmoteArchiveDialogState(); +} + +class _ImportEmoteArchiveDialogState extends State { + Map _importMap = {}; + + bool _loading = false; + + double _progress = 0; + + @override + void initState() { + _importFileMap(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(L10n.of(context).importEmojis), + content: _loading + ? Center( + child: CircularProgressIndicator( + value: _progress, + ), + ) + : SingleChildScrollView( + child: Wrap( + alignment: WrapAlignment.spaceEvenly, + crossAxisAlignment: WrapCrossAlignment.center, + runSpacing: 8, + spacing: 8, + children: _importMap.entries + .map( + (e) => _EmojiImportPreview( + key: ValueKey(e.key.name), + entry: e, + onNameChanged: (name) => _importMap[e.key] = name, + onRemove: () => + setState(() => _importMap.remove(e.key)), + ), + ) + .toList(), + ), + ), + actions: [ + TextButton( + onPressed: _loading ? null : Navigator.of(context).pop, + child: Text(L10n.of(context).cancel), + ), + TextButton( + onPressed: _loading + ? null + : _importMap.isNotEmpty + ? _addEmotePack + : null, + child: Text(L10n.of(context).importNow), + ), + ], + ); + } + + void _importFileMap() { + _importMap = Map.fromEntries( + widget.archive.files + .where((e) => e.isFile) + .map( + (e) => MapEntry(e, e.name.emoteNameFromPath), + ) + .sorted( + (a, b) => a.value.compareTo(b.value), + ), + ); + } + + Future _addEmotePack() async { + setState(() { + _loading = true; + _progress = 0; + }); + final imports = _importMap; + final successfulUploads = {}; + + // check for duplicates first + + final skipKeys = []; + + for (final entry in imports.entries) { + final imageCode = entry.value; + + if (widget.controller.pack!.images.containsKey(imageCode)) { + final completer = Completer(); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final result = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteExists, + message: imageCode, + cancelLabel: L10n.of(context).replace, + okLabel: L10n.of(context).skip, + ); + completer.complete(result); + }); + + final result = await completer.future; + if (result == OkCancelResult.ok) { + skipKeys.add(entry.key); + } + } + } + + for (final key in skipKeys) { + imports.remove(key); + } + + for (final entry in imports.entries) { + setState(() { + _progress += 1 / imports.length; + }); + final file = entry.key; + final imageCode = entry.value; + + try { + var mxcFile = MatrixImageFile( + bytes: file.content, + name: file.name, + ); + + final thumbnail = (await mxcFile.generateThumbnail( + nativeImplementations: ClientManager.nativeImplementations, + )); + if (thumbnail == null) { + Logs().w('Unable to create thumbnail'); + } else { + mxcFile = thumbnail; + } + final uri = await Matrix.of(context).client.uploadContent( + mxcFile.bytes, + filename: mxcFile.name, + contentType: mxcFile.mimeType, + ); + + final info = { + ...mxcFile.info, + }; + + // normalize width / height to 256, required for stickers + if (info['w'] is int && info['h'] is int) { + final ratio = info['w'] / info['h']; + if (info['w'] > info['h']) { + info['w'] = 256; + info['h'] = (256.0 / ratio).round(); + } else { + info['h'] = 256; + info['w'] = (ratio * 256.0).round(); + } + } + widget.controller.pack!.images[imageCode] = + ImagePackImageContent.fromJson({ + 'url': uri.toString(), + 'info': info, + }); + successfulUploads.add(file.name); + } catch (e) { + Logs().d('Could not upload emote $imageCode'); + } + } + + await widget.controller.save(context); + _importMap.removeWhere( + (key, value) => successfulUploads.contains(key.name), + ); + + _loading = false; + _progress = 0; + + // in case we have unhandled / duplicated emotes left, don't pop + if (mounted) setState(() {}); + if (_importMap.isEmpty) { + WidgetsBinding.instance + .addPostFrameCallback((_) => Navigator.of(context).pop()); + } + } +} + +class _EmojiImportPreview extends StatefulWidget { + final MapEntry entry; + final ValueChanged onNameChanged; + final VoidCallback onRemove; + + const _EmojiImportPreview({ + super.key, + required this.entry, + required this.onNameChanged, + required this.onRemove, + }); + + @override + State<_EmojiImportPreview> createState() => _EmojiImportPreviewState(); +} + +class _EmojiImportPreviewState extends State<_EmojiImportPreview> { + final hasErrorNotifier = ValueNotifier(false); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + // TODO: support Lottie here as well ... + final controller = TextEditingController(text: widget.entry.value); + + return Stack( + alignment: Alignment.topRight, + children: [ + IconButton( + onPressed: widget.onRemove, + icon: const Icon(Icons.remove_circle), + tooltip: L10n.of(context).remove, + ), + ValueListenableBuilder( + valueListenable: hasErrorNotifier, + builder: (context, hasError, child) { + if (hasError) return _ImageFileError(name: widget.entry.key.name); + + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.memory( + widget.entry.key.content, + height: 64, + width: 64, + errorBuilder: (context, e, s) { + WidgetsBinding.instance + .addPostFrameCallback((_) => _setRenderError()); + + return _ImageFileError( + name: widget.entry.key.name, + ); + }, + ), + SizedBox( + width: 128, + child: TextField( + controller: controller, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'^[-\w]+$')), + ], + autocorrect: false, + minLines: 1, + maxLines: 1, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + border: const OutlineInputBorder(), + prefixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + suffixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + onChanged: widget.onNameChanged, + onSubmitted: widget.onNameChanged, + ), + ), + ], + ); + }, + ), + ], + ); + } + + _setRenderError() { + hasErrorNotifier.value = true; + widget.onRemove.call(); + } +} + +class _ImageFileError extends StatelessWidget { + final String name; + + const _ImageFileError({required this.name}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return SizedBox.square( + dimension: 64, + child: Tooltip( + message: name, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon(Icons.error), + Text( + L10n.of(context).notAnImage, + textAlign: TextAlign.center, + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ); + } +} + +extension on String { + /// normalizes a file path into its name only replacing any special character + /// [^-\w] with an underscore and removing the extension + /// + /// Used to compute emote name proposal based on file name + String get emoteNameFromPath { + // ... removing leading path + return split(RegExp(r'[/\\]')) + .last + // ... removing file extension + .split('.') + .first + // ... lowering + .toLowerCase() + // ... replacing unexpected characters + .replaceAll(RegExp(r'[^-\w]'), '_'); + } +} diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 708edfa7e9..3c5b82b04a 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -1,27 +1,40 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; +import 'package:collection/collection.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; +import 'package:http/http.dart' hide Client; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../../widgets/matrix.dart'; +import 'import_archive_dialog.dart'; import 'settings_emotes_view.dart'; +import 'package:archive/archive.dart' + if (dart.library.io) 'package:archive/archive_io.dart'; + class EmotesSettings extends StatefulWidget { - const EmotesSettings({Key? key}) : super(key: key); + const EmotesSettings({super.key}); @override EmotesSettingsController createState() => EmotesSettingsController(); } class EmotesSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + Room? get room => roomId != null ? Matrix.of(context).client.getRoomById(roomId!) : null; - String? get stateKey => VRouter.of(context).pathParameters['state_key']; + + String? get stateKey => GoRouterState.of(context).pathParameters['state_key']; bool showSave = false; TextEditingController newImageCodeController = TextEditingController(); @@ -42,6 +55,7 @@ class EmotesSettingsController extends State { } ImagePackContent? _pack; + ImagePackContent? get pack { if (_pack != null) { return _pack; @@ -50,7 +64,7 @@ class EmotesSettingsController extends State { return _pack; } - Future _save(BuildContext context) async { + Future save(BuildContext context) async { if (readonly) { return; } @@ -59,13 +73,20 @@ class EmotesSettingsController extends State { await showFutureLoadingDialog( context: context, future: () => client.setRoomStateWithKey( - room!.id, 'im.ponies.room_emotes', stateKey ?? '', pack!.toJson()), + room!.id, + 'im.ponies.room_emotes', + stateKey ?? '', + pack!.toJson(), + ), ); } else { await showFutureLoadingDialog( context: context, future: () => client.setAccountData( - client.userID!, 'im.ponies.user_emotes', pack!.toJson()), + client.userID!, + 'im.ponies.user_emotes', + pack!.toJson(), + ), ); } } @@ -94,7 +115,10 @@ class EmotesSettingsController extends State { await showFutureLoadingDialog( context: context, future: () => client.setAccountData( - client.userID!, 'im.ponies.emote_rooms', content), + client.userID!, + 'im.ponies.emote_rooms', + content, + ), ); setState(() {}); } @@ -115,8 +139,8 @@ class EmotesSettingsController extends State { showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteExists, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteExists, + okLabel: L10n.of(context).ok, ); return; } @@ -125,8 +149,8 @@ class EmotesSettingsController extends State { showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteInvalid, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteInvalid, + okLabel: L10n.of(context).ok, ); return; } @@ -139,18 +163,17 @@ class EmotesSettingsController extends State { bool isGloballyActive(Client? client) => room != null && - client!.accountData['im.ponies.emote_rooms']?.content is Map && - client.accountData['im.ponies.emote_rooms']!.content['rooms'] is Map && - client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] - is Map && - client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] - [stateKey ?? ''] is Map; + client!.accountData['im.ponies.emote_rooms']?.content + .tryGetMap('rooms') + ?.tryGetMap(room!.id) + ?.tryGetMap(stateKey ?? '') != + null; bool get readonly => room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes')); void saveAction() async { - await _save(context); + await save(context); setState(() { showSave = false; }); @@ -162,8 +185,8 @@ class EmotesSettingsController extends State { await showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteWarnNeedToPick, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteWarnNeedToPick, + okLabel: L10n.of(context).ok, ); return; } @@ -172,8 +195,8 @@ class EmotesSettingsController extends State { await showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteExists, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteExists, + okLabel: L10n.of(context).ok, ); return; } @@ -181,13 +204,13 @@ class EmotesSettingsController extends State { await showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteInvalid, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteInvalid, + okLabel: L10n.of(context).ok, ); return; } pack!.images[imageCode] = newImageController.value!; - await _save(context); + await save(context); setState(() { newImageCodeController.text = ''; newImageController.value = null; @@ -196,20 +219,24 @@ class EmotesSettingsController extends State { } void imagePickerAction( - ValueNotifier controller) async { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; + ValueNotifier controller, + ) async { + final result = await selectFiles( + context, + type: FileSelectorType.images, + ); + final pickedFile = result.firstOrNull; + if (pickedFile == null) return; var file = MatrixImageFile( - bytes: result.toUint8List(), - name: result.fileName!, + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, ); try { file = (await file.generateThumbnail( - compute: Matrix.of(context).client.runInBackground, + nativeImplementations: ClientManager.nativeImplementations, ))!; - } catch (_) { - // do nothing + } catch (e, s) { + Logs().w('Unable to create thumbnail', e, s); } final uploadResp = await showFutureLoadingDialog( context: context, @@ -247,4 +274,77 @@ class EmotesSettingsController extends State { Widget build(BuildContext context) { return EmotesSettingsView(this); } + + Future importEmojiZip() async { + final result = await showFutureLoadingDialog( + context: context, + future: () async { + final result = await selectFiles( + context, + type: FileSelectorType.zip, + ); + + if (result.isEmpty) return null; + + final buffer = InputStream(await result.first.readAsBytes()); + + final archive = ZipDecoder().decodeBuffer(buffer); + + return archive; + }, + ); + + final archive = result.result; + if (archive == null) return; + + await showDialog( + context: context, + // breaks [Matrix.of] calls otherwise + useRootNavigator: false, + builder: (context) => ImportEmoteArchiveDialog( + controller: this, + archive: archive, + ), + ); + setState(() {}); + } + + Future exportAsZip() async { + final client = Matrix.of(context).client; + + await showFutureLoadingDialog( + context: context, + future: () async { + final pack = _getPack(); + final archive = Archive(); + for (final entry in pack.images.entries) { + final emote = entry.value; + final name = entry.key; + final url = await emote.url.getDownloadUri(client); + final response = await get( + url, + headers: {'authorization': 'Bearer ${client.accessToken}'}, + ); + + archive.addFile( + ArchiveFile( + name, + response.bodyBytes.length, + response.bodyBytes, + ), + ); + } + final fileName = + '${pack.pack.displayName ?? client.userID?.localpart ?? 'emotes'}.zip'; + final output = ZipEncoder().encode(archive); + + if (output == null) return; + + MatrixFile( + name: fileName, + bytes: Uint8List.fromList(output), + ).save(context); + }, + ); + } } diff --git a/lib/pages/settings_emotes/settings_emotes_view.dart b/lib/pages/settings_emotes/settings_emotes_view.dart index 9307faad63..1c6912196c 100644 --- a/lib/pages/settings_emotes/settings_emotes_view.dart +++ b/lib/pages/settings_emotes/settings_emotes_view.dart @@ -1,28 +1,57 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import '../../widgets/matrix.dart'; import 'settings_emotes.dart'; +enum PopupMenuEmojiActions { import, export } + class EmotesSettingsView extends StatelessWidget { final EmotesSettingsController controller; - const EmotesSettingsView(this.controller, {Key? key}) : super(key: key); + const EmotesSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final client = Matrix.of(context).client; final imageKeys = controller.pack!.images.keys.toList(); return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.emoteSettings), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).customEmojisAndStickers), + actions: [ + PopupMenuButton( + onSelected: (value) { + switch (value) { + case PopupMenuEmojiActions.export: + controller.exportAsZip(); + break; + case PopupMenuEmojiActions.import: + controller.importEmojiZip(); + break; + } + }, + enabled: !controller.readonly, + itemBuilder: (context) => [ + PopupMenuItem( + value: PopupMenuEmojiActions.import, + child: Text(L10n.of(context).importFromZipFile), + ), + PopupMenuItem( + value: PopupMenuEmojiActions.export, + child: Text(L10n.of(context).exportEmotePack), + ), + ], + ), + ], ), floatingActionButton: controller.showSave ? FloatingActionButton( @@ -32,6 +61,7 @@ class EmotesSettingsView extends StatelessWidget { : null, body: MaxWidthBody( child: Column( + mainAxisSize: MainAxisSize.min, children: [ if (!controller.readonly) Container( @@ -45,7 +75,7 @@ class EmotesSettingsView extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(10)), - color: Theme.of(context).secondaryHeaderColor, + color: theme.secondaryHeaderColor, ), child: TextField( controller: controller.newImageCodeController, @@ -53,15 +83,15 @@ class EmotesSettingsView extends StatelessWidget { minLines: 1, maxLines: 1, decoration: InputDecoration( - hintText: L10n.of(context)!.emoteShortcode, + hintText: L10n.of(context).emoteShortcode, prefixText: ': ', suffixText: ':', prefixStyle: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), suffixStyle: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), border: InputBorder.none, @@ -84,64 +114,61 @@ class EmotesSettingsView extends StatelessWidget { ), if (controller.room != null) SwitchListTile.adaptive( - title: Text(L10n.of(context)!.enableEmotesGlobally), + title: Text(L10n.of(context).enableEmotesGlobally), value: controller.isGloballyActive(client), onChanged: controller.setIsGloballyActive, ), if (!controller.readonly || controller.room != null) - Divider( - height: 2, - thickness: 2, - color: Theme.of(context).primaryColor, - ), - Expanded( - child: imageKeys.isEmpty - ? Center( - child: Padding( - padding: const EdgeInsets.all(16), - child: Text( - L10n.of(context)!.noEmotesFound, - style: const TextStyle(fontSize: 20), - ), + const Divider(), + imageKeys.isEmpty + ? Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text( + L10n.of(context).noEmotesFound, + style: const TextStyle(fontSize: 20), ), - ) - : ListView.separated( - separatorBuilder: (BuildContext context, int i) => - Container(), - itemCount: imageKeys.length + 1, - itemBuilder: (BuildContext context, int i) { - if (i >= imageKeys.length) { - return Container(height: 70); - } - final imageCode = imageKeys[i]; - final image = controller.pack!.images[imageCode]!; - final textEditingController = TextEditingController(); - textEditingController.text = imageCode; - final useShortCuts = - (PlatformInfos.isWeb || PlatformInfos.isDesktop); - return ListTile( - leading: Container( - width: 180.0, - height: 38, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - borderRadius: - const BorderRadius.all(Radius.circular(10)), - color: Theme.of(context).secondaryHeaderColor, - ), - child: Shortcuts( - shortcuts: !useShortCuts + ), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, int i) => + const SizedBox.shrink(), + itemCount: imageKeys.length + 1, + itemBuilder: (BuildContext context, int i) { + if (i >= imageKeys.length) { + return Container(height: 70); + } + final imageCode = imageKeys[i]; + final image = controller.pack!.images[imageCode]!; + final textEditingController = TextEditingController(); + textEditingController.text = imageCode; + final useShortCuts = + (PlatformInfos.isWeb || PlatformInfos.isDesktop); + return ListTile( + leading: Container( + width: 180.0, + height: 38, + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + borderRadius: + const BorderRadius.all(Radius.circular(10)), + color: theme.secondaryHeaderColor, + ), + child: Shortcuts( + shortcuts: !useShortCuts + ? {} + : { + LogicalKeySet(LogicalKeyboardKey.enter): + SubmitLineIntent(), + }, + child: Actions( + actions: !useShortCuts ? {} : { - LogicalKeySet(LogicalKeyboardKey.enter): - SubmitLineIntent(), - }, - child: Actions( - actions: !useShortCuts - ? {} - : { - SubmitLineIntent: - CallbackAction(onInvoke: (i) { + SubmitLineIntent: CallbackAction( + onInvoke: (i) { controller.submitImageAction( imageCode, textEditingController.text, @@ -149,59 +176,55 @@ class EmotesSettingsView extends StatelessWidget { textEditingController, ); return null; - }), - }, - child: TextField( - readOnly: controller.readonly, - controller: textEditingController, - autocorrect: false, - minLines: 1, - maxLines: 1, - decoration: InputDecoration( - hintText: L10n.of(context)!.emoteShortcode, - prefixText: ': ', - suffixText: ':', - prefixStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold, - ), - suffixStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold, - ), - border: InputBorder.none, + }, + ), + }, + child: TextField( + readOnly: controller.readonly, + controller: textEditingController, + autocorrect: false, + minLines: 1, + maxLines: 1, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + prefixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, ), - onSubmitted: (s) => - controller.submitImageAction( - imageCode, - s, - image, - textEditingController, + suffixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, ), + border: InputBorder.none, + ), + onSubmitted: (s) => + controller.submitImageAction( + imageCode, + s, + image, + textEditingController, ), ), ), ), - title: _EmoteImage(image.url), - trailing: controller.readonly - ? null - : InkWell( - onTap: () => - controller.removeImageAction(imageCode), - child: const Icon( - Icons.delete_outlined, - color: Colors.red, - size: 32.0, - ), + ), + title: _EmoteImage(image.url), + trailing: controller.readonly + ? null + : InkWell( + onTap: () => + controller.removeImageAction(imageCode), + child: const Icon( + Icons.delete_outlined, + color: Colors.red, + size: 32.0, ), - ); - }, - ), - ), + ), + ); + }, + ), ], ), ), @@ -211,23 +234,21 @@ class EmotesSettingsView extends StatelessWidget { class _EmoteImage extends StatelessWidget { final Uri mxc; + const _EmoteImage(this.mxc); @override Widget build(BuildContext context) { const size = 38.0; - final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; - final url = mxc.getThumbnail( - Matrix.of(context).client, - width: size * devicePixelRatio, - height: size * devicePixelRatio, - method: ThumbnailMethod.scale, - ); - return CachedNetworkImage( - imageUrl: url.toString(), - fit: BoxFit.contain, - width: size, - height: size, + return SizedBox.square( + dimension: size, + child: MxcImage( + uri: mxc, + fit: BoxFit.contain, + width: size, + height: size, + isThumbnail: false, + ), ); } } @@ -249,7 +270,7 @@ class _ImagePickerState extends State<_ImagePicker> { if (widget.controller.value == null) { return ElevatedButton( onPressed: () => widget.onPressed(widget.controller), - child: Text(L10n.of(context)!.pickImage), + child: Text(L10n.of(context).pickImage), ); } else { return _EmoteImage(widget.controller.value!.url); diff --git a/lib/pages/settings_homeserver/settings_homeserver.dart b/lib/pages/settings_homeserver/settings_homeserver.dart new file mode 100644 index 0000000000..76ca08232a --- /dev/null +++ b/lib/pages/settings_homeserver/settings_homeserver.dart @@ -0,0 +1,58 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:http/http.dart' as http; +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; +import 'settings_homeserver_view.dart'; + +class SettingsHomeserver extends StatefulWidget { + const SettingsHomeserver({super.key}); + + @override + SettingsHomeserverController createState() => SettingsHomeserverController(); +} + +class SettingsHomeserverController extends State { + Future<({String name, String version, Uri federationBaseUrl})> + fetchServerInfo() async { + final client = Matrix.of(context).client; + final domain = client.userID!.domain!; + final httpClient = client.httpClient; + var federationBaseUrl = Uri(host: domain, port: 8448, scheme: 'https'); + try { + final serverWellKnownResult = await httpClient.get( + Uri.https(domain, '/.well-known/matrix/server'), + ); + final serverWellKnown = jsonDecode(serverWellKnownResult.body); + federationBaseUrl = Uri.https(serverWellKnown['m.server']); + } catch (e, s) { + Logs().w( + 'Unable to fetch federation base uri. Use $federationBaseUrl', + e, + s, + ); + } + + final serverVersionResult = await http.get( + federationBaseUrl.resolveUri( + Uri(path: '/_matrix/federation/v1/version'), + ), + ); + final { + 'server': { + 'name': String name, + 'version': String version, + }, + } = Map>.from( + jsonDecode(serverVersionResult.body), + ); + + return (name: name, version: version, federationBaseUrl: federationBaseUrl); + } + + @override + Widget build(BuildContext context) => SettingsHomeserverView(this); +} diff --git a/lib/pages/settings_homeserver/settings_homeserver_view.dart b/lib/pages/settings_homeserver/settings_homeserver_view.dart new file mode 100644 index 0000000000..792d6093ec --- /dev/null +++ b/lib/pages/settings_homeserver/settings_homeserver_view.dart @@ -0,0 +1,295 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import '../../widgets/matrix.dart'; +import 'settings_homeserver.dart'; + +class SettingsHomeserverView extends StatelessWidget { + final SettingsHomeserverController controller; + + const SettingsHomeserverView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text( + L10n.of(context) + .aboutHomeserver(client.userID?.domain ?? 'Homeserver'), + ), + ), + body: MaxWidthBody( + withScrolling: false, + child: SelectionArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text( + L10n.of(context).serverInformation, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + FutureBuilder( + future: client.getWellknownSupport(), + builder: (context, snapshot) { + final error = snapshot.error; + final data = snapshot.data; + if (error != null) { + return ListTile( + leading: const Icon(Icons.error_outlined), + title: Text( + error.toLocalizedString( + context, + ExceptionContext.checkServerSupportInfo, + ), + style: const TextStyle(fontSize: 14), + ), + ); + } + if (data == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final supportPage = data.supportPage; + final contacts = data.contacts; + if (supportPage == null && contacts == null) { + return ListTile( + leading: const Icon(Icons.error_outlined), + title: Text( + L10n.of(context).noContactInformationProvided, + style: const TextStyle(fontSize: 14), + ), + ); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (supportPage != null) + ListTile( + title: Text(L10n.of(context).supportPage), + subtitle: Text(supportPage), + ), + if (contacts != null) + ...contacts.map( + (contact) { + return ListTile( + title: Text( + contact.role.localizedString( + L10n.of(context), + ), + ), + subtitle: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (contact.emailAddress != null) + TextButton( + onPressed: () {}, + child: Text(contact.emailAddress!), + ), + if (contact.matrixId != null) + TextButton( + onPressed: () {}, + child: Text(contact.matrixId!), + ), + ], + ), + ); + }, + ), + ], + ); + }, + ), + FutureBuilder( + future: controller.fetchServerInfo(), + builder: (context, snapshot) { + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.error_outlined, + color: theme.colorScheme.error, + ), + const SizedBox(height: 12), + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ], + ); + } + final data = snapshot.data; + if (data == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text(L10n.of(context).name), + subtitle: Text(data.name), + ), + ListTile( + title: Text(L10n.of(context).version), + subtitle: Text(data.version), + ), + ListTile( + title: const Text('Federation Base URL'), + subtitle: Linkify( + text: data.federationBaseUrl.toString(), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + ], + ); + }, + ), + Divider(color: theme.dividerColor), + FutureBuilder( + future: client.getWellknown(), + initialData: client.wellKnown, + builder: (context, snapshot) { + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.error_outlined, + color: theme.colorScheme.error, + ), + const SizedBox(height: 12), + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ], + ); + } + final wellKnown = snapshot.data; + if (wellKnown == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final identityServer = wellKnown.mIdentityServer; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text( + 'Client-Well-Known Information:', + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + ListTile( + title: const Text('Base URL'), + subtitle: Linkify( + text: wellKnown.mHomeserver.baseUrl.toString(), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + if (identityServer != null) + ListTile( + title: const Text('Identity Server:'), + subtitle: Linkify( + text: identityServer.baseUrl.toString(), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + ...wellKnown.additionalProperties.entries.map( + (entry) => ListTile( + title: Text(entry.key), + subtitle: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: Text( + const JsonEncoder.withIndent(' ') + .convert(entry.value), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + ), + ], + ); + }, + ), + ], + ), + ), + ), + ); + } +} + +extension on Role { + String localizedString(L10n l10n) { + switch (this) { + case Role.mRoleAdmin: + return l10n.contactServerAdmin; + case Role.mRoleSecurity: + return l10n.contactServerSecurity; + } + } +} diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart index cf0713aa9f..74643af505 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../../widgets/matrix.dart'; import 'settings_ignore_list_view.dart'; class SettingsIgnoreList extends StatefulWidget { final String? initialUserId; - const SettingsIgnoreList({Key? key, this.initialUserId}) : super(key: key); + const SettingsIgnoreList({super.key, this.initialUserId}); @override SettingsIgnoreListController createState() => SettingsIgnoreListController(); @@ -20,14 +22,26 @@ class SettingsIgnoreListController extends State { @override void initState() { super.initState(); - if (widget.initialUserId != null) { - controller.text = widget.initialUserId!.replaceAll('@', ''); + final initialUserId = widget.initialUserId; + if (initialUserId != null) { + controller.text = initialUserId; } } + String? errorText; + void ignoreUser(BuildContext context) { - if (controller.text.isEmpty) return; - final userId = '@${controller.text}'; + final userId = controller.text.trim(); + if (userId.isEmpty) return; + if (!userId.isValidMatrixId || userId.sigil != '@') { + setState(() { + errorText = L10n.of(context).invalidInput; + }); + return; + } + setState(() { + errorText = null; + }); showFutureLoadingDialog( context: context, diff --git a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart index 05d97f0da8..71ed6ce430 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import '../../widgets/matrix.dart'; import 'settings_ignore_list.dart'; @@ -12,18 +12,22 @@ import 'settings_ignore_list.dart'; class SettingsIgnoreListView extends StatelessWidget { final SettingsIgnoreListController controller; - const SettingsIgnoreListView(this.controller, {Key? key}) : super(key: key); + const SettingsIgnoreListView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final client = Matrix.of(context).client; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.ignoredUsers), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).blockedUsers), ), body: MaxWidthBody( + withScrolling: false, child: Column( + mainAxisSize: MainAxisSize.min, children: [ Padding( padding: const EdgeInsets.all(16.0), @@ -36,56 +40,68 @@ class SettingsIgnoreListView extends StatelessWidget { textInputAction: TextInputAction.done, onSubmitted: (_) => controller.ignoreUser(context), decoration: InputDecoration( - border: const OutlineInputBorder(), - hintText: 'bad_guy:domain.abc', - prefixText: '@', - labelText: L10n.of(context)!.ignoreUsername, + errorText: controller.errorText, + hintText: '@bad_guy:domain.abc', + floatingLabelBehavior: FloatingLabelBehavior.always, + labelText: L10n.of(context).blockUsername, suffixIcon: IconButton( - tooltip: L10n.of(context)!.ignore, - icon: const Icon(Icons.done_outlined), + tooltip: L10n.of(context).block, + icon: const Icon(Icons.add), onPressed: () => controller.ignoreUser(context), ), ), ), const SizedBox(height: 16), Text( - L10n.of(context)!.ignoreListDescription, + L10n.of(context).blockListDescription, style: const TextStyle(color: Colors.orange), ), ], ), ), - const Divider(height: 1), + Divider( + color: theme.dividerColor, + ), Expanded( child: StreamBuilder( - stream: client.onAccountData.stream - .where((a) => a.type == 'm.ignored_user_list'), - builder: (context, snapshot) { - return ListView.builder( - itemCount: client.ignoredUsers.length, - itemBuilder: (c, i) => FutureBuilder( - future: - client.getProfileFromUserId(client.ignoredUsers[i]), - builder: (c, s) => ListTile( - leading: Avatar( - mxContent: s.data?.avatarUrl ?? Uri.parse(''), - name: s.data?.displayName ?? client.ignoredUsers[i], - ), - title: Text( - s.data?.displayName ?? client.ignoredUsers[i]), - trailing: IconButton( - tooltip: L10n.of(context)!.delete, - icon: const Icon(Icons.delete_forever_outlined), - onPressed: () => showFutureLoadingDialog( - context: context, - future: () => - client.unignoreUser(client.ignoredUsers[i]), - ), + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => + accountData.type == 'm.ignored_user_list', + ) ?? + false, + ), + builder: (context, snapshot) { + return ListView.builder( + itemCount: client.ignoredUsers.length, + itemBuilder: (c, i) => FutureBuilder( + future: + client.getProfileFromUserId(client.ignoredUsers[i]), + builder: (c, s) => ListTile( + leading: Avatar( + mxContent: s.data?.avatarUrl ?? Uri.parse(''), + name: s.data?.displayName ?? client.ignoredUsers[i], + ), + title: Text( + s.data?.displayName ?? client.ignoredUsers[i], + ), + subtitle: + Text(s.data?.userId ?? client.ignoredUsers[i]), + trailing: IconButton( + tooltip: L10n.of(context).delete, + icon: const Icon(Icons.delete_outlined), + onPressed: () => showFutureLoadingDialog( + context: context, + future: () => + client.unignoreUser(client.ignoredUsers[i]), ), ), ), - ); - }), + ), + ); + }, + ), ), ], ), diff --git a/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart b/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart index ff15116f28..276bc08ad2 100644 --- a/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart +++ b/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; import 'settings_multiple_emotes_view.dart'; class MultipleEmotesSettings extends StatefulWidget { - const MultipleEmotesSettings({Key? key}) : super(key: key); + const MultipleEmotesSettings({super.key}); @override MultipleEmotesSettingsController createState() => @@ -13,7 +13,7 @@ class MultipleEmotesSettings extends StatefulWidget { } class MultipleEmotesSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; @override Widget build(BuildContext context) => MultipleEmotesSettingsView(this); } diff --git a/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart b/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart index 45652f4564..83b1da4367 100644 --- a/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart +++ b/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -10,49 +10,53 @@ import 'package:fluffychat/widgets/matrix.dart'; class MultipleEmotesSettingsView extends StatelessWidget { final MultipleEmotesSettingsController controller; - const MultipleEmotesSettingsView(this.controller, {Key? key}) - : super(key: key); + const MultipleEmotesSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.emotePacks), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).emotePacks), ), body: StreamBuilder( - stream: room.onUpdate.stream, + stream: room.client.onRoomState.stream + .where((update) => update.roomId == room.id), builder: (context, snapshot) { - final Map packs = - room.states['im.ponies.room_emotes'] ?? {}; + final packStateEvents = room.states['im.ponies.room_emotes']; + // we need to manually convert the map using Map.of, otherwise assigning null will throw a type error. + final packs = packStateEvents != null + ? Map.of(packStateEvents) + : {}; if (!packs.containsKey('')) { packs[''] = null; } final keys = packs.keys.toList(); keys.sort(); return ListView.separated( - separatorBuilder: (BuildContext context, int i) => Container(), - itemCount: keys.length, - itemBuilder: (BuildContext context, int i) { - final event = packs[keys[i]]; - String? packName = - keys[i].isNotEmpty ? keys[i] : 'Default Pack'; - if (event != null && event.content['pack'] is Map) { - if (event.content['pack']['displayname'] is String) { - packName = event.content['pack']['displayname']; - } else if (event.content['pack']['name'] is String) { - packName = event.content['pack']['name']; - } - } - return ListTile( - title: Text(packName!), - onTap: () async { - VRouter.of(context).toSegments( - ['rooms', room.id, 'details', 'emotes', keys[i]]); - }, - ); - }); + separatorBuilder: (BuildContext context, int i) => + const SizedBox.shrink(), + itemCount: keys.length, + itemBuilder: (BuildContext context, int i) { + final event = packs[keys[i]]; + final eventPack = + event?.content.tryGetMap('pack'); + final packName = eventPack?.tryGet('displayname') ?? + eventPack?.tryGet('name') ?? + (keys[i].isNotEmpty ? keys[i] : 'Default Pack'); + + return ListTile( + title: Text(packName), + onTap: () async { + context.go( + ['', 'rooms', room.id, 'details', 'emotes', keys[i]] + .join('/'), + ); + }, + ); + }, + ); }, ), ); diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart index 828152a3fb..772cdef5a6 100644 --- a/lib/pages/settings_notifications/settings_notifications.dart +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:collection/collection.dart' show IterableExtension; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../../widgets/matrix.dart'; import 'settings_notifications_view.dart'; @@ -14,41 +16,46 @@ class NotificationSettingsItem { final String Function(BuildContext) title; const NotificationSettingsItem(this.type, this.key, this.title); static List items = [ + NotificationSettingsItem( + PushRuleKind.underride, + '.m.rule.message', + (c) => L10n.of(c).allRooms, + ), NotificationSettingsItem( PushRuleKind.underride, '.m.rule.room_one_to_one', - (c) => L10n.of(c)!.directChats, + (c) => L10n.of(c).directChats, ), NotificationSettingsItem( PushRuleKind.override, '.m.rule.contains_display_name', - (c) => L10n.of(c)!.containsDisplayName, + (c) => L10n.of(c).containsDisplayName, ), NotificationSettingsItem( PushRuleKind.content, '.m.rule.contains_user_name', - (c) => L10n.of(c)!.containsUserName, + (c) => L10n.of(c).containsUserName, ), NotificationSettingsItem( PushRuleKind.override, '.m.rule.invite_for_me', - (c) => L10n.of(c)!.inviteForMe, + (c) => L10n.of(c).inviteForMe, ), NotificationSettingsItem( PushRuleKind.override, '.m.rule.member_event', - (c) => L10n.of(c)!.memberChanges, + (c) => L10n.of(c).memberChanges, ), NotificationSettingsItem( PushRuleKind.override, '.m.rule.suppress_notices', - (c) => L10n.of(c)!.botMessages, + (c) => L10n.of(c).botMessages, ), ]; } class SettingsNotifications extends StatefulWidget { - const SettingsNotifications({Key? key}) : super(key: key); + const SettingsNotifications({super.key}); @override SettingsNotificationsController createState() => @@ -58,42 +65,113 @@ class SettingsNotifications extends StatefulWidget { class SettingsNotificationsController extends State { bool? getNotificationSetting(NotificationSettingsItem item) { final pushRules = Matrix.of(context).client.globalPushRules; + if (pushRules == null) return null; switch (item.type) { case PushRuleKind.content: - return pushRules!.content + return pushRules.content ?.singleWhereOrNull((r) => r.ruleId == item.key) ?.enabled; case PushRuleKind.override: - return pushRules!.override + return pushRules.override ?.singleWhereOrNull((r) => r.ruleId == item.key) ?.enabled; case PushRuleKind.room: - return pushRules!.room + return pushRules.room ?.singleWhereOrNull((r) => r.ruleId == item.key) ?.enabled; case PushRuleKind.sender: - return pushRules!.sender + return pushRules.sender ?.singleWhereOrNull((r) => r.ruleId == item.key) ?.enabled; case PushRuleKind.underride: - return pushRules!.underride + return pushRules.underride ?.singleWhereOrNull((r) => r.ruleId == item.key) ?.enabled; } } - void setNotificationSetting(NotificationSettingsItem item, bool enabled) { - showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.setPushRuleEnabled( - 'global', + bool isLoading = false; + + void setNotificationSetting( + NotificationSettingsItem item, + bool enabled, + ) async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + setState(() { + isLoading = true; + }); + try { + await Matrix.of(context).client.setPushRuleEnabled( item.type, item.key, enabled, + ); + } catch (e, s) { + Logs().w('Unable to change notification settings', e, s); + scaffoldMessenger + .showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } finally { + setState(() { + isLoading = false; + }); + } + } + + void onToggleMuteAllNotifications() async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + setState(() { + isLoading = true; + }); + try { + await Matrix.of(context).client.setMuteAllPushNotifications( + !Matrix.of(context).client.allPushNotificationsMuted, + ); + } catch (e, s) { + Logs().w('Unable to change notification settings', e, s); + scaffoldMessenger + .showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } finally { + setState(() { + isLoading = false; + }); + } + } + + void onPusherTap(Pusher pusher) async { + final delete = await showModalActionPopup( + context: context, + title: pusher.deviceDisplayName, + message: '${pusher.appDisplayName} (${pusher.appId})', + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + label: L10n.of(context).delete, + isDestructive: true, + value: true, + ), + ], + ); + if (delete != true) return; + + final success = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.deletePusher( + PusherId( + appId: pusher.appId, + pushkey: pusher.pushkey, + ), ), ); + + if (success.error != null) return; + + setState(() { + pusherFuture = null; + }); } + Future?>? pusherFuture; + @override Widget build(BuildContext context) => SettingsNotificationsView(this); } diff --git a/lib/pages/settings_notifications/settings_notifications_view.dart b/lib/pages/settings_notifications/settings_notifications_view.dart index c01d822070..ed934c5399 100644 --- a/lib/pages/settings_notifications/settings_notifications_view.dart +++ b/lib/pages/settings_notifications/settings_notifications_view.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; @@ -12,101 +11,115 @@ import 'settings_notifications.dart'; class SettingsNotificationsView extends StatelessWidget { final SettingsNotificationsController controller; - const SettingsNotificationsView(this.controller, {Key? key}) - : super(key: key); + const SettingsNotificationsView(this.controller, {super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.notifications), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).notifications), ), body: MaxWidthBody( - withScrolling: true, child: StreamBuilder( - stream: Matrix.of(context) - .client - .onAccountData - .stream - .where((event) => event.type == 'm.push_rules'), - builder: (BuildContext context, _) { - return Column( - children: [ - SwitchListTile.adaptive( - value: !Matrix.of(context).client.allPushNotificationsMuted, - title: Text( - L10n.of(context)!.notificationsEnabledForThisAccount), - onChanged: (_) => showFutureLoadingDialog( - context: context, - future: () => - Matrix.of(context).client.setMuteAllPushNotifications( - !Matrix.of(context) - .client - .allPushNotificationsMuted, - ), - ), + stream: Matrix.of(context).client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ), + builder: (BuildContext context, _) { + final theme = Theme.of(context); + return Column( + children: [ + SwitchListTile.adaptive( + value: !Matrix.of(context).client.allPushNotificationsMuted, + title: Text( + L10n.of(context).notificationsEnabledForThisAccount, ), - if (!Matrix.of(context).client.allPushNotificationsMuted) ...{ - const Divider(thickness: 1), - ListTile( - title: Text( - L10n.of(context)!.pushRules, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), + onChanged: controller.isLoading + ? null + : (_) => controller.onToggleMuteAllNotifications(), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).notifyMeFor, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, ), - for (var item in NotificationSettingsItem.items) - SwitchListTile.adaptive( - value: controller.getNotificationSetting(item) ?? true, - title: Text(item.title(context)), - onChanged: (bool enabled) => - controller.setNotificationSetting(item, enabled), - ), - }, - const Divider(thickness: 1), - ListTile( - title: Text( - L10n.of(context)!.devices, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), + ), + ), + for (final item in NotificationSettingsItem.items) + SwitchListTile.adaptive( + value: Matrix.of(context).client.allPushNotificationsMuted + ? false + : controller.getNotificationSetting(item) ?? true, + title: Text(item.title(context)), + onChanged: controller.isLoading + ? null + : Matrix.of(context).client.allPushNotificationsMuted + ? null + : (bool enabled) => controller + .setNotificationSetting(item, enabled), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).devices, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, ), ), - FutureBuilder?>( - future: Matrix.of(context).client.getPushers(), - builder: (context, snapshot) { - if (snapshot.hasError) { - Center( - child: Text( - snapshot.error!.toLocalizedString(context), - ), - ); - } - if (snapshot.connectionState != ConnectionState.done) { - const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); - } - final pushers = snapshot.data ?? []; - return ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: pushers.length, - itemBuilder: (_, i) => ListTile( - title: Text( - '${pushers[i].appDisplayName} - ${pushers[i].appId}'), - subtitle: Text(pushers[i].data.url.toString()), + ), + FutureBuilder?>( + future: controller.pusherFuture ??= + Matrix.of(context).client.getPushers(), + builder: (context, snapshot) { + if (snapshot.hasError) { + Center( + child: Text( + snapshot.error!.toLocalizedString(context), ), ); - }, - ), - ], - ); - }), + } + if (snapshot.connectionState != ConnectionState.done) { + const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final pushers = snapshot.data ?? []; + if (pushers.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Text(L10n.of(context).noOtherDevicesFound), + ), + ); + } + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: pushers.length, + itemBuilder: (_, i) => ListTile( + title: Text( + '${pushers[i].appDisplayName} - ${pushers[i].appId}', + ), + subtitle: Text(pushers[i].data.url.toString()), + onTap: () => controller.onPusherTap(pushers[i]), + ), + ); + }, + ), + ], + ); + }, + ), ), ); } diff --git a/lib/pages/settings_password/settings_password.dart b/lib/pages/settings_password/settings_password.dart new file mode 100644 index 0000000000..48579d3952 --- /dev/null +++ b/lib/pages/settings_password/settings_password.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/pages/settings_password/settings_password_view.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class SettingsPassword extends StatefulWidget { + const SettingsPassword({super.key}); + + @override + SettingsPasswordController createState() => SettingsPasswordController(); +} + +class SettingsPasswordController extends State { + final TextEditingController oldPasswordController = TextEditingController(); + final TextEditingController newPassword1Controller = TextEditingController(); + final TextEditingController newPassword2Controller = TextEditingController(); + + String? oldPasswordError; + String? newPassword1Error; + String? newPassword2Error; + + bool loading = false; + + void changePassword() async { + setState(() { + oldPasswordError = newPassword1Error = newPassword2Error = null; + }); + if (oldPasswordController.text.isEmpty) { + setState(() { + oldPasswordError = L10n.of(context).pleaseEnterYourPassword; + }); + return; + } + if (newPassword1Controller.text.isEmpty || + newPassword1Controller.text.length < 6) { + setState(() { + newPassword1Error = L10n.of(context).pleaseChooseAStrongPassword; + }); + return; + } + if (newPassword1Controller.text != newPassword2Controller.text) { + setState(() { + newPassword2Error = L10n.of(context).passwordsDoNotMatch; + }); + return; + } + + setState(() { + loading = true; + }); + try { + final scaffoldMessenger = ScaffoldMessenger.of(context); + await Matrix.of(context).client.changePassword( + newPassword1Controller.text, + oldPassword: oldPasswordController.text, + ); + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text(L10n.of(context).passwordHasBeenChanged), + ), + ); + if (mounted) context.pop(); + } catch (e) { + setState(() { + newPassword2Error = e.toLocalizedString( + context, + ExceptionContext.changePassword, + ); + }); + } finally { + setState(() { + loading = false; + }); + } + } + + @override + Widget build(BuildContext context) => SettingsPasswordView(this); +} diff --git a/lib/pages/settings_password/settings_password_view.dart b/lib/pages/settings_password/settings_password_view.dart new file mode 100644 index 0000000000..0235596436 --- /dev/null +++ b/lib/pages/settings_password/settings_password_view.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/pages/settings_password/settings_password.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class SettingsPasswordView extends StatelessWidget { + final SettingsPasswordController controller; + const SettingsPasswordView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).changePassword), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: MaxWidthBody( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const SizedBox(height: 16), + TextField( + controller: controller.oldPasswordController, + obscureText: true, + autocorrect: false, + autofocus: true, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outlined), + hintText: '********', + labelText: L10n.of(context).pleaseEnterYourCurrentPassword, + errorText: controller.oldPasswordError, + ), + ), + const Divider(height: 64), + TextField( + controller: controller.newPassword1Controller, + obscureText: true, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_reset_outlined), + hintText: '********', + labelText: L10n.of(context).newPassword, + errorText: controller.newPassword1Error, + ), + ), + const SizedBox(height: 16), + TextField( + controller: controller.newPassword2Controller, + obscureText: true, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.repeat_outlined), + hintText: '********', + labelText: L10n.of(context).repeatPassword, + errorText: controller.newPassword2Error, + ), + ), + const SizedBox(height: 32), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: + controller.loading ? null : controller.changePassword, + child: controller.loading + ? const LinearProgressIndicator() + : Text(L10n.of(context).changePassword), + ), + ), + const SizedBox(height: 16), + TextButton( + child: Text(L10n.of(context).passwordRecoverySettings), + onPressed: () => context.go('/rooms/settings/security/3pid'), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index a27e42ef43..18625dc04d 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -1,96 +1,103 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:matrix/matrix.dart'; -import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../bootstrap/bootstrap_dialog.dart'; import 'settings_security_view.dart'; class SettingsSecurity extends StatefulWidget { - const SettingsSecurity({Key? key}) : super(key: key); + const SettingsSecurity({super.key}); @override SettingsSecurityController createState() => SettingsSecurityController(); } class SettingsSecurityController extends State { - void changePasswordAccountAction() async { - final input = await showTextInputDialog( + void setAppLockAction() async { + if (AppLock.of(context).isActive) { + AppLock.of(context).showLockScreen(); + } + final newLock = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.changePassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.pleaseEnterYourPassword, - obscureText: true, - minLines: 1, - maxLines: 1, - ), - DialogTextField( - hintText: L10n.of(context)!.chooseAStrongPassword, - obscureText: true, - minLines: 1, - maxLines: 1, - ), - ], - ); - if (input == null) return; - final success = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .changePassword(input.last, oldPassword: input.first), + title: L10n.of(context).pleaseChooseAPasscode, + message: L10n.of(context).pleaseEnter4Digits, + cancelLabel: L10n.of(context).cancel, + validator: (text) { + if (text.isEmpty || (text.length == 4 && int.tryParse(text)! >= 0)) { + return null; + } + return L10n.of(context).pleaseEnter4Digits; + }, + keyboardType: TextInputType.number, + obscureText: true, + maxLines: 1, + minLines: 1, + maxLength: 4, ); - if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.passwordHasBeenChanged))); + if (newLock != null) { + await AppLock.of(context).changePincode(newLock); } } - void setAppLockAction() async { - final currentLock = - await const FlutterSecureStorage().read(key: SettingKeys.appLockKey); - if (currentLock?.isNotEmpty ?? false) { - await AppLock.of(context)!.showLockScreen(); + void deleteAccountAction() async { + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).warning, + message: L10n.of(context).deactivateAccountWarning, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ) == + OkCancelResult.cancel) { + return; } - final newLock = await showTextInputDialog( + final supposedMxid = Matrix.of(context).client.userID!; + final mxids = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.pleaseChooseAPasscode, - message: L10n.of(context)!.pleaseEnter4Digits, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - validator: (text) { - if (text!.isEmpty || - (text.length == 4 && int.tryParse(text)! >= 0)) { - return null; - } - return L10n.of(context)!.pleaseEnter4Digits; - }, - keyboardType: TextInputType.number, - obscureText: true, - maxLines: 1, - minLines: 1, - ) - ], + title: L10n.of(context).confirmMatrixId, + validator: (text) => text == supposedMxid + ? null + : L10n.of(context).supposedMxid(supposedMxid), + isDestructive: true, + okLabel: L10n.of(context).delete, + cancelLabel: L10n.of(context).cancel, ); - if (newLock != null) { - await const FlutterSecureStorage() - .write(key: SettingKeys.appLockKey, value: newLock.single); - if (newLock.single.isEmpty) { - AppLock.of(context)!.disable(); - } else { - AppLock.of(context)!.enable(); - } + if (mxids == null || mxids.length != 1 || mxids != supposedMxid) { + return; } + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).pleaseEnterYourPassword, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + obscureText: true, + hintText: '******', + minLines: 1, + maxLines: 1, + ); + if (input == null) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.deactivateAccount( + auth: AuthenticationPassword( + password: input, + identifier: AuthenticationUserIdentifier( + user: Matrix.of(context).client.userID!, + ), + ), + ), + ); } void showBootstrapDialog(BuildContext context) async { @@ -99,6 +106,8 @@ class SettingsSecurityController extends State { ).show(context); } + Future dehydrateAction() => Matrix.of(context).dehydrateAction(context); + @override Widget build(BuildContext context) => SettingsSecurityView(this); } diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart index ebe9567c0d..28f8908ba4 100644 --- a/lib/pages/settings_security/settings_security_view.dart +++ b/lib/pages/settings_security/settings_security_view.dart @@ -1,112 +1,141 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:go_router/go_router.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/beautify_string_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; import 'settings_security.dart'; class SettingsSecurityView extends StatelessWidget { final SettingsSecurityController controller; - const SettingsSecurityView(this.controller, {Key? key}) : super(key: key); + const SettingsSecurityView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( - appBar: AppBar(title: Text(L10n.of(context)!.security)), + appBar: AppBar(title: Text(L10n.of(context).security)), body: ListTileTheme( - iconColor: Theme.of(context).textTheme.bodyText1!.color, + iconColor: theme.colorScheme.onSurface, child: MaxWidthBody( - withScrolling: true, - child: Column( - children: [ - ListTile( - trailing: const Icon(Icons.panorama_fish_eye), - title: Text(L10n.of(context)!.whoCanSeeMyStories), - onTap: () => VRouter.of(context).to('stories'), - ), - ListTile( - trailing: const Icon(Icons.close), - title: Text(L10n.of(context)!.ignoredUsers), - onTap: () => VRouter.of(context).to('ignorelist'), - ), - ListTile( - trailing: const Icon(Icons.vpn_key_outlined), - title: Text( - L10n.of(context)!.changePassword, - ), - onTap: controller.changePasswordAccountAction, - ), - ListTile( - trailing: const Icon(Icons.mail_outlined), - title: Text(L10n.of(context)!.passwordRecovery), - onTap: () => VRouter.of(context).to('3pid'), - ), - if (Matrix.of(context).client.encryption != null) ...{ - const Divider(thickness: 1), - if (PlatformInfos.isMobile) + child: FutureBuilder( + future: Matrix.of(context) + .client + .getCapabilities() + .timeout(const Duration(seconds: 10)), + builder: (context, snapshot) { + final capabilities = snapshot.data; + final error = snapshot.error; + if (error == null && capabilities == null) { + return const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + ); + } + return Column( + children: [ ListTile( - trailing: const Icon(Icons.lock_outlined), - title: Text(L10n.of(context)!.appLock), - onTap: controller.setAppLockAction, + title: Text( + L10n.of(context).privacy, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendTypingNotifications, + subtitle: + L10n.of(context).sendTypingNotificationsDescription, + onChanged: (b) => AppConfig.sendTypingNotifications = b, + storeKey: SettingKeys.sendTypingNotifications, + defaultValue: AppConfig.sendTypingNotifications, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendReadReceipts, + subtitle: L10n.of(context).sendReadReceiptsDescription, + onChanged: (b) => AppConfig.sendPublicReadReceipts = b, + storeKey: SettingKeys.sendPublicReadReceipts, + defaultValue: AppConfig.sendPublicReadReceipts, ), - ListTile( - title: Text(L10n.of(context)!.yourPublicKey), - onTap: () => showOkAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.yourPublicKey, - message: - Matrix.of(context).client.fingerprintKey.beautified, - okLabel: L10n.of(context)!.ok, + ListTile( + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).blockedUsers), + subtitle: Text( + L10n.of(context).thereAreCountUsersBlocked( + Matrix.of(context).client.ignoredUsers.length, + ), + ), + onTap: () => + context.go('/rooms/settings/security/ignorelist'), + ), + if (Matrix.of(context).client.encryption != null) ...{ + if (PlatformInfos.isMobile) + ListTile( + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).appLock), + subtitle: Text(L10n.of(context).appLockDescription), + onTap: controller.setAppLockAction, + ), + }, + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).account, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), ), - trailing: const Icon(Icons.vpn_key_outlined), - ), - if (!Matrix.of(context).client.encryption!.crossSigning.enabled) ListTile( - title: Text(L10n.of(context)!.crossSigningEnabled), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + title: Text(L10n.of(context).yourPublicKey), + leading: const Icon(Icons.vpn_key_outlined), + subtitle: SelectableText( + Matrix.of(context).client.fingerprintKey.beautified, + style: const TextStyle(fontFamily: 'monospace'), + ), ), - if (!Matrix.of(context).client.encryption!.keyManager.enabled) + if (capabilities?.mChangePassword?.enabled != false || + error != null) + ListTile( + leading: const Icon(Icons.password_outlined), + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).changePassword), + onTap: () => + context.go('/rooms/settings/security/password'), + ), ListTile( - title: Text(L10n.of(context)!.onlineKeyBackupEnabled), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + iconColor: Colors.orange, + leading: const Icon(Icons.delete_sweep_outlined), + title: Text( + L10n.of(context).dehydrate, + style: const TextStyle(color: Colors.orange), + ), + onTap: controller.dehydrateAction, ), - if (Matrix.of(context).client.isUnknownSession) + Divider(color: theme.dividerColor), ListTile( - title: const Text('Session verified'), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + iconColor: Colors.red, + leading: const Icon(Icons.delete_outlined), + title: Text( + L10n.of(context).deleteAccount, + style: const TextStyle(color: Colors.red), + ), + onTap: controller.deleteAccountAction, ), - FutureBuilder( - future: () async { - return (await Matrix.of(context) - .client - .encryption! - .keyManager - .isCached()) && - (await Matrix.of(context) - .client - .encryption! - .crossSigning - .isCached()); - }(), - builder: (context, snapshot) => snapshot.data == true - ? Container() - : ListTile( - title: Text(L10n.of(context)!.keysCached), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), - ), - ), - }, - ], + ], + ); + }, ), ), ), diff --git a/lib/pages/settings_stories/settings_stories.dart b/lib/pages/settings_stories/settings_stories.dart deleted file mode 100644 index b0a4818d12..0000000000 --- a/lib/pages/settings_stories/settings_stories.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pages/settings_stories/settings_stories_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; - -class SettingsStories extends StatefulWidget { - const SettingsStories({Key? key}) : super(key: key); - - @override - SettingsStoriesController createState() => SettingsStoriesController(); -} - -class SettingsStoriesController extends State { - final Map users = {}; - - Room? _storiesRoom; - - Future? loadUsers; - - bool noStoriesRoom = false; - - Future toggleUser(User user) async { - final room = _storiesRoom; - if (room == null) return; - - if (users[user] ?? false) { - // Kick user from stories room and add to block list - final blockList = room.client.storiesBlockList; - blockList.add(user.id); - await showFutureLoadingDialog( - context: context, - future: () async { - await user.kick(); - await room.client.setStoriesBlockList(blockList.toSet().toList()); - setState(() { - users[user] = false; - }); - }); - return; - } - - // Invite user to stories room and remove from block list - final blockList = room.client.storiesBlockList; - blockList.remove(user.id); - await showFutureLoadingDialog( - context: context, - future: () async { - await room.client.setStoriesBlockList(blockList); - await room.invite(user.id); - setState(() { - users[user] = true; - }); - }); - return; - } - - Future _loadUsers() async { - final room = - _storiesRoom = await Matrix.of(context).client.getStoriesRoom(context); - if (room == null) { - noStoriesRoom = true; - return; - } - final users = await room.requestParticipants(); - users.removeWhere((u) => u.id == room.client.userID); - final contacts = Matrix.of(context) - .client - .contacts - .where((contact) => !users.any((u) => u.id == contact.id)); - for (final user in contacts) { - this.users[user] = false; - } - for (final user in users) { - this.users[user] = true; - } - return; - } - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - loadUsers = _loadUsers(); - }); - }); - } - - @override - Widget build(BuildContext context) => SettingsStoriesView(this); -} diff --git a/lib/pages/settings_stories/settings_stories_view.dart b/lib/pages/settings_stories/settings_stories_view.dart deleted file mode 100644 index d502373c91..0000000000 --- a/lib/pages/settings_stories/settings_stories_view.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/pages/settings_stories/settings_stories.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; - -class SettingsStoriesView extends StatelessWidget { - final SettingsStoriesController controller; - const SettingsStoriesView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.whoCanSeeMyStories), - elevation: 0, - ), - body: Column( - children: [ - ListTile( - title: Text(L10n.of(context)!.whoCanSeeMyStoriesDesc), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), - ), - ), - const Divider(height: 1), - Expanded( - child: FutureBuilder( - future: controller.loadUsers, - builder: (context, snapshot) { - final error = snapshot.error; - if (error != null) { - return Center(child: Text(error.toLocalizedString(context))); - } - if (snapshot.connectionState != ConnectionState.done) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2, - )); - } - return ListView.builder( - itemCount: controller.users.length, - itemBuilder: (context, i) { - final user = controller.users.keys.toList()[i]; - return SwitchListTile.adaptive( - value: controller.users[user] ?? false, - onChanged: (_) => controller.toggleUser(user), - secondary: Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - ), - title: Text(user.calcDisplayname()), - ); - }, - ); - }, - ), - ), - ], - ), - ); - } -} diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index 63cabb6768..49b0b003cf 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -1,98 +1,168 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/theme_builder.dart'; import '../../widgets/matrix.dart'; import 'settings_style_view.dart'; class SettingsStyle extends StatefulWidget { - const SettingsStyle({Key? key}) : super(key: key); + const SettingsStyle({super.key}); @override SettingsStyleController createState() => SettingsStyleController(); } class SettingsStyleController extends State { - void setWallpaperAction() async { - final wallpaper = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - final path = wallpaper.path; - if (path == null) return; - Matrix.of(context).wallpaper = File(path); - await Matrix.of(context) - .store - .setItem(SettingKeys.wallpaper, wallpaper.path); - setState(() {}); + void setChatColor(Color? color) async { + AppConfig.colorSchemeSeed = color; + ThemeController.of(context).setPrimaryColor(color); } - void deleteWallpaperAction() async { - Matrix.of(context).wallpaper = null; - await Matrix.of(context).store.deleteItem(SettingKeys.wallpaper); - setState(() {}); - } + void setWallpaper() async { + final client = Matrix.of(context).client; + final picked = await selectFiles( + context, + type: FileSelectorType.images, + ); + final pickedFile = picked.firstOrNull; + if (pickedFile == null) return; - void setChatColor(Color? color) async { - await Matrix.of(context).store.setItem( - SettingKeys.chatColor, - color?.value.toString(), + await showFutureLoadingDialog( + context: context, + future: () async { + final url = await client.uploadContent( + await pickedFile.readAsBytes(), + filename: pickedFile.name, ); - AppConfig.colorSchemeSeed = color; - AdaptiveTheme.of(context).setTheme( - light: FluffyThemes.light(), - dark: FluffyThemes.dark(), + await client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperUrl: url), + ); + }, ); } - AdaptiveThemeMode? currentTheme; + double get wallpaperOpacity => + _wallpaperOpacity ?? + Matrix.of(context).client.applicationAccountConfig.wallpaperOpacity ?? + 0.5; + + double? _wallpaperOpacity; + + void saveWallpaperOpacity(double opacity) async { + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () => client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperOpacity: opacity), + ), + ); + if (result.isValue) return; + + setState(() { + _wallpaperOpacity = client.applicationAccountConfig.wallpaperOpacity; + }); + } + + void updateWallpaperOpacity(double opacity) { + setState(() { + _wallpaperOpacity = opacity; + }); + } + + double get wallpaperBlur => + _wallpaperBlur ?? + Matrix.of(context).client.applicationAccountConfig.wallpaperBlur ?? + 0.5; + double? _wallpaperBlur; + + void saveWallpaperBlur(double blur) async { + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () => client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperBlur: blur), + ), + ); + if (result.isValue) return; + + setState(() { + _wallpaperBlur = client.applicationAccountConfig.wallpaperBlur; + }); + } + + void updateWallpaperBlur(double blur) { + setState(() { + _wallpaperBlur = blur; + }); + } + + void deleteChatWallpaper() => showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.setApplicationAccountConfig( + const ApplicationAccountConfig( + wallpaperUrl: null, + wallpaperBlur: null, + ), + ), + ); + + ThemeMode get currentTheme => ThemeController.of(context).themeMode; + Color? get currentColor => ThemeController.of(context).primaryColor; static final List customColors = [ - AppConfig.primaryColor, - Colors.blue.shade800, - Colors.green.shade800, - Colors.orange.shade700, - Colors.pink.shade700, - Colors.blueGrey.shade600, null, + AppConfig.chatColor, + Colors.indigo, + Colors.blue, + Colors.blueAccent, + Colors.teal, + Colors.tealAccent, + Colors.green, + Colors.greenAccent, + Colors.yellow, + Colors.yellowAccent, + Colors.orange, + Colors.orangeAccent, + Colors.red, + Colors.redAccent, + Colors.pink, + Colors.pinkAccent, + Colors.purple, + Colors.purpleAccent, + Colors.blueGrey, + Colors.grey, + Colors.white, + Colors.black, ]; - void switchTheme(AdaptiveThemeMode? newTheme) { + void switchTheme(ThemeMode? newTheme) { if (newTheme == null) return; switch (newTheme) { - case AdaptiveThemeMode.light: - AdaptiveTheme.of(context).setLight(); + case ThemeMode.light: + ThemeController.of(context).setThemeMode(ThemeMode.light); break; - case AdaptiveThemeMode.dark: - AdaptiveTheme.of(context).setDark(); + case ThemeMode.dark: + ThemeController.of(context).setThemeMode(ThemeMode.dark); break; - case AdaptiveThemeMode.system: - AdaptiveTheme.of(context).setSystem(); + case ThemeMode.system: + ThemeController.of(context).setThemeMode(ThemeMode.system); break; } - setState(() => currentTheme = newTheme); + setState(() {}); } void changeFontSizeFactor(double d) { setState(() => AppConfig.fontSizeFactor = d); - Matrix.of(context).store.setItem( + Matrix.of(context).store.setString( SettingKeys.fontSizeFactor, AppConfig.fontSizeFactor.toString(), ); } - void changeBubbleSizeFactor(double d) { - setState(() => AppConfig.bubbleSizeFactor = d); - Matrix.of(context).store.setItem( - SettingKeys.bubbleSizeFactor, - AppConfig.bubbleSizeFactor.toString(), - ); - } - @override Widget build(BuildContext context) => SettingsStyleView(this); } diff --git a/lib/pages/settings_style/settings_style_view.dart b/lib/pages/settings_style/settings_style_view.dart index 9514d5e696..d93e492fc5 100644 --- a/lib/pages/settings_style/settings_style_view.dart +++ b/lib/pages/settings_style/settings_style_view.dart @@ -1,170 +1,335 @@ +import 'dart:ui'; + import 'package:flutter/material.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; +import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/events/state_message.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/color_value.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import '../../config/app_config.dart'; -import '../../widgets/matrix.dart'; +import '../../widgets/settings_switch_list_tile.dart'; import 'settings_style.dart'; class SettingsStyleView extends StatelessWidget { final SettingsStyleController controller; - const SettingsStyleView(this.controller, {Key? key}) : super(key: key); + const SettingsStyleView(this.controller, {super.key}); @override Widget build(BuildContext context) { - controller.currentTheme ??= AdaptiveTheme.of(context).mode; + final theme = Theme.of(context); + const colorPickerSize = 32.0; - final wallpaper = Matrix.of(context).wallpaper; + final client = Matrix.of(context).client; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.changeTheme), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).changeTheme), ), - backgroundColor: Theme.of(context).colorScheme.surface, + backgroundColor: theme.colorScheme.surface, body: MaxWidthBody( - withScrolling: true, child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - SizedBox( - height: colorPickerSize + 24, - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - children: SettingsStyleController.customColors - .map( - (color) => Padding( - padding: const EdgeInsets.all(12.0), - child: InkWell( - borderRadius: BorderRadius.circular(colorPickerSize), - onTap: () => controller.setChatColor(color), - child: color == null - ? Material( - elevation: - AppConfig.colorSchemeSeed?.value == null - ? 100 - : 0, - shadowColor: AppConfig.colorSchemeSeed, - borderRadius: - BorderRadius.circular(colorPickerSize), - child: Image.asset( - 'assets/colors.png', - width: colorPickerSize, - height: colorPickerSize, - ), - ) - : Material( - color: color, - elevation: 6, - borderRadius: - BorderRadius.circular(colorPickerSize), - child: SizedBox( - width: colorPickerSize, - height: colorPickerSize, - child: AppConfig.colorSchemeSeed?.value == - color.value - ? const Center( - child: Icon( - Icons.check, - size: 16, - color: Colors.white, - )) - : null), - ), - ), - ), - ) - .toList(), + Padding( + padding: const EdgeInsets.all(12.0), + child: SegmentedButton( + selected: {controller.currentTheme}, + onSelectionChanged: (selected) => + controller.switchTheme(selected.single), + segments: [ + ButtonSegment( + value: ThemeMode.light, + label: Text(L10n.of(context).lightTheme), + icon: const Icon(Icons.light_mode_outlined), + ), + ButtonSegment( + value: ThemeMode.dark, + label: Text(L10n.of(context).darkTheme), + icon: const Icon(Icons.dark_mode_outlined), + ), + ButtonSegment( + value: ThemeMode.system, + label: Text(L10n.of(context).systemTheme), + icon: const Icon(Icons.auto_mode_outlined), + ), + ], ), ), - const Divider(height: 1), - RadioListTile( - groupValue: controller.currentTheme, - value: AdaptiveThemeMode.system, - title: Text(L10n.of(context)!.systemTheme), - onChanged: controller.switchTheme, + Divider( + color: theme.dividerColor, ), - RadioListTile( - groupValue: controller.currentTheme, - value: AdaptiveThemeMode.light, - title: Text(L10n.of(context)!.lightTheme), - onChanged: controller.switchTheme, - ), - RadioListTile( - groupValue: controller.currentTheme, - value: AdaptiveThemeMode.dark, - title: Text(L10n.of(context)!.darkTheme), - onChanged: controller.switchTheme, - ), - const Divider(height: 1), ListTile( title: Text( - L10n.of(context)!.wallpaper, + L10n.of(context).setColorTheme, style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), ), ), - if (wallpaper != null) - ListTile( - title: Image.file( - wallpaper, - height: 38, - fit: BoxFit.cover, - ), - trailing: const Icon( - Icons.delete_outlined, - color: Colors.red, - ), - onTap: controller.deleteWallpaperAction, - ), - Builder(builder: (context) { - return ListTile( - title: Text(L10n.of(context)!.changeWallpaper), - trailing: Icon( - Icons.photo_outlined, - color: Theme.of(context).textTheme.bodyText1?.color, - ), - onTap: controller.setWallpaperAction, - ); - }), - const Divider(height: 1), + DynamicColorBuilder( + builder: (light, dark) { + final systemColor = + Theme.of(context).brightness == Brightness.light + ? light?.primary + : dark?.primary; + final colors = + List.from(SettingsStyleController.customColors); + if (systemColor == null) { + colors.remove(null); + } + return GridView.builder( + shrinkWrap: true, + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 64, + ), + itemCount: colors.length, + itemBuilder: (context, i) { + final color = colors[i]; + return Padding( + padding: const EdgeInsets.all(12.0), + child: Tooltip( + message: color == null + ? L10n.of(context).systemTheme + : '#${color.hexValue.toRadixString(16).toUpperCase()}', + child: InkWell( + borderRadius: BorderRadius.circular(colorPickerSize), + onTap: () => controller.setChatColor(color), + child: Material( + color: color ?? systemColor, + elevation: 6, + borderRadius: + BorderRadius.circular(colorPickerSize), + child: SizedBox( + width: colorPickerSize, + height: colorPickerSize, + child: controller.currentColor == color + ? Center( + child: Icon( + Icons.check, + size: 16, + color: Theme.of(context) + .colorScheme + .onPrimary, + ), + ) + : null, + ), + ), + ), + ), + ); + }, + ); + }, + ), + Divider( + color: theme.dividerColor, + ), ListTile( title: Text( - L10n.of(context)!.messages, + L10n.of(context).messagesStyle, style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), ), ), - Container( - alignment: Alignment.centerLeft, - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Material( - color: Theme.of(context).colorScheme.primary, - elevation: 6, - shadowColor: - Theme.of(context).secondaryHeaderColor.withAlpha(100), - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - child: Padding( - padding: EdgeInsets.all(16 * AppConfig.bubbleSizeFactor), - child: Text( - 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontSize: - AppConfig.messageFontSize * AppConfig.fontSizeFactor, - ), - ), - ), + StreamBuilder( + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => + accountData.type == + ApplicationAccountConfigExtension.accountDataKey, + ) ?? + false, ), + builder: (context, snapshot) { + final accountConfig = client.applicationAccountConfig; + + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: const BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.center, + children: [ + if (accountConfig.wallpaperUrl != null) + Opacity( + opacity: controller.wallpaperOpacity, + child: ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: controller.wallpaperBlur, + sigmaY: controller.wallpaperBlur, + ), + child: MxcImage( + key: ValueKey(accountConfig.wallpaperUrl), + uri: accountConfig.wallpaperUrl, + fit: BoxFit.cover, + isThumbnail: true, + width: FluffyThemes.columnWidth * 2, + height: 212, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 16), + StateMessage( + Event( + eventId: 'style_dummy', + room: + Room(id: '!style_dummy', client: client), + content: {'membership': 'join'}, + type: EventTypes.RoomMember, + senderId: client.userID!, + originServerTs: DateTime.now(), + stateKey: client.userID!, + ), + ), + Padding( + padding: EdgeInsets.only( + left: 12 + 12 + Avatar.defaultSize, + right: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: DecoratedBox( + decoration: BoxDecoration( + color: theme.brightness == Brightness.light + ? theme.colorScheme.primary + : theme.colorScheme.primaryContainer, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor', + style: TextStyle( + color: + theme.brightness == Brightness.light + ? theme.colorScheme.onPrimary + : theme.colorScheme + .onPrimaryContainer, + fontSize: AppConfig.messageFontSize * + AppConfig.fontSizeFactor, + ), + ), + ), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.only( + right: 12, + left: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: Material( + color: + theme.colorScheme.surfaceContainerHigh, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Lorem ipsum dolor sit amet', + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: AppConfig.messageFontSize * + AppConfig.fontSizeFactor, + ), + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + title: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: + theme.colorScheme.onSecondaryContainer, + ), + onPressed: controller.setWallpaper, + icon: const Icon(Icons.edit_outlined), + label: Text(L10n.of(context).setWallpaper), + ), + trailing: accountConfig.wallpaperUrl == null + ? null + : IconButton( + icon: const Icon(Icons.delete_outlined), + color: theme.colorScheme.error, + onPressed: controller.deleteChatWallpaper, + ), + ), + if (accountConfig.wallpaperUrl != null) ...[ + ListTile(title: Text(L10n.of(context).opacity)), + Slider.adaptive( + min: 0.1, + max: 1.0, + divisions: 9, + semanticFormatterCallback: (d) => d.toString(), + value: controller.wallpaperOpacity, + onChanged: controller.updateWallpaperOpacity, + onChangeEnd: controller.saveWallpaperOpacity, + ), + ListTile(title: Text(L10n.of(context).blur)), + Slider.adaptive( + min: 0.0, + max: 10.0, + divisions: 10, + semanticFormatterCallback: (d) => d.toString(), + value: controller.wallpaperBlur, + onChanged: controller.updateWallpaperBlur, + onChangeEnd: controller.saveWallpaperBlur, + ), + ], + ], + ); + }, ), ListTile( - title: Text(L10n.of(context)!.fontSize), + title: Text(L10n.of(context).fontSize), trailing: Text('× ${AppConfig.fontSizeFactor}'), ), Slider.adaptive( @@ -175,17 +340,29 @@ class SettingsStyleView extends StatelessWidget { semanticFormatterCallback: (d) => d.toString(), onChanged: controller.changeFontSizeFactor, ), + Divider( + color: theme.dividerColor, + ), ListTile( - title: Text(L10n.of(context)!.bubbleSize), - trailing: Text('× ${AppConfig.bubbleSizeFactor}'), + title: Text( + L10n.of(context).overview, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), ), - Slider.adaptive( - min: 0.5, - max: 1.5, - divisions: 4, - value: AppConfig.bubbleSizeFactor, - semanticFormatterCallback: (d) => d.toString(), - onChanged: controller.changeBubbleSizeFactor, + SettingsSwitchListTile.adaptive( + title: L10n.of(context).presencesToggle, + onChanged: (b) => AppConfig.showPresences = b, + storeKey: SettingKeys.showPresences, + defaultValue: AppConfig.showPresences, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).separateChatTypes, + onChanged: (b) => AppConfig.separateChatTypes = b, + storeKey: SettingKeys.separateChatTypes, + defaultValue: AppConfig.separateChatTypes, ), ], ), diff --git a/lib/pages/sign_up/signup.dart b/lib/pages/sign_up/signup.dart deleted file mode 100644 index e4a4d773b7..0000000000 --- a/lib/pages/sign_up/signup.dart +++ /dev/null @@ -1,129 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/sign_up/signup_view.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/localized_exception_extension.dart'; - -class SignupPage extends StatefulWidget { - const SignupPage({Key? key}) : super(key: key); - - @override - SignupPageController createState() => SignupPageController(); -} - -class SignupPageController extends State { - final TextEditingController passwordController = TextEditingController(); - final TextEditingController password2Controller = TextEditingController(); - final TextEditingController emailController = TextEditingController(); - String? error; - bool loading = false; - bool showPassword = false; - bool noEmailWarningConfirmed = false; - bool displaySecondPasswordField = false; - - static const int minPassLength = 8; - - void toggleShowPassword() => setState(() => showPassword = !showPassword); - - String? get domain => VRouter.of(context).queryParameters['domain']; - - final GlobalKey formKey = GlobalKey(); - - void onPasswordType(String text) { - if (text.length >= minPassLength && !displaySecondPasswordField) { - setState(() { - displaySecondPasswordField = true; - }); - } - } - - String? password1TextFieldValidator(String? value) { - if (value!.isEmpty) { - return L10n.of(context)!.chooseAStrongPassword; - } - if (value.length < minPassLength) { - return L10n.of(context)! - .pleaseChooseAtLeastChars(minPassLength.toString()); - } - return null; - } - - String? password2TextFieldValidator(String? value) { - if (value!.isEmpty) { - return L10n.of(context)!.repeatPassword; - } - if (value != passwordController.text) { - return L10n.of(context)!.passwordsDoNotMatch; - } - return null; - } - - String? emailTextFieldValidator(String? value) { - if (value!.isEmpty && !noEmailWarningConfirmed) { - noEmailWarningConfirmed = true; - return L10n.of(context)!.noEmailWarning; - } - if (value.isNotEmpty && !value.contains('@')) { - return L10n.of(context)!.pleaseEnterValidEmail; - } - return null; - } - - void signup([_]) async { - setState(() { - error = null; - }); - if (!formKey.currentState!.validate()) return; - - setState(() { - loading = true; - }); - - try { - final client = Matrix.of(context).getLoginClient(); - final email = emailController.text; - if (email.isNotEmpty) { - Matrix.of(context).currentClientSecret = - DateTime.now().millisecondsSinceEpoch.toString(); - Matrix.of(context).currentThreepidCreds = - await client.requestTokenToRegisterEmail( - Matrix.of(context).currentClientSecret, - email, - 0, - ); - } - - final displayname = Matrix.of(context).loginUsername!; - final localPart = displayname.toLowerCase().replaceAll(' ', '_'); - - await client.uiaRequestBackground( - (auth) => client.register( - username: localPart, - password: passwordController.text, - initialDeviceDisplayName: PlatformInfos.clientName, - auth: auth, - ), - ); - // Set displayname - if (displayname != localPart) { - await client.setDisplayName( - client.userID!, - displayname, - ); - } - } catch (e) { - error = (e).toLocalizedString(context); - } finally { - if (mounted) { - setState(() => loading = false); - } - } - } - - @override - Widget build(BuildContext context) => SignupPageView(this); -} diff --git a/lib/pages/sign_up/signup_view.dart b/lib/pages/sign_up/signup_view.dart deleted file mode 100644 index 754c235821..0000000000 --- a/lib/pages/sign_up/signup_view.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; -import 'signup.dart'; - -class SignupPageView extends StatelessWidget { - final SignupPageController controller; - const SignupPageView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return LoginScaffold( - appBar: AppBar( - automaticallyImplyLeading: !controller.loading, - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - title: Text( - L10n.of(context)!.signUp, - style: const TextStyle(color: Colors.white), - ), - ), - body: Form( - key: controller.formKey, - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - readOnly: controller.loading, - autocorrect: false, - onChanged: controller.onPasswordType, - autofillHints: - controller.loading ? null : [AutofillHints.newPassword], - controller: controller.passwordController, - obscureText: !controller.showPassword, - validator: controller.password1TextFieldValidator, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.vpn_key_outlined), - suffixIcon: IconButton( - tooltip: L10n.of(context)!.showPassword, - icon: Icon( - controller.showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined, - color: Colors.black, - ), - onPressed: controller.toggleShowPassword, - ), - errorStyle: const TextStyle(color: Colors.orange), - hintText: L10n.of(context)!.chooseAStrongPassword, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - ), - ), - if (controller.displaySecondPasswordField) - Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - readOnly: controller.loading, - autocorrect: false, - autofillHints: - controller.loading ? null : [AutofillHints.newPassword], - controller: controller.password2Controller, - obscureText: !controller.showPassword, - validator: controller.password2TextFieldValidator, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.repeat_outlined), - hintText: L10n.of(context)!.repeatPassword, - errorStyle: const TextStyle(color: Colors.orange), - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - readOnly: controller.loading, - autocorrect: false, - controller: controller.emailController, - keyboardType: TextInputType.emailAddress, - autofillHints: - controller.loading ? null : [AutofillHints.username], - validator: controller.emailTextFieldValidator, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.mail_outlined), - hintText: L10n.of(context)!.enterAnEmailAddress, - errorText: controller.error, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - errorStyle: TextStyle( - color: controller.emailController.text.isEmpty - ? Colors.orangeAccent - : Colors.orange, - ), - ), - ), - ), - Hero( - tag: 'loginButton', - child: Padding( - padding: const EdgeInsets.all(16), - child: ElevatedButton( - onPressed: controller.loading ? () {} : controller.signup, - child: controller.loading - ? const LinearProgressIndicator() - : Text(L10n.of(context)!.signUp), - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/story/story_page.dart b/lib/pages/story/story_page.dart deleted file mode 100644 index f6d200c334..0000000000 --- a/lib/pages/story/story_page.dart +++ /dev/null @@ -1,521 +0,0 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:video_player/video_player.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/story/story_view.dart'; -import 'package:fluffychat/utils/date_time_extension.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/room_status_extension.dart'; -import 'package:fluffychat/utils/story_theme_data.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class StoryPage extends StatefulWidget { - const StoryPage({Key? key}) : super(key: key); - - @override - StoryPageController createState() => StoryPageController(); -} - -class StoryPageController extends State { - int index = 0; - int max = 0; - Duration progress = Duration.zero; - Timer? _progressTimer; - bool loadingMode = false; - - final TextEditingController replyController = TextEditingController(); - final FocusNode replyFocus = FocusNode(); - - final List events = []; - - Timeline? timeline; - - Event? get currentEvent => index < events.length ? events[index] : null; - StoryThemeData get storyThemeData => - StoryThemeData.fromJson(currentEvent?.content - .tryGetMap(StoryThemeData.contentKey) ?? - {}); - - bool replyLoading = false; - bool _modalOpened = false; - - VideoPlayerController? _videoPlayerController; - - void replyEmojiAction() async { - if (replyLoading) return; - _modalOpened = true; - await showModalBottomSheet( - context: context, - builder: (context) => EmojiPicker( - onEmojiSelected: (c, e) { - Navigator.of(context).pop(); - replyAction(e.emoji); - }, - ), - ); - _modalOpened = false; - } - - void replyAction([String? message]) async { - message ??= replyController.text; - if (message.isEmpty) return; - final currentEvent = this.currentEvent; - if (currentEvent == null) return; - setState(() { - replyLoading = true; - }); - try { - final client = Matrix.of(context).client; - final roomId = await client.startDirectChat(currentEvent.senderId); - var replyText = L10n.of(context)!.storyFrom( - currentEvent.originServerTs.localizedTime(context), - currentEvent.content.tryGet('body') ?? ''); - replyText = replyText.split('\n').map((line) => '> $line').join('\n'); - message = '$replyText\n\n$message'; - await client.getRoomById(roomId)!.sendTextEvent(message); - replyController.clear(); - replyFocus.unfocus(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.replyHasBeenSent)), - ); - } catch (e, s) { - Logs().w('Unable to reply to story', e, s); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(e.toLocalizedString(context))), - ); - } finally { - setState(() { - replyLoading = false; - }); - } - } - - List get currentSeenByUsers { - final timeline = this.timeline; - final currentEvent = this.currentEvent; - if (timeline == null || currentEvent == null) return []; - return Matrix.of(context).client.getRoomById(roomId)?.getSeenByUsers( - timeline, - events, - {}, - eventId: currentEvent.eventId, - ) ?? - []; - } - - void share() async { - Matrix.of(context).shareContent = currentEvent?.content; - hold(); - VRouter.of(context).to('share'); - } - - void displaySeenByUsers() async { - _modalOpened = true; - await showModalBottomSheet( - context: context, - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(seenByUsersTitle), - ), - body: ListView.builder( - itemCount: currentSeenByUsers.length, - itemBuilder: (context, i) => ListTile( - leading: Avatar( - mxContent: currentSeenByUsers[i].avatarUrl, - name: currentSeenByUsers[i].calcDisplayname(), - ), - title: Text(currentSeenByUsers[i].calcDisplayname()), - ), - ), - ), - ); - _modalOpened = false; - } - - String get seenByUsersTitle { - final seenByUsers = currentSeenByUsers; - if (seenByUsers.isEmpty) return ''; - if (seenByUsers.length == 1) { - return L10n.of(context)!.seenByUser(seenByUsers.single.calcDisplayname()); - } - if (seenByUsers.length == 2) { - return L10n.of(context)!.seenByUserAndUser( - seenByUsers.first.calcDisplayname(), - seenByUsers.last.calcDisplayname(), - ); - } - return L10n.of(context)!.seenByUserAndCountOthers( - seenByUsers.first.calcDisplayname(), - seenByUsers.length - 1, - ); - } - - static const Duration _step = Duration(milliseconds: 50); - static const Duration maxProgress = Duration(seconds: 5); - - void _restartTimer([bool reset = true]) { - _progressTimer?.cancel(); - if (reset) progress = Duration.zero; - _progressTimer = Timer.periodic(_step, (_) { - if (replyFocus.hasFocus || _modalOpened) return; - if (!mounted) { - _progressTimer?.cancel(); - return; - } - if (loadingMode) return; - setState(() { - final video = _videoPlayerController; - if (video == null) { - progress += _step; - } else { - progress = video.value.position; - } - }); - final max = _videoPlayerController?.value.duration ?? maxProgress; - if (progress >= max) { - skip(); - } - }); - } - - bool get isOwnStory { - final client = Matrix.of(context).client; - final room = client.getRoomById(roomId); - if (room == null) return false; - return room.ownPowerLevel >= 100; - } - - String get roomId => VRouter.of(context).pathParameters['roomid'] ?? ''; - - Future? loadVideoControllerFuture; - - Future loadVideoController(Event event) async { - try { - final matrixFile = await event.downloadAndDecryptAttachment(); - if (!mounted) return null; - final tmpDirectory = await getTemporaryDirectory(); - final fileName = - event.content.tryGet('filename') ?? 'unknown_story_video.mp4'; - final file = File(tmpDirectory.path + '/' + fileName); - await file.writeAsBytes(matrixFile.bytes); - if (!mounted) return null; - final videoPlayerController = - _videoPlayerController = VideoPlayerController.file(file); - await videoPlayerController.initialize(); - await videoPlayerController.play(); - return videoPlayerController; - } catch (e, s) { - Logs().w('Unable to load video story. Try again...', e, s); - await Future.delayed(const Duration(seconds: 3)); - return loadVideoController(event); - } - } - - void skip() { - if (index + 1 >= max) { - if (isOwnStory) { - VRouter.of(context).to('/stories/create'); - } else { - VRouter.of(context).to('/rooms'); - } - return; - } - setState(() { - _videoPlayerController?.dispose(); - _videoPlayerController = null; - loadVideoControllerFuture = null; - index++; - }); - _restartTimer(); - maybeSetReadMarker(); - } - - DateTime _holdedAt = DateTime.fromMicrosecondsSinceEpoch(0); - - bool isHold = false; - - @override - void dispose() { - _videoPlayerController?.dispose(); - super.dispose(); - } - - void hold([_]) { - _holdedAt = DateTime.now(); - if (loadingMode) return; - _progressTimer?.cancel(); - setState(() { - isHold = true; - }); - } - - void unhold([_]) { - isHold = false; - if (DateTime.now().millisecondsSinceEpoch - - _holdedAt.millisecondsSinceEpoch < - 200) { - skip(); - return; - } - _restartTimer(false); - } - - void loadingModeOn() => _setLoadingMode(true); - void loadingModeOff() => _setLoadingMode(false); - - final Map> _fileCache = {}; - - void _delete() async { - final event = currentEvent; - if (event == null) return; - _modalOpened = true; - if (await showOkCancelAlertDialog( - context: context, - title: L10n.of(context)!.deleteMessage, - message: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) != - OkCancelResult.ok) { - return; - } - await showFutureLoadingDialog( - context: context, - future: event.redactEvent, - ); - setState(() { - events.remove(event); - _modalOpened = false; - }); - } - - void _report() async { - _modalOpened = true; - final event = currentEvent; - if (event == null) return; - final score = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.reportMessage, - message: L10n.of(context)!.howOffensiveIsThisContent, - cancelLabel: L10n.of(context)!.cancel, - okLabel: L10n.of(context)!.ok, - actions: [ - AlertDialogAction( - key: -100, - label: L10n.of(context)!.extremeOffensive, - ), - AlertDialogAction( - key: -50, - label: L10n.of(context)!.offensive, - ), - AlertDialogAction( - key: 0, - label: L10n.of(context)!.inoffensive, - ), - ]); - if (score == null) return; - final reason = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.whyDoYouWantToReportThis, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [DialogTextField(hintText: L10n.of(context)!.reason)]); - if (reason == null || reason.single.isEmpty) return; - final result = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.reportContent( - roomId, - event.eventId, - reason: reason.single, - score: score, - ), - ); - _modalOpened = false; - if (result.error != null) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.contentHasBeenReported)), - ); - } - - Future downloadAndDecryptAttachment( - Event event, bool getThumbnail) async { - return _fileCache[event.eventId] ??= - event.downloadAndDecryptAttachment(getThumbnail: getThumbnail); - } - - void _setLoadingMode(bool mode) => loadingMode != mode - ? WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - loadingMode = mode; - }); - }) - : null; - - Uri? get avatar => Matrix.of(context) - .client - .getRoomById(roomId) - ?.getState(EventTypes.RoomCreate) - ?.senderFromMemoryOrFallback - .avatarUrl; - - String get title => - Matrix.of(context) - .client - .getRoomById(roomId) - ?.getState(EventTypes.RoomCreate) - ?.senderFromMemoryOrFallback - .calcDisplayname() ?? - 'Story not found'; - - Future? loadStory; - - Future _loadStory() async { - try { - final client = Matrix.of(context).client; - await client.roomsLoading; - await client.accountDataLoading; - final room = client.getRoomById(roomId); - if (room == null) return; - if (room.membership != Membership.join) { - final joinedFuture = room.client.onSync.stream - .where((u) => u.rooms?.join?.containsKey(room.id) ?? false) - .first; - await room.join(); - await joinedFuture; - } - final timeline = this.timeline = await room.getTimeline(); - timeline.requestKeys(); - var events = timeline.events - .where((e) => - e.type == EventTypes.Message && - !e.redacted && - e.status == EventStatus.synced) - .toList(); - - final hasOutdatedEvents = events.removeOutdatedEvents(); - - // Request history if possible - if (!hasOutdatedEvents && - timeline.events.first.type != EventTypes.RoomCreate && - events.length < 30) { - try { - await timeline - .requestHistory(historyCount: 100) - .timeout(const Duration(seconds: 5)); - events = timeline.events - .where((e) => e.type == EventTypes.Message) - .toList(); - events.removeOutdatedEvents(); - } catch (e, s) { - Logs().d('Unable to request history in stories', e, s); - } - } - - max = events.length; - if (events.isNotEmpty) { - _restartTimer(); - } - - // Preload images and videos - events - .where((event) => {MessageTypes.Image, MessageTypes.Video} - .contains(event.messageType)) - .forEach((event) => downloadAndDecryptAttachment( - event, - event.messageType == MessageTypes.Video && - PlatformInfos.isMobile)); - - // Reverse list - this.events.clear(); - this.events.addAll(events.reversed.toList()); - - // Set start position - if (this.events.isNotEmpty) { - final receiptId = room.roomAccountData['m.receipt']?.content - .tryGetMap(room.client.userID!) - ?.tryGet('event_id'); - index = this.events.indexWhere((event) => event.eventId == receiptId); - index++; - if (index >= this.events.length) index = 0; - } - maybeSetReadMarker(); - } catch (e, s) { - Logs().e('Unable to load story', e, s); - } - return; - } - - void maybeSetReadMarker() { - final currentEvent = this.currentEvent; - if (currentEvent == null) return; - final room = currentEvent.room; - room.client.updateIosBadge(); - if (index == events.length - 1) { - timeline!.setReadMarker(); - return; - } - if (!currentSeenByUsers.any((u) => u.id == u.room.client.userID)) { - timeline!.setReadMarker(currentEvent.eventId); - } - } - - void onPopupStoryAction(PopupStoryAction action) async { - switch (action) { - case PopupStoryAction.report: - _report(); - break; - case PopupStoryAction.delete: - _delete(); - break; - case PopupStoryAction.message: - final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => - currentEvent!.senderFromMemoryOrFallback.startDirectChat(), - ); - if (roomIdResult.error != null) return; - VRouter.of(context).toSegments(['rooms', roomIdResult.result!]); - break; - } - } - - @override - Widget build(BuildContext context) { - loadStory ??= _loadStory(); - return StoryView(this); - } -} - -extension on List { - bool removeOutdatedEvents() { - final outdatedIndex = indexWhere((event) => - DateTime.now().difference(event.originServerTs).inHours > - ClientStoriesExtension.lifeTimeInHours); - if (outdatedIndex != -1) { - removeRange(outdatedIndex, length); - return true; - } - return false; - } -} - -enum PopupStoryAction { - report, - delete, - message, -} diff --git a/lib/pages/story/story_view.dart b/lib/pages/story/story_view.dart deleted file mode 100644 index 38762a7296..0000000000 --- a/lib/pages/story/story_view.dart +++ /dev/null @@ -1,383 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_blurhash/flutter_blurhash.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; -import 'package:video_player/video_player.dart'; - -import 'package:fluffychat/pages/story/story_page.dart'; -import 'package:fluffychat/utils/date_time_extension.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/string_color.dart'; -import 'package:fluffychat/utils/url_launcher.dart'; -import 'package:fluffychat/widgets/avatar.dart'; - -class StoryView extends StatelessWidget { - final StoryPageController controller; - const StoryView(this.controller, {Key? key}) : super(key: key); - - static const List textShadows = [ - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - ]; - - @override - Widget build(BuildContext context) { - final currentEvent = controller.currentEvent; - return Scaffold( - backgroundColor: Colors.blueGrey.shade900, - appBar: AppBar( - titleSpacing: 0, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context).pop, - ), - title: ListTile( - contentPadding: EdgeInsets.zero, - title: Text( - controller.title, - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(0, 0), - blurRadius: 5, - ), - ], - ), - ), - subtitle: currentEvent != null - ? Text( - currentEvent.originServerTs.localizedTime(context), - style: const TextStyle( - color: Colors.white70, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(0, 0), - blurRadius: 5, - ), - ], - ), - ) - : null, - leading: Hero( - tag: 'stories_${controller.roomId}', - child: Avatar( - mxContent: controller.avatar, - name: controller.title, - ), - ), - ), - actions: currentEvent == null - ? null - : [ - if (!controller.isOwnStory) - IconButton( - icon: Icon(Icons.adaptive.share_outlined), - onPressed: controller.share, - ), - PopupMenuButton( - onSelected: controller.onPopupStoryAction, - itemBuilder: (context) => [ - if (controller.currentEvent?.canRedact ?? false) - PopupMenuItem( - value: PopupStoryAction.delete, - child: Text(L10n.of(context)!.delete), - ), - PopupMenuItem( - value: PopupStoryAction.report, - child: Text(L10n.of(context)!.reportMessage), - ), - if (!controller.isOwnStory) - PopupMenuItem( - value: PopupStoryAction.message, - child: Text(L10n.of(context)!.sendAMessage), - ), - ], - ), - ], - systemOverlayStyle: SystemUiOverlayStyle.light, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - backgroundColor: Colors.transparent, - ), - extendBodyBehindAppBar: true, - body: FutureBuilder( - future: controller.loadStory, - builder: (context, snapshot) { - final error = snapshot.error; - if (error != null) { - return Center(child: Text(error.toLocalizedString(context))); - } - final events = controller.events; - if (snapshot.connectionState != ConnectionState.done) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2, - )); - } - if (events.isEmpty) { - return Center( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Avatar( - mxContent: controller.avatar, - name: controller.title, - size: 128, - fontSize: 64, - ), - const SizedBox(height: 32), - Text( - L10n.of(context)!.thisUserHasNotPostedAnythingYet, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 20, - color: Colors.white, - ), - ), - ], - ), - ); - } - final event = events[controller.index]; - final backgroundColor = controller.storyThemeData.color1 ?? - event.content.tryGet('body')?.color ?? - Theme.of(context).primaryColor; - final backgroundColorDark = controller.storyThemeData.color2 ?? - event.content.tryGet('body')?.darkColor ?? - Theme.of(context).primaryColorDark; - if (event.messageType == MessageTypes.Text) { - controller.loadingModeOff(); - } - final hash = event.infoMap['xyz.amorgan.blurhash']; - return Stack( - children: [ - if (hash is String) - BlurHash( - hash: hash, - imageFit: BoxFit.cover, - ), - if ({MessageTypes.Video, MessageTypes.Audio} - .contains(event.messageType) && - PlatformInfos.isMobile) - Positioned( - top: 80, - bottom: 64, - left: 0, - right: 0, - child: FutureBuilder( - future: controller.loadVideoControllerFuture ??= - controller.loadVideoController(event), - builder: (context, snapshot) { - final videoPlayerController = snapshot.data; - if (videoPlayerController == null) { - controller.loadingModeOn(); - return Container(); - } - controller.loadingModeOff(); - return Center(child: VideoPlayer(videoPlayerController)); - }, - ), - ), - if (event.messageType == MessageTypes.Image || - (event.messageType == MessageTypes.Video && - !PlatformInfos.isMobile)) - FutureBuilder( - future: controller.downloadAndDecryptAttachment( - event, event.messageType == MessageTypes.Video), - builder: (context, snapshot) { - final matrixFile = snapshot.data; - if (matrixFile == null) { - controller.loadingModeOn(); - return Container(); - } - controller.loadingModeOff(); - return Container( - constraints: const BoxConstraints.expand(), - alignment: controller.storyThemeData.fit == BoxFit.cover - ? null - : Alignment.center, - child: Image.memory( - matrixFile.bytes, - fit: controller.storyThemeData.fit, - ), - ); - }, - ), - GestureDetector( - onTapDown: controller.hold, - onTapUp: controller.unhold, - onTapCancel: controller.unhold, - onVerticalDragStart: controller.hold, - onVerticalDragEnd: controller.unhold, - onHorizontalDragStart: controller.hold, - onHorizontalDragEnd: controller.unhold, - child: AnimatedContainer( - duration: const Duration(milliseconds: 200), - padding: const EdgeInsets.symmetric( - horizontal: 16.0, - vertical: 80, - ), - decoration: BoxDecoration( - gradient: event.messageType == MessageTypes.Text - ? LinearGradient( - colors: [ - backgroundColorDark, - backgroundColor, - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ) - : null, - ), - alignment: Alignment( - controller.storyThemeData.alignmentX.toDouble() / 100, - controller.storyThemeData.alignmentY.toDouble() / 100, - ), - child: SafeArea( - child: LinkText( - text: controller.loadingMode - ? L10n.of(context)!.loadingPleaseWait - : event.content.tryGet('body') ?? '', - textAlign: TextAlign.center, - onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), - linkStyle: TextStyle( - fontSize: 24, - color: Colors.blue.shade50, - decoration: TextDecoration.underline, - shadows: event.messageType == MessageTypes.Text - ? null - : textShadows, - ), - textStyle: TextStyle( - fontSize: 24, - color: Colors.white, - shadows: event.messageType == MessageTypes.Text - ? null - : textShadows, - ), - ), - ), - ), - ), - Positioned( - top: 4, - left: 4, - right: 4, - child: SafeArea( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - for (var i = 0; i < events.length; i++) - Expanded( - child: i == controller.index - ? LinearProgressIndicator( - color: Colors.white, - minHeight: 2, - backgroundColor: Colors.grey.shade600, - value: controller.loadingMode - ? null - : controller.progress.inMilliseconds / - StoryPageController - .maxProgress.inMilliseconds, - ) - : Container( - margin: const EdgeInsets.all(4), - height: 2, - color: i < controller.index - ? Colors.white - : Colors.grey.shade600, - ), - ), - ], - ), - ), - ), - if (!controller.isOwnStory && currentEvent != null) - Positioned( - bottom: 16, - left: 16, - right: 16, - child: SafeArea( - child: TextField( - focusNode: controller.replyFocus, - controller: controller.replyController, - onSubmitted: controller.replyAction, - textInputAction: TextInputAction.send, - readOnly: controller.replyLoading, - decoration: InputDecoration( - hintText: L10n.of(context)!.reply, - prefixIcon: IconButton( - onPressed: controller.replyEmojiAction, - icon: const Icon(Icons.emoji_emotions_outlined), - ), - suffixIcon: controller.replyLoading - ? const SizedBox( - width: 16, - height: 16, - child: Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2), - ), - ) - : IconButton( - onPressed: controller.replyAction, - icon: const Icon(Icons.send_outlined), - ), - fillColor: Theme.of(context).colorScheme.background, - ), - ), - ), - ), - if (controller.isOwnStory && - controller.currentSeenByUsers.isNotEmpty) - Positioned( - bottom: 16, - left: 16, - right: 16, - child: SafeArea( - child: Center( - child: OutlinedButton.icon( - style: OutlinedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.surface, - ), - onPressed: controller.displaySeenByUsers, - icon: const Icon(Icons.visibility_outlined), - label: Text(controller.seenByUsersTitle), - ), - ), - ), - ), - ], - ); - }, - ), - ); - } -} diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart index 4316b62ba6..c4c04bf578 100644 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart +++ b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart @@ -1,152 +1,285 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; import '../../widgets/matrix.dart'; import 'user_bottom_sheet_view.dart'; +enum UserBottomSheetAction { + report, + mention, + ban, + kick, + unban, + message, + ignore, +} + +class LoadProfileBottomSheet extends StatelessWidget { + final String userId; + final BuildContext outerContext; + + const LoadProfileBottomSheet({ + super.key, + required this.userId, + required this.outerContext, + }); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: Matrix.of(outerContext) + .client + .getUserProfile(userId) + .timeout(const Duration(seconds: 3)), + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done && + snapshot.data != null) { + return Scaffold( + appBar: AppBar( + leading: CloseButton( + onPressed: Navigator.of(context, rootNavigator: false).pop, + ), + ), + body: const Center( + child: CircularProgressIndicator.adaptive(), + ), + ); + } + return UserBottomSheet( + outerContext: outerContext, + profile: Profile( + userId: userId, + avatarUrl: snapshot.data?.avatarUrl, + displayName: snapshot.data?.displayname, + ), + profileSearchError: snapshot.error, + ); + }, + ); + } +} + class UserBottomSheet extends StatefulWidget { - final User user; + final User? user; + final Profile? profile; final Function? onMention; final BuildContext outerContext; + final Object? profileSearchError; const UserBottomSheet({ - Key? key, - required this.user, + super.key, + this.user, + this.profile, required this.outerContext, this.onMention, - }) : super(key: key); + this.profileSearchError, + }) : assert(user != null || profile != null); @override UserBottomSheetController createState() => UserBottomSheetController(); } class UserBottomSheetController extends State { - void participantAction(String action) async { - // ignore: prefer_function_declarations_over_variables - final Function _askConfirmation = - () async => (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.no, - ) == - OkCancelResult.ok); + void participantAction(UserBottomSheetAction action) async { + final user = widget.user; + final userId = user?.id ?? widget.profile?.userId; + if (userId == null) throw ('user or profile must not be null!'); + switch (action) { - case 'report': - final event = widget.user; - final score = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.reportUser, - message: L10n.of(context)!.howOffensiveIsThisContent, - cancelLabel: L10n.of(context)!.cancel, - okLabel: L10n.of(context)!.ok, - actions: [ - AlertDialogAction( - key: -100, - label: L10n.of(context)!.extremeOffensive, - ), - AlertDialogAction( - key: -50, - label: L10n.of(context)!.offensive, - ), - AlertDialogAction( - key: 0, - label: L10n.of(context)!.inoffensive, - ), - ]); + case UserBottomSheetAction.report: + if (user == null) throw ('User must not be null for this action!'); + + final score = await showModalActionPopup( + context: context, + title: L10n.of(context).reportUser, + message: L10n.of(context).howOffensiveIsThisContent, + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: -100, + label: L10n.of(context).extremeOffensive, + ), + AdaptiveModalAction( + value: -50, + label: L10n.of(context).offensive, + ), + AdaptiveModalAction( + value: 0, + label: L10n.of(context).inoffensive, + ), + ], + ); if (score == null) return; final reason = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.whyDoYouWantToReportThis, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [DialogTextField(hintText: L10n.of(context)!.reason)]); - if (reason == null || reason.single.isEmpty) return; + useRootNavigator: false, + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + final result = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.reportContent( - event.roomId!, - event.eventId, - reason: reason.single, + future: () => Matrix.of(widget.outerContext).client.reportContent( + user.room.id, + user.id, + reason: reason, score: score, ), ); if (result.error != null) return; ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.contentHasBeenReported))); + SnackBar(content: Text(L10n.of(context).contentHasBeenReported)), + ); break; - case 'mention': - Navigator.of(context, rootNavigator: false).pop(); + case UserBottomSheetAction.mention: + if (user == null) throw ('User must not be null for this action!'); + Navigator.of(context).pop(); widget.onMention!(); break; - case 'ban': - if (await _askConfirmation()) { - await showFutureLoadingDialog( - context: context, - future: () => widget.user.ban(), - ); - Navigator.of(context, rootNavigator: false).pop(); - } - break; - case 'unban': - if (await _askConfirmation()) { + case UserBottomSheetAction.ban: + if (user == null) throw ('User must not be null for this action!'); + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).banUserDescription, + ) == + OkCancelResult.ok) { await showFutureLoadingDialog( context: context, - future: () => widget.user.unban(), + future: () => user.ban(), ); - Navigator.of(context, rootNavigator: false).pop(); + Navigator.of(context).pop(); } break; - case 'kick': - if (await _askConfirmation()) { + case UserBottomSheetAction.unban: + if (user == null) throw ('User must not be null for this action!'); + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).unbanUserDescription, + ) == + OkCancelResult.ok) { await showFutureLoadingDialog( context: context, - future: () => widget.user.kick(), + future: () => user.unban(), ); - Navigator.of(context, rootNavigator: false).pop(); + Navigator.of(context).pop(); } break; - case 'permission': - final newPermission = await PermissionSliderDialog( - initialPermission: widget.user.powerLevel) - .show(context); - if (newPermission != null) { - if (newPermission == 100 && await _askConfirmation() == false) break; + case UserBottomSheetAction.kick: + if (user == null) throw ('User must not be null for this action!'); + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).kickUserDescription, + ) == + OkCancelResult.ok) { await showFutureLoadingDialog( context: context, - future: () => widget.user.setPower(newPermission), + future: () => user.kick(), ); - Navigator.of(context, rootNavigator: false).pop(); + Navigator.of(context).pop(); } break; - case 'message': + case UserBottomSheetAction.message: + Navigator.of(context).pop(); + // Workaround for https://github.com/flutter/flutter/issues/27495 + await Future.delayed(FluffyThemes.animationDuration); + final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => widget.user.startDirectChat(), + context: widget.outerContext, + future: () => Matrix.of(widget.outerContext) + .client + .startDirectChat(user?.id ?? widget.profile!.userId), ); - if (roomIdResult.error != null) return; - VRouter.of(widget.outerContext) - .toSegments(['rooms', roomIdResult.result!]); - Navigator.of(context, rootNavigator: false).pop(); + final roomId = roomIdResult.result; + if (roomId == null) return; + widget.outerContext.go('/rooms/$roomId'); break; - case 'ignore': - if (await _askConfirmation()) { - await showFutureLoadingDialog( - context: context, - future: () => - Matrix.of(context).client.ignoreUser(widget.user.id)); - } + case UserBottomSheetAction.ignore: + Navigator.of(context).pop(); + // Workaround for https://github.com/flutter/flutter/issues/27495 + await Future.delayed(FluffyThemes.animationDuration); + final userId = user?.id ?? widget.profile?.userId; + widget.outerContext + .go('/rooms/settings/security/ignorelist', extra: userId); } } + Object? sendError; + + final TextEditingController sendController = TextEditingController(); + + void knockAccept() async { + final user = widget.user!; + final result = await showFutureLoadingDialog( + context: context, + future: () => user.room.invite(user.id), + ); + if (result.error != null) return; + Navigator.of(context).pop(); + } + + void knockDecline() async { + final user = widget.user!; + final result = await showFutureLoadingDialog( + context: context, + future: () => user.room.kick(user.id), + ); + if (result.error != null) return; + Navigator.of(context).pop(); + } + + void setPowerLevel(int? newLevel) async { + final user = widget.user; + if (user == null) throw ('User must not be null for this action!'); + + final level = newLevel ?? + await showPermissionChooser( + context, + currentLevel: user.powerLevel, + ); + if (level == null) return; + + if (level == 100) { + final consent = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).makeAdminDescription, + ); + if (consent != OkCancelResult.ok) return; + } + + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(level), + ); + } + @override Widget build(BuildContext context) => UserBottomSheetView(this); } diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart index da9933e0ea..17d8997993 100644 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart +++ b/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart @@ -1,176 +1,371 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; -import '../../utils/matrix_sdk_extensions.dart/presence_extension.dart'; -import '../../widgets/content_banner.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:fluffychat/widgets/qr_code_viewer.dart'; import '../../widgets/matrix.dart'; import 'user_bottom_sheet.dart'; class UserBottomSheetView extends StatelessWidget { final UserBottomSheetController controller; - const UserBottomSheetView(this.controller, {Key? key}) : super(key: key); + const UserBottomSheetView(this.controller, {super.key}); @override Widget build(BuildContext context) { final user = controller.widget.user; - final client = Matrix.of(context).client; - final presence = client.presences[user.id]; - return Center( - child: SizedBox( - width: min( - MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5), - child: Material( - elevation: 4, - child: SafeArea( - child: Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - backgroundColor: - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), - onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, - ), - title: Text(user.calcDisplayname()), - actions: [ - if (user.id != client.userID) - PopupMenuButton( - itemBuilder: (_) => [ - if (controller.widget.onMention != null) - PopupMenuItem( - value: 'mention', - child: _TextWithIcon( - L10n.of(context)!.mention, - Icons.alternate_email_outlined, - ), - ), - if (user.id != client.userID && !user.room.isDirectChat) - PopupMenuItem( - value: 'message', - child: _TextWithIcon( - L10n.of(context)!.sendAMessage, - Icons.send_outlined, + final userId = (user?.id ?? controller.widget.profile?.userId)!; + final displayname = (user?.calcDisplayname() ?? + controller.widget.profile?.displayName ?? + controller.widget.profile?.userId.localpart)!; + final avatarUrl = user?.avatarUrl ?? controller.widget.profile?.avatarUrl; + + final client = Matrix.of(controller.widget.outerContext).client; + final profileSearchError = controller.widget.profileSearchError; + final dmRoomId = client.getDirectChatFromUserId(userId); + return Scaffold( + appBar: AppBar( + leading: Center( + child: CloseButton( + onPressed: Navigator.of(context, rootNavigator: false).pop, + ), + ), + centerTitle: false, + title: Text(displayname), + actions: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: IconButton( + onPressed: () => showQrCodeViewer(context, userId), + icon: const Icon(Icons.qr_code_outlined), + ), + ), + ], + ), + body: StreamBuilder( + stream: user?.room.client.onSync.stream.where( + (syncUpdate) => + syncUpdate.rooms?.join?[user.room.id]?.timeline?.events?.any( + (state) => state.type == EventTypes.RoomPowerLevels, + ) ?? + false, + ), + builder: (context, snapshot) { + final theme = Theme.of(context); + return ListView( + children: [ + if (user?.membership == Membership.knock) + Padding( + padding: const EdgeInsets.all(12.0), + child: Material( + color: theme.colorScheme.surfaceContainerHigh, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: ListTile( + minVerticalPadding: 16, + title: Padding( + padding: const EdgeInsets.only(bottom: 12.0), + child: Text( + L10n.of(context) + .userWouldLikeToChangeTheChat(displayname), + ), + ), + subtitle: Row( + children: [ + TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.surface, + foregroundColor: theme.colorScheme.primary, ), + onPressed: controller.knockAccept, + icon: const Icon(Icons.check_outlined), + label: Text(L10n.of(context).accept), ), - if (user.canChangePowerLevel) - PopupMenuItem( - value: 'permission', - child: _TextWithIcon( - L10n.of(context)!.setPermissionsLevel, - Icons.edit_attributes_outlined, + const SizedBox(width: 12), + TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.errorContainer, + foregroundColor: + theme.colorScheme.onErrorContainer, ), + onPressed: controller.knockDecline, + icon: const Icon(Icons.cancel_outlined), + label: Text(L10n.of(context).decline), ), - if (user.canKick) - PopupMenuItem( - value: 'kick', - child: _TextWithIcon( - L10n.of(context)!.kickFromChat, - Icons.exit_to_app_outlined, - ), + ], + ), + ), + ), + ), + Row( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Avatar( + client: Matrix.of(controller.widget.outerContext).client, + mxContent: avatarUrl, + name: displayname, + size: Avatar.defaultSize * 2.5, + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: () => FluffyShare.share( + userId, + context, + copyOnly: true, ), - if (user.canBan && user.membership != Membership.ban) - PopupMenuItem( - value: 'ban', - child: _TextWithIcon( - L10n.of(context)!.banFromChat, - Icons.warning_sharp, - ), - ) - else if (user.canBan && - user.membership == Membership.ban) - PopupMenuItem( - value: 'unban', - child: _TextWithIcon( - L10n.of(context)!.unbanFromChat, - Icons.warning_outlined, - ), + icon: const Icon( + Icons.copy_outlined, + size: 14, ), - if (!client.ignoredUsers.contains(user.id)) - PopupMenuItem( - value: 'ignore', - child: _TextWithIcon( - L10n.of(context)!.ignore, - Icons.block, - ), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, ), - PopupMenuItem( - value: 'report', - child: _TextWithIcon( - L10n.of(context)!.reportUser, - Icons.shield_outlined, + label: Text( + userId, + maxLines: 1, + overflow: TextOverflow.ellipsis, ), ), + PresenceBuilder( + userId: userId, + client: client, + builder: (context, presence) { + if (presence == null || + (presence.presence == PresenceType.offline && + presence.lastActiveTimestamp == null)) { + return const SizedBox.shrink(); + } + + final dotColor = presence.presence.isOnline + ? Colors.green + : presence.presence.isUnavailable + ? Colors.orange + : Colors.grey; + + final lastActiveTimestamp = + presence.lastActiveTimestamp; + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(width: 16), + Container( + width: 8, + height: 8, + decoration: BoxDecoration( + color: dotColor, + borderRadius: BorderRadius.circular(16), + ), + ), + const SizedBox(width: 12), + if (presence.currentlyActive == true) + Text( + L10n.of(context).currentlyActive, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall, + ) + else if (lastActiveTimestamp != null) + Text( + L10n.of(context).lastActiveAgo( + lastActiveTimestamp + .localizedTimeShort(context), + ), + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall, + ), + ], + ); + }, + ), ], - onSelected: controller.participantAction, ), + ), ], ), - body: Column( - children: [ - Expanded( - child: ContentBanner( - mxContent: user.avatarUrl, - defaultIcon: Icons.account_circle_outlined, - client: client, + PresenceBuilder( + userId: userId, + client: client, + builder: (context, presence) { + final status = presence?.statusMsg; + if (status == null || status.isEmpty) { + return const SizedBox.shrink(); + } + return ListTile( + title: SelectableLinkify( + text: status, + style: const TextStyle(fontSize: 16), + options: const LinkifyOptions(humanize: false), + linkStyle: const TextStyle( + color: Colors.blueAccent, + decorationColor: Colors.blueAccent, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), ), + ); + }, + ), + if (userId != client.userID) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, ), - ListTile( - title: Text(L10n.of(context)!.username), - subtitle: Text(user.id), - trailing: Icon(Icons.adaptive.share_outlined), - onTap: () => FluffyShare.share( - user.id, - context, + child: ElevatedButton.icon( + onPressed: () => controller.participantAction( + UserBottomSheetAction.message, + ), + icon: const Icon(Icons.forum_outlined), + label: Text( + dmRoomId == null + ? L10n.of(context).startConversation + : L10n.of(context).sendAMessage, ), ), - if (presence != null) - ListTile( - title: Text(presence.getLocalizedStatusMessage(context)), - subtitle: - Text(presence.getLocalizedLastActiveAgo(context)), - trailing: Icon(Icons.circle, - color: presence.presence == PresenceType.online - ? Colors.green - : Colors.grey), + ), + if (controller.widget.onMention != null) + ListTile( + leading: const Icon(Icons.alternate_email_outlined), + title: Text(L10n.of(context).mention), + onTap: () => controller + .participantAction(UserBottomSheetAction.mention), + ), + if (user != null) ...[ + Divider(color: theme.dividerColor), + ListTile( + title: Text(L10n.of(context).userRole), + leading: const Icon(Icons.admin_panel_settings_outlined), + trailing: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.onInverseSurface, + child: DropdownButton( + onChanged: user.canChangeUserPowerLevel || + // Workaround until https://github.com/famedly/matrix-dart-sdk/pull/1765 + (user.room.canChangePowerLevel && + user.id == user.room.client.userID) + ? controller.setPowerLevel + : null, + value: {0, 50, 100}.contains(user.powerLevel) + ? user.powerLevel + : null, + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + underline: const SizedBox.shrink(), + items: [ + DropdownMenuItem( + value: 0, + child: Text( + L10n.of(context).userLevel( + user.powerLevel < 50 ? user.powerLevel : 0, + ), + ), + ), + DropdownMenuItem( + value: 50, + child: Text( + L10n.of(context).moderatorLevel( + user.powerLevel >= 50 && user.powerLevel < 100 + ? user.powerLevel + : 50, + ), + ), + ), + DropdownMenuItem( + value: 100, + child: Text( + L10n.of(context).adminLevel( + user.powerLevel >= 100 ? user.powerLevel : 100, + ), + ), + ), + DropdownMenuItem( + value: null, + child: Text(L10n.of(context).custom), + ), + ], ), - ], - ), - ), - ), - ), + ), + ), + ], + Divider(color: theme.dividerColor), + if (user != null && user.canKick) + ListTile( + textColor: theme.colorScheme.error, + iconColor: theme.colorScheme.error, + title: Text(L10n.of(context).kickFromChat), + leading: const Icon(Icons.exit_to_app_outlined), + onTap: () => + controller.participantAction(UserBottomSheetAction.kick), + ), + if (user != null && + user.canBan && + user.membership != Membership.ban) + ListTile( + textColor: theme.colorScheme.onErrorContainer, + iconColor: theme.colorScheme.onErrorContainer, + title: Text(L10n.of(context).banFromChat), + leading: const Icon(Icons.warning_sharp), + onTap: () => + controller.participantAction(UserBottomSheetAction.ban), + ) + else if (user != null && + user.canBan && + user.membership == Membership.ban) + ListTile( + title: Text(L10n.of(context).unbanFromChat), + leading: const Icon(Icons.warning_outlined), + onTap: () => + controller.participantAction(UserBottomSheetAction.unban), + ), + if (user != null && user.id != client.userID) + ListTile( + textColor: theme.colorScheme.onErrorContainer, + iconColor: theme.colorScheme.onErrorContainer, + title: Text(L10n.of(context).reportUser), + leading: const Icon(Icons.gavel_outlined), + onTap: () => controller + .participantAction(UserBottomSheetAction.report), + ), + if (profileSearchError != null) + ListTile( + leading: const Icon( + Icons.warning_outlined, + color: Colors.orange, + ), + subtitle: Text( + L10n.of(context).profileNotFound, + style: const TextStyle(color: Colors.orange), + ), + ), + if (userId != client.userID && + !client.ignoredUsers.contains(userId)) + ListTile( + textColor: theme.colorScheme.onErrorContainer, + iconColor: theme.colorScheme.onErrorContainer, + leading: const Icon(Icons.block_outlined), + title: Text(L10n.of(context).block), + onTap: () => controller + .participantAction(UserBottomSheetAction.ignore), + ), + ], + ); + }, ), ); } } - -class _TextWithIcon extends StatelessWidget { - final String text; - final IconData iconData; - - const _TextWithIcon( - this.text, - this.iconData, { - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(iconData), - const SizedBox(width: 16), - Text(text), - ], - ); - } -} diff --git a/lib/utils/account_bundles.dart b/lib/utils/account_bundles.dart index f45f9dc70c..8bd296e053 100644 --- a/lib/utils/account_bundles.dart +++ b/lib/utils/account_bundles.dart @@ -55,10 +55,12 @@ extension AccountBundlesExtension on Client { } ret ??= []; if (ret.isEmpty) { - ret.add(AccountBundle( - name: userID, - priority: 0, - )); + ret.add( + AccountBundle( + name: userID, + priority: 0, + ), + ); } return ret; } diff --git a/lib/utils/account_config.dart b/lib/utils/account_config.dart new file mode 100644 index 0000000000..a5e2dfd001 --- /dev/null +++ b/lib/utils/account_config.dart @@ -0,0 +1,70 @@ +import 'package:matrix/matrix.dart'; + +extension ApplicationAccountConfigExtension on Client { + static const String accountDataKey = 'im.fluffychat.account_config'; + + ApplicationAccountConfig get applicationAccountConfig => + ApplicationAccountConfig.fromJson( + accountData[accountDataKey]?.content ?? {}, + ); + + Future setApplicationAccountConfig( + ApplicationAccountConfig config, + ) => + setAccountData( + userID!, + accountDataKey, + config.toJson(), + ); + + /// Only updates the specified values in ApplicationAccountConfig + Future updateApplicationAccountConfig( + ApplicationAccountConfig config, + ) { + final currentConfig = applicationAccountConfig; + return setAccountData( + userID!, + accountDataKey, + ApplicationAccountConfig( + wallpaperUrl: config.wallpaperUrl ?? currentConfig.wallpaperUrl, + wallpaperOpacity: + config.wallpaperOpacity ?? currentConfig.wallpaperOpacity, + wallpaperBlur: config.wallpaperBlur ?? currentConfig.wallpaperBlur, + ).toJson(), + ); + } +} + +class ApplicationAccountConfig { + final Uri? wallpaperUrl; + final double? wallpaperOpacity; + final double? wallpaperBlur; + + const ApplicationAccountConfig({ + this.wallpaperUrl, + this.wallpaperOpacity, + this.wallpaperBlur, + }); + + static double _sanitizedOpacity(double? opacity) { + if (opacity == null) return 1; + if (opacity > 1 || opacity < 0) return 1; + return opacity; + } + + factory ApplicationAccountConfig.fromJson(Map json) => + ApplicationAccountConfig( + wallpaperUrl: json['wallpaper_url'] is String + ? Uri.tryParse(json['wallpaper_url']) + : null, + wallpaperOpacity: + _sanitizedOpacity(json.tryGet('wallpaper_opacity')), + wallpaperBlur: json.tryGet('wallpaper_blur'), + ); + + Map toJson() => { + 'wallpaper_url': wallpaperUrl?.toString(), + 'wallpaper_opacity': wallpaperOpacity, + 'wallpaper_blur': wallpaperBlur, + }; +} diff --git a/lib/utils/adaptive_bottom_sheet.dart b/lib/utils/adaptive_bottom_sheet.dart new file mode 100644 index 0000000000..f2addb838a --- /dev/null +++ b/lib/utils/adaptive_bottom_sheet.dart @@ -0,0 +1,43 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; + +Future showAdaptiveBottomSheet({ + required BuildContext context, + required Widget Function(BuildContext) builder, + bool isDismissible = true, + bool isScrollControlled = true, + bool useRootNavigator = true, +}) { + final maxHeight = min(MediaQuery.of(context).size.height - 32, 600); + final dialogMode = FluffyThemes.isColumnMode(context); + return showModalBottomSheet( + context: context, + builder: (context) => Padding( + padding: dialogMode + ? const EdgeInsets.symmetric(vertical: 32.0) + : EdgeInsets.zero, + child: ClipRRect( + borderRadius: dialogMode + ? BorderRadius.circular(AppConfig.borderRadius) + : const BorderRadius.only( + topLeft: Radius.circular(AppConfig.borderRadius), + topRight: Radius.circular(AppConfig.borderRadius), + ), + child: builder(context), + ), + ), + useRootNavigator: useRootNavigator, + isDismissible: isDismissible, + isScrollControlled: isScrollControlled, + constraints: BoxConstraints( + maxHeight: maxHeight + (dialogMode ? 64 : 0), + maxWidth: FluffyThemes.columnWidth * 1.25, + ), + backgroundColor: Colors.transparent, + clipBehavior: Clip.hardEdge, + ); +} diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 05567660ed..1ba2659a6b 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -20,23 +20,23 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; -import 'dart:ui'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_app_badger/flutter_app_badger.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:http/http.dart' as http; import 'package:matrix/matrix.dart'; import 'package:unifiedpush/unifiedpush.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:unifiedpush_ui/unifiedpush_ui.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; import 'package:fluffychat/utils/push_helper.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; -import 'famedlysdk_store.dart'; +import '../widgets/matrix.dart'; import 'platform_infos.dart'; //import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; @@ -50,17 +50,16 @@ class BackgroundPush { final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); Client client; - BuildContext? context; - GlobalKey? router; + MatrixState? matrix; String? _fcmToken; void Function(String errorMsg, {Uri? link})? onFcmError; L10n? l10n; - Store? _store; - Store get store => _store ??= Store(); + Future loadLocale() async { + final context = matrix?.context; // inspired by _lookupL10n in .dart_tool/flutter_gen/gen_l10n/l10n.dart - l10n ??= (context != null ? L10n.of(context!) : null) ?? - (await L10n.delegate.load(window.locale)); + l10n ??= (context != null ? L10n.of(context) : null) ?? + (await L10n.delegate.load(PlatformDispatcher.instance.locale)); } final pendingTests = >{}; @@ -71,61 +70,75 @@ class BackgroundPush { bool upAction = false; - BackgroundPush._(this.client) { - onLogin ??= - client.onLoginStateChanged.stream.listen(handleLoginStateChanged); - onRoomSync ??= client.onSync.stream - .where((s) => s.hasRoomUpdate) - .listen((s) => _onClearingPush(getFromServer: false)); - firebase?.setListeners( - onMessage: (message) => pushHelper( - PushNotification.fromJson( - Map.from(message['data'] ?? message)), - client: client, - l10n: l10n, - activeRoomId: router?.currentState?.pathParameters['roomid'], - onSelectNotification: goToRoom, - ), - onNewToken: _newFcmToken, - ); - if (Platform.isAndroid) { - UnifiedPush.initialize( - onNewEndpoint: _newUpEndpoint, - onRegistrationFailed: _upUnregistered, - onUnregistered: _upUnregistered, - onMessage: _onUpMessage, + void _init() async { + try { + await _flutterLocalNotificationsPlugin.initialize( + const InitializationSettings( + android: AndroidInitializationSettings('notifications_icon'), + iOS: DarwinInitializationSettings(), + ), + onDidReceiveNotificationResponse: goToRoom, ); + Logs().v('Flutter Local Notifications initialized'); + firebase?.setListeners( + onMessage: (message) => pushHelper( + PushNotification.fromJson( + Map.from(message['data'] ?? message), + ), + client: client, + l10n: l10n, + activeRoomId: matrix?.activeRoomId, + flutterLocalNotificationsPlugin: _flutterLocalNotificationsPlugin, + ), + ); + if (Platform.isAndroid) { + await UnifiedPush.initialize( + onNewEndpoint: _newUpEndpoint, + onRegistrationFailed: _upUnregistered, + onUnregistered: _upUnregistered, + onMessage: _onUpMessage, + ); + } + } catch (e, s) { + Logs().e('Unable to initialize Flutter local notifications', e, s); } } + BackgroundPush._(this.client) { + _init(); + } + factory BackgroundPush.clientOnly(Client client) { - _instance ??= BackgroundPush._(client); - return _instance!; + return _instance ??= BackgroundPush._(client); } factory BackgroundPush( - Client _client, BuildContext _context, GlobalKey? router, - {final void Function(String errorMsg, {Uri? link})? onFcmError}) { - final instance = BackgroundPush.clientOnly(_client); - instance.context = _context; - // ignore: prefer_initializing_formals - instance.router = router; + MatrixState matrix, { + final void Function(String errorMsg, {Uri? link})? onFcmError, + }) { + final instance = BackgroundPush.clientOnly(matrix.client); + instance.matrix = matrix; // ignore: prefer_initializing_formals instance.onFcmError = onFcmError; - instance.fullInit(); return instance; } - Future fullInit() => setupPush(); - - void handleLoginStateChanged(_) => setupPush(); - - StreamSubscription? onLogin; - StreamSubscription? onRoomSync; - - void _newFcmToken(String token) { - _fcmToken = token; - setupPush(); + Future cancelNotification(String roomId) async { + Logs().v('Cancel notification for room', roomId); + await _flutterLocalNotificationsPlugin.cancel(roomId.hashCode); + + // Workaround for app icon badge not updating + if (Platform.isIOS) { + final unreadCount = client.rooms + .where((room) => room.isUnreadOrInvited && room.id != roomId) + .length; + if (unreadCount == 0) { + FlutterAppBadger.removeBadge(); + } else { + FlutterAppBadger.updateBadgeCount(unreadCount); + } + return; + } } Future setupPusher({ @@ -136,6 +149,11 @@ class BackgroundPush { }) async { if (PlatformInfos.isIOS) { await firebase?.requestPermission(); + } else if (PlatformInfos.isAndroid) { + _flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.requestNotificationsPermission(); } final clientName = PlatformInfos.clientName; oldTokens ??= {}; @@ -167,7 +185,11 @@ class BackgroundPush { currentPushers.first.lang == 'en' && currentPushers.first.data.url.toString() == gatewayUrl && currentPushers.first.data.format == - AppConfig.pushNotificationsPusherFormat) { + AppConfig.pushNotificationsPusherFormat && + mapEquals( + currentPushers.single.data.additionalProperties, + {"data_message": pusherDataMessageFormat}, + )) { Logs().i('[Push] Pusher already set'); } else { Logs().i('Need to set new pusher'); @@ -204,6 +226,7 @@ class BackgroundPush { data: PusherData( url: Uri.parse(gatewayUrl!), format: AppConfig.pushNotificationsPusherFormat, + additionalProperties: {"data_message": pusherDataMessageFormat}, ), kind: 'http', ), @@ -215,13 +238,19 @@ class BackgroundPush { } } - bool _wentToRoomOnStartup = false; + final pusherDataMessageFormat = Platform.isAndroid + ? 'android' + : Platform.isIOS + ? 'ios' + : null; + + static bool _wentToRoomOnStartup = false; Future setupPush() async { Logs().d("SetupPush"); if (client.onLoginStateChanged.value != LoginState.loggedIn || !PlatformInfos.isMobile || - context == null) { + matrix == null) { return; } // Do not setup unifiedpush if this has been initialized by @@ -242,21 +271,23 @@ class BackgroundPush { .then((details) { if (details == null || !details.didNotificationLaunchApp || - _wentToRoomOnStartup || - router == null) { + _wentToRoomOnStartup) { return; } _wentToRoomOnStartup = true; - goToRoom(details.payload); + goToRoom(details.notificationResponse); }); } Future _noFcmWarning() async { - if (context == null) { + if (matrix == null) { + return; + } + if ((matrix?.store.getBool(SettingKeys.showNoGoogle) ?? false) == true) { return; } - if (await store.getItemBool(SettingKeys.showNoGoogle, true)) { - await loadLocale(); + await loadLocale(); + WidgetsBinding.instance.addPostFrameCallback((_) { if (PlatformInfos.isAndroid) { onFcmError?.call( l10n!.noGoogleServicesWarning, @@ -264,13 +295,10 @@ class BackgroundPush { AppConfig.enablePushTutorial, ), ); + return; } onFcmError?.call(l10n!.oopsPushError); - - if (null == await store.getItem(SettingKeys.showNoGoogle)) { - await store.setItemBool(SettingKeys.showNoGoogle, false); - } - } + }); } Future setupFirebase() async { @@ -291,28 +319,33 @@ class BackgroundPush { ); } - Future goToRoom(String? roomId) async { + Future goToRoom(NotificationResponse? response) async { try { + final roomId = response?.payload; Logs().v('[Push] Attempting to go to room $roomId...'); - if (router == null || roomId == null) { + if (roomId == null) { return; } await client.roomsLoading; await client.accountDataLoading; - final isStory = client - .getRoomById(roomId) - ?.getState(EventTypes.RoomCreate) - ?.content - .tryGet('type') == - ClientStoriesExtension.storiesRoomType; - router!.currentState!.toSegments([isStory ? 'stories' : 'rooms', roomId]); + if (client.getRoomById(roomId) == null) { + await client + .waitForRoomInSync(roomId) + .timeout(const Duration(seconds: 30)); + } + FluffyChatApp.router.go( + client.getRoomById(roomId)?.membership == Membership.invite + ? '/rooms' + : '/rooms/$roomId', + ); } catch (e, s) { Logs().e('[Push] Failed to open room', e, s); } } Future setupUp() async { - await UnifiedPush.registerAppWithDialog(context!); + await UnifiedPushUi(matrix!.context, ["default"], UPFunctions()) + .registerAppWithDialog(); } Future _newUpEndpoint(String newEndpoint, String i) async { @@ -341,9 +374,10 @@ class BackgroundPush { } } catch (e) { Logs().i( - '[Push] No self-hosted unified push gateway present: ' + newEndpoint); + '[Push] No self-hosted unified push gateway present: $newEndpoint', + ); } - Logs().i('[Push] UnifiedPush using endpoint ' + endpoint); + Logs().i('[Push] UnifiedPush using endpoint $endpoint'); final oldTokens = {}; try { final fcmToken = await firebase?.getToken(); @@ -355,16 +389,17 @@ class BackgroundPush { oldTokens: oldTokens, useDeviceSpecificAppId: true, ); - await store.setItem(SettingKeys.unifiedPushEndpoint, newEndpoint); - await store.setItemBool(SettingKeys.unifiedPushRegistered, true); + await matrix?.store.setString(SettingKeys.unifiedPushEndpoint, newEndpoint); + await matrix?.store.setBool(SettingKeys.unifiedPushRegistered, true); } Future _upUnregistered(String i) async { upAction = true; Logs().i('[Push] Removing UnifiedPush endpoint...'); - final oldEndpoint = await store.getItem(SettingKeys.unifiedPushEndpoint); - await store.setItemBool(SettingKeys.unifiedPushRegistered, false); - await store.deleteItem(SettingKeys.unifiedPushEndpoint); + final oldEndpoint = + matrix?.store.getString(SettingKeys.unifiedPushEndpoint); + await matrix?.store.setBool(SettingKeys.unifiedPushRegistered, false); + await matrix?.store.remove(SettingKeys.unifiedPushEndpoint); if (oldEndpoint?.isNotEmpty ?? false) { // remove the old pusher await setupPusher( @@ -376,118 +411,39 @@ class BackgroundPush { Future _onUpMessage(Uint8List message, String i) async { upAction = true; final data = Map.from( - json.decode(utf8.decode(message))['notification']); + json.decode(utf8.decode(message))['notification'], + ); // UP may strip the devices list data['devices'] ??= []; await pushHelper( PushNotification.fromJson(data), client: client, l10n: l10n, - activeRoomId: router?.currentState?.pathParameters['roomid'], + activeRoomId: matrix?.activeRoomId, + flutterLocalNotificationsPlugin: _flutterLocalNotificationsPlugin, ); } +} - /// Workaround for the problem that local notification IDs must be int but we - /// sort by [roomId] which is a String. To make sure that we don't have duplicated - /// IDs we map the [roomId] to a number and store this number. - late Map idMap; - Future _loadIdMap() async { - idMap = Map.from(json.decode( - (await store.getItem(SettingKeys.notificationCurrentIds)) ?? '{}')); +class UPFunctions extends UnifiedPushFunctions { + final List features = [/*list of features*/]; + @override + Future getDistributor() async { + return await UnifiedPush.getDistributor(); } - Future mapRoomIdToInt(String roomId) async { - await _loadIdMap(); - int? currentInt; - try { - currentInt = idMap[roomId]; - } catch (_) { - currentInt = null; - } - if (currentInt != null) { - return currentInt; - } - var nCurrentInt = 0; - while (idMap.values.contains(currentInt)) { - nCurrentInt++; - } - idMap[roomId] = nCurrentInt; - await store.setItem(SettingKeys.notificationCurrentIds, json.encode(idMap)); - return nCurrentInt; + @override + Future> getDistributors() async { + return await UnifiedPush.getDistributors(features); } - bool _clearingPushLock = false; - Future _onClearingPush({bool getFromServer = true}) async { - if (_clearingPushLock) { - return; - } - try { - _clearingPushLock = true; - late Iterable emptyRooms; - if (getFromServer) { - Logs().v('[Push] Got new clearing push'); - var syncErrored = false; - if (client.syncPending) { - Logs().v('[Push] waiting for existing sync'); - // we need to catchError here as the Future might be in a different execution zone - await client.oneShotSync().catchError((e) { - syncErrored = true; - Logs().v('[Push] Error one-shot syncing', e); - }); - } - if (!syncErrored) { - Logs().v('[Push] single oneShotSync'); - // we need to catchError here as the Future might be in a different execution zone - await client.oneShotSync().catchError((e) { - syncErrored = true; - Logs().v('[Push] Error one-shot syncing', e); - }); - if (!syncErrored) { - emptyRooms = client.rooms - .where((r) => r.notificationCount == 0) - .map((r) => r.id); - } - } - if (syncErrored) { - try { - Logs().v( - '[Push] failed to sync for fallback push, fetching notifications endpoint...'); - final notifications = await client.getNotifications(limit: 20); - final notificationRooms = - notifications.notifications.map((n) => n.roomId).toSet(); - emptyRooms = client.rooms - .where((r) => !notificationRooms.contains(r.id)) - .map((r) => r.id); - } catch (e) { - Logs().v( - '[Push] failed to fetch pending notifications for clearing push, falling back...', - e); - emptyRooms = client.rooms - .where((r) => r.notificationCount == 0) - .map((r) => r.id); - } - } - } else { - emptyRooms = client.rooms - .where((r) => r.notificationCount == 0) - .map((r) => r.id); - } - await _loadIdMap(); - var changed = false; - for (final roomId in emptyRooms) { - final id = idMap[roomId]; - if (id != null) { - idMap.remove(roomId); - changed = true; - await _flutterLocalNotificationsPlugin.cancel(id); - } - } - if (changed) { - await store.setItem( - SettingKeys.notificationCurrentIds, json.encode(idMap)); - } - } finally { - _clearingPushLock = false; - } + @override + Future registerApp(String instance) async { + await UnifiedPush.registerApp(instance, features); + } + + @override + Future saveDistributor(String distributor) async { + await UnifiedPush.saveDistributor(distributor); } } diff --git a/lib/utils/beautify_string_extension.dart b/lib/utils/beautify_string_extension.dart index b555d6def2..3e01fb7a7d 100644 --- a/lib/utils/beautify_string_extension.dart +++ b/lib/utils/beautify_string_extension.dart @@ -4,7 +4,7 @@ extension BeautifyStringExtension on String { for (var i = 0; i < length; i++) { beautifiedStr += substring(i, i + 1); if (i % 4 == 3) { - beautifiedStr += ' '; + beautifiedStr += ' '; } if (i % 16 == 15) { beautifiedStr += '\n'; diff --git a/lib/utils/client_download_content_extension.dart b/lib/utils/client_download_content_extension.dart new file mode 100644 index 0000000000..9fff1eccd2 --- /dev/null +++ b/lib/utils/client_download_content_extension.dart @@ -0,0 +1,53 @@ +import 'dart:typed_data'; + +import 'package:matrix/matrix.dart'; + +extension ClientDownloadContentExtension on Client { + Future downloadMxcCached( + Uri mxc, { + num? width, + num? height, + bool isThumbnail = false, + bool? animated, + ThumbnailMethod? thumbnailMethod, + }) async { + // To stay compatible with previous storeKeys: + final cacheKey = isThumbnail + // ignore: deprecated_member_use + ? mxc.getThumbnail( + this, + width: width, + height: height, + animated: animated, + method: thumbnailMethod!, + ) + : mxc; + + final cachedData = await database?.getFile(cacheKey); + if (cachedData != null) return cachedData; + + final httpUri = isThumbnail + ? await mxc.getThumbnailUri( + this, + width: width, + height: height, + animated: animated, + method: thumbnailMethod, + ) + : await mxc.getDownloadUri(this); + + final response = await httpClient.get( + httpUri, + headers: + accessToken == null ? null : {'authorization': 'Bearer $accessToken'}, + ); + if (response.statusCode != 200) { + throw Exception(); + } + final remoteData = response.bodyBytes; + + await database?.storeFile(cacheKey, remoteData, 0); + + return remoteData; + } +} diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 1acdd09669..d6bc696692 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -1,22 +1,31 @@ -import 'dart:convert'; +import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:desktop_notifications/desktop_notifications.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/custom_http_client.dart'; import 'package:fluffychat/utils/custom_image_resizer.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'famedlysdk_store.dart'; -import 'matrix_sdk_extensions.dart/fluffybox_database.dart'; +import 'matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart'; abstract class ClientManager { static const String clientNamespace = 'im.fluffychat.store.clients'; - static Future> getClients({bool initialize = true}) async { + static Future> getClients({ + bool initialize = true, + required SharedPreferences store, + }) async { if (PlatformInfos.isLinux) { Hive.init((await getApplicationSupportDirectory()).path); } else { @@ -24,65 +33,70 @@ abstract class ClientManager { } final clientNames = {}; try { - final rawClientNames = await Store().getItem(clientNamespace); - if (rawClientNames != null) { - final clientNamesList = - (jsonDecode(rawClientNames) as List).cast(); - clientNames.addAll(clientNamesList); - } + final clientNamesList = store.getStringList(clientNamespace) ?? []; + clientNames.addAll(clientNamesList); } catch (e, s) { Logs().w('Client names in store are corrupted', e, s); - await Store().deleteItem(clientNamespace); + await store.remove(clientNamespace); } if (clientNames.isEmpty) { clientNames.add(PlatformInfos.clientName); - await Store().setItem(clientNamespace, jsonEncode(clientNames.toList())); + await store.setStringList(clientNamespace, clientNames.toList()); } final clients = clientNames.map(createClient).toList(); if (initialize) { - await Future.wait(clients.map((client) => client - .init( - waitForFirstSync: false, - waitUntilLoadCompletedLoaded: false, - ) - .catchError( - (e, s) => Logs().e('Unable to initialize client', e, s)))); + await Future.wait( + clients.map( + (client) => client.initWithRestore( + onMigration: () async { + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + sendInitNotification( + l10n.databaseMigrationTitle, + l10n.databaseMigrationBody, + ); + }, + ).catchError( + (e, s) => Logs().e('Unable to initialize client', e, s), + ), + ), + ); } if (clients.length > 1 && clients.any((c) => !c.isLogged())) { final loggedOutClients = clients.where((c) => !c.isLogged()).toList(); for (final client in loggedOutClients) { Logs().w( - 'Multi account is enabled but client ${client.userID} is not logged in. Removing...'); + 'Multi account is enabled but client ${client.userID} is not logged in. Removing...', + ); clientNames.remove(client.clientName); clients.remove(client); } - await Store().setItem(clientNamespace, jsonEncode(clientNames.toList())); + await store.setStringList(clientNamespace, clientNames.toList()); } return clients; } - static Future addClientNameToStore(String clientName) async { - final clientNamesList = []; - final rawClientNames = await Store().getItem(clientNamespace); - if (rawClientNames != null) { - final stored = (jsonDecode(rawClientNames) as List).cast(); - clientNamesList.addAll(stored); - } + static Future addClientNameToStore( + String clientName, + SharedPreferences store, + ) async { + final clientNamesList = store.getStringList(clientNamespace) ?? []; clientNamesList.add(clientName); - await Store().setItem(clientNamespace, jsonEncode(clientNamesList)); + await store.setStringList(clientNamespace, clientNamesList); } - static Future removeClientNameFromStore(String clientName) async { - final clientNamesList = []; - final rawClientNames = await Store().getItem(clientNamespace); - if (rawClientNames != null) { - final stored = (jsonDecode(rawClientNames) as List).cast(); - clientNamesList.addAll(stored); - } + static Future removeClientNameFromStore( + String clientName, + SharedPreferences store, + ) async { + final clientNamesList = store.getStringList(clientNamespace) ?? []; clientNamesList.remove(clientName); - await Store().setItem(clientNamespace, jsonEncode(clientNamesList)); + await store.setStringList(clientNamespace, clientNamesList); } + static NativeImplementations get nativeImplementations => kIsWeb + ? const NativeImplementationsDummy() + : NativeImplementationsIsolate(compute); + static Client createClient(String clientName) { return Client( clientName, @@ -96,20 +110,63 @@ abstract class ClientManager { importantStateEvents: { // To make room emotes work 'im.ponies.room_emotes', - // To check which story room we can post in - EventTypes.RoomPowerLevels, }, - databaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, - legacyDatabaseBuilder: FlutterFluffyBoxDatabase.databaseBuilder, + logLevel: kReleaseMode ? Level.warning : Level.verbose, + databaseBuilder: flutterMatrixSdkDatabaseBuilder, + legacyDatabaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, supportedLoginTypes: { AuthenticationTypes.password, - if (PlatformInfos.isMobile || - PlatformInfos.isWeb || - PlatformInfos.isMacOS) - AuthenticationTypes.sso + AuthenticationTypes.sso, }, - compute: compute, + nativeImplementations: nativeImplementations, customImageResizer: PlatformInfos.isMobile ? customImageResizer : null, + defaultNetworkRequestTimeout: const Duration(minutes: 30), + enableDehydratedDevices: true, + ); + } + + static void sendInitNotification(String title, String body) async { + if (kIsWeb) { + html.Notification( + title, + body: body, + ); + return; + } + if (Platform.isLinux) { + await NotificationsClient().notify( + title, + body: body, + appName: AppConfig.applicationName, + hints: [ + NotificationHint.soundName('message-new-instant'), + ], + ); + return; + } + + final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + + await flutterLocalNotificationsPlugin.initialize( + const InitializationSettings( + android: AndroidInitializationSettings('notifications_icon'), + iOS: DarwinInitializationSettings(), + ), + ); + + flutterLocalNotificationsPlugin.show( + 0, + title, + body, + const NotificationDetails( + android: AndroidNotificationDetails( + 'error_message', + 'Error Messages', + importance: Importance.high, + priority: Priority.max, + ), + iOS: DarwinNotificationDetails(sound: 'notification.caf'), + ), ); } } diff --git a/lib/utils/color_value.dart b/lib/utils/color_value.dart new file mode 100644 index 0000000000..49195779d1 --- /dev/null +++ b/lib/utils/color_value.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; + +extension ColorValue on Color { + int get hexValue { + return _floatToInt8(a) << 24 | + _floatToInt8(r) << 16 | + _floatToInt8(g) << 8 | + _floatToInt8(b) << 0; + } + + static int _floatToInt8(double x) { + return (x * 255.0).round() & 0xff; + } +} diff --git a/lib/utils/custom_image_resizer.dart b/lib/utils/custom_image_resizer.dart index 677d7e8eb4..f783d5cacf 100644 --- a/lib/utils/custom_image_resizer.dart +++ b/lib/utils/custom_image_resizer.dart @@ -1,63 +1,103 @@ -import 'dart:typed_data'; import 'dart:ui'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + import 'package:matrix/matrix.dart'; import 'package:native_imaging/native_imaging.dart' as native; +(int, int) _scaleToBox(int width, int height, {required int boxSize}) { + final fit = applyBoxFit( + BoxFit.scaleDown, + Size(width.toDouble(), height.toDouble()), + Size(boxSize.toDouble(), boxSize.toDouble()), + ).destination; + return (fit.width.round(), fit.height.round()); +} + Future customImageResizer( - MatrixImageFileResizeArguments arguments) async { + MatrixImageFileResizeArguments arguments, +) async { + if (kIsWeb) { + throw UnsupportedError( + 'customImageResizer only supports non-web platforms.', + ); + } + await native.init(); - late native.Image nativeImg; + + var imageBytes = arguments.bytes; + String? blurhash; + + var originalWidth = 0; + var originalHeight = 0; + var width = 0; + var height = 0; try { - nativeImg = await native.Image.loadEncoded(arguments.bytes); // load on web - } on UnsupportedError { - try { - // for the other platforms - final dartCodec = await instantiateImageCodec(arguments.bytes); - final dartFrame = await dartCodec.getNextFrame(); - final rgbaData = await dartFrame.image.toByteData(); - if (rgbaData == null) { - return null; - } - final rgba = Uint8List.view( - rgbaData.buffer, rgbaData.offsetInBytes, rgbaData.lengthInBytes); + // for the other platforms + final dartCodec = await instantiateImageCodec(arguments.bytes); + final frameCount = dartCodec.frameCount; + final dartFrame = await dartCodec.getNextFrame(); + final rgbaData = await dartFrame.image.toByteData(); + if (rgbaData == null) { + return null; + } + final rgba = Uint8List.view( + rgbaData.buffer, + rgbaData.offsetInBytes, + rgbaData.lengthInBytes, + ); - final width = dartFrame.image.width; - final height = dartFrame.image.height; + width = originalWidth = dartFrame.image.width; + height = originalHeight = dartFrame.image.height; - dartFrame.image.dispose(); - dartCodec.dispose(); + var nativeImg = native.Image.fromRGBA(width, height, rgba); - nativeImg = native.Image.fromRGBA(width, height, rgba); - } catch (e, s) { - Logs().e("Could not generate preview", e, s); - rethrow; - } - } + dartFrame.image.dispose(); + dartCodec.dispose(); - final width = nativeImg.width; - final height = nativeImg.height; + if (arguments.calcBlurhash) { + // scale down image for blurhashing to speed it up + final (blurW, blurH) = _scaleToBox(width, height, boxSize: 100); + final blurhashImg = nativeImg.resample( + blurW, blurH, + // nearest is unsupported... + native.Transform.bilinear, + ); - final max = arguments.maxDimension; - if (width > max || height > max) { - var w = max, h = max; - if (width > height) { - h = max * height ~/ width; - } else { - w = max * width ~/ height; + blurhash = blurhashImg.toBlurhash(3, 3); + + blurhashImg.free(); } - final scaledImg = nativeImg.resample(w, h, native.Transform.lanczos); - nativeImg.free(); - nativeImg = scaledImg; + if (frameCount > 1) { + // Don't scale down animated images, since those would lose frames. + nativeImg.free(); + } else { + final max = arguments.maxDimension; + if (width > max || height > max) { + (width, height) = _scaleToBox(width, height, boxSize: max); + + final scaledImg = + nativeImg.resample(width, height, native.Transform.lanczos); + nativeImg.free(); + nativeImg = scaledImg; + } + + imageBytes = await nativeImg.toJpeg(75); + nativeImg.free(); + } + } catch (e, s) { + Logs().e("Could not generate preview", e, s); } - final jpegBytes = await nativeImg.toJpeg(75); return MatrixImageFileResizedResponse( - bytes: jpegBytes, - width: nativeImg.width, - height: nativeImg.height, - blurhash: arguments.calcBlurhash ? nativeImg.toBlurhash(3, 3) : null, + bytes: imageBytes, + width: width, + height: height, + originalWidth: originalWidth, + originalHeight: originalHeight, + blurhash: blurhash, ); } diff --git a/lib/utils/custom_scroll_behaviour.dart b/lib/utils/custom_scroll_behaviour.dart index 8472111547..ba25e95649 100644 --- a/lib/utils/custom_scroll_behaviour.dart +++ b/lib/utils/custom_scroll_behaviour.dart @@ -5,6 +5,6 @@ class CustomScrollBehavior extends MaterialScrollBehavior { @override Set get dragDevices => { PointerDeviceKind.touch, - PointerDeviceKind.mouse, + PointerDeviceKind.trackpad, }; } diff --git a/lib/utils/date_time_extension.dart b/lib/utils/date_time_extension.dart index e37b4f0ef1..92fbee7bfb 100644 --- a/lib/utils/date_time_extension.dart +++ b/lib/utils/date_time_extension.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:intl/intl.dart'; /// Provides extra functionality for formatting the time. extension DateTimeExtension on DateTime { @@ -20,27 +21,16 @@ extension DateTimeExtension on DateTime { return millisecondsSinceEpoch <= other.millisecondsSinceEpoch; } - /// Two message events can belong to the same environment. That means that they - /// don't need to display the time they were sent because they are close - /// enaugh. - static const minutesBetweenEnvironments = 5; - /// Checks if two DateTimes are close enough to belong to the same /// environment. - bool sameEnvironment(DateTime prevTime) { - return millisecondsSinceEpoch - prevTime.millisecondsSinceEpoch < - 1000 * 60 * minutesBetweenEnvironments; - } + bool sameEnvironment(DateTime prevTime) => + difference(prevTime) < const Duration(hours: 1); /// Returns a simple time String. - /// TODO: Add localization - String localizedTimeOfDay(BuildContext context) { - if (MediaQuery.of(context).alwaysUse24HourFormat) { - return '${_z(hour)}:${_z(minute)}'; - } else { - return '${_z(hour % 12 == 0 ? 12 : hour % 12)}:${_z(minute)} ${hour > 11 ? "pm" : "am"}'; - } - } + String localizedTimeOfDay(BuildContext context) => + L10n.of(context).alwaysUse24HourFormat == 'true' + ? DateFormat('HH:mm', L10n.of(context).localeName).format(this) + : DateFormat('h:mm a', L10n.of(context).localeName).format(this); /// Returns [localizedTimeOfDay()] if the ChatTime is today, the name of the week /// day if the ChatTime is this week and a date string else. @@ -59,28 +49,14 @@ extension DateTimeExtension on DateTime { if (sameDay) { return localizedTimeOfDay(context); } else if (sameWeek) { - switch (weekday) { - case 1: - return L10n.of(context)!.monday; - case 2: - return L10n.of(context)!.tuesday; - case 3: - return L10n.of(context)!.wednesday; - case 4: - return L10n.of(context)!.thursday; - case 5: - return L10n.of(context)!.friday; - case 6: - return L10n.of(context)!.saturday; - case 7: - return L10n.of(context)!.sunday; - } + return DateFormat.E(Localizations.localeOf(context).languageCode) + .format(this); } else if (sameYear) { - return L10n.of(context)!.dateWithoutYear( - month.toString().padLeft(2, '0'), day.toString().padLeft(2, '0')); + return DateFormat.MMMd(Localizations.localeOf(context).languageCode) + .format(this); } - return L10n.of(context)!.dateWithYear(year.toString(), - month.toString().padLeft(2, '0'), day.toString().padLeft(2, '0')); + return DateFormat.yMMMd(Localizations.localeOf(context).languageCode) + .format(this); } /// If the DateTime is today, this returns [localizedTimeOfDay()], if not it also @@ -94,9 +70,9 @@ extension DateTimeExtension on DateTime { final sameDay = sameYear && now.month == month && now.day == day; if (sameDay) return localizedTimeOfDay(context); - return L10n.of(context)!.dateAndTimeOfDay( - localizedTimeShort(context), localizedTimeOfDay(context)); + return L10n.of(context).dateAndTimeOfDay( + localizedTimeShort(context), + localizedTimeOfDay(context), + ); } - - static String _z(int i) => i < 10 ? '0${i.toString()}' : i.toString(); } diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart new file mode 100644 index 0000000000..7690e4370c --- /dev/null +++ b/lib/utils/error_reporter.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_highlighter/flutter_highlighter.dart'; +import 'package:flutter_highlighter/themes/shades-of-purple.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +class ErrorReporter { + final BuildContext context; + final String? message; + + const ErrorReporter(this.context, [this.message]); + + void onErrorCallback(Object error, [StackTrace? stackTrace]) async { + Logs().e(message ?? 'Error caught', error, stackTrace); + final text = '$error\n${stackTrace ?? ''}'; + await showAdaptiveDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text(L10n.of(context).reportErrorDescription), + content: SizedBox( + height: 256, + width: 256, + child: SingleChildScrollView( + child: HighlightView( + text, + language: 'sh', + theme: shadesOfPurpleTheme, + ), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(), + child: Text(L10n.of(context).close), + ), + AdaptiveDialogAction( + onPressed: () => Clipboard.setData( + ClipboardData(text: text), + ), + child: Text(L10n.of(context).copy), + ), + AdaptiveDialogAction( + onPressed: () => launchUrl( + AppConfig.newIssueUrl.resolveUri( + Uri( + queryParameters: { + 'template': 'bug_report.yaml', + 'title': '[BUG]: ${message ?? error.toString()}', + }, + ), + ), + mode: LaunchMode.externalApplication, + ), + child: Text(L10n.of(context).report), + ), + ], + ), + ); + } +} diff --git a/lib/utils/famedlysdk_store.dart b/lib/utils/famedlysdk_store.dart deleted file mode 100644 index 2f16b5963c..0000000000 --- a/lib/utils/famedlysdk_store.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:core'; - -import 'package:shared_preferences/shared_preferences.dart'; - -class Store { - SharedPreferences? _prefs; - - Future _setupLocalStorage() async { - _prefs ??= await SharedPreferences.getInstance(); - } - - Future getItem(String key) async { - await _setupLocalStorage(); - return _prefs!.getString(key); - } - - Future getItemBool(String key, [bool? defaultValue]) async { - await _setupLocalStorage(); - return _prefs!.getBool(key) ?? defaultValue ?? true; - } - - Future setItem(String key, String? value) async { - await _setupLocalStorage(); - if (value == null) { - await _prefs!.remove(key); - return; - } - await _prefs!.setString(key, value); - return; - } - - Future setItemBool(String key, bool value) async { - await _setupLocalStorage(); - await _prefs!.setBool(key, value); - return; - } - - Future deleteItem(String key) async { - await _setupLocalStorage(); - await _prefs!.remove(key); - return; - } -} diff --git a/lib/utils/file_selector.dart b/lib/utils/file_selector.dart new file mode 100644 index 0000000000..f528f2cfd3 --- /dev/null +++ b/lib/utils/file_selector.dart @@ -0,0 +1,80 @@ +import 'package:flutter/widgets.dart'; + +import 'package:file_picker/file_picker.dart'; +import 'package:file_selector/file_selector.dart'; + +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; + +Future> selectFiles( + BuildContext context, { + String? title, + FileSelectorType type = FileSelectorType.any, + bool allowMultiple = false, +}) async { + if (!PlatformInfos.isLinux) { + final result = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + compressionQuality: 0, + allowMultiple: allowMultiple, + type: type.filePickerType, + allowedExtensions: type.extensions, + ), + ); + return result?.xFiles ?? []; + } + + if (allowMultiple) { + return await AppLock.of(context).pauseWhile( + openFiles( + confirmButtonText: title, + acceptedTypeGroups: type.groups, + ), + ); + } + final file = await AppLock.of(context).pauseWhile( + openFile( + confirmButtonText: title, + acceptedTypeGroups: type.groups, + ), + ); + if (file == null) return []; + return [file]; +} + +enum FileSelectorType { + any([], FileType.any, null), + images( + [ + XTypeGroup( + label: 'JPG', + extensions: ['jpg', 'JPG', 'jpeg', 'JPEG'], + ), + XTypeGroup( + label: 'PNGs', + extensions: ['png', 'PNG'], + ), + XTypeGroup( + label: 'WEBP', + extensions: ['WebP', 'WEBP'], + ), + ], + FileType.image, + null, + ), + zip( + [ + XTypeGroup( + label: 'ZIP', + extensions: ['zip', 'ZIP'], + ), + ], + FileType.custom, + ['zip', 'ZIP'], + ); + + const FileSelectorType(this.groups, this.filePickerType, this.extensions); + final List groups; + final FileType filePickerType; + final List? extensions; +} diff --git a/lib/utils/fluffy_share.dart b/lib/utils/fluffy_share.dart index 630803b3e0..4fd7967c57 100644 --- a/lib/utils/fluffy_share.dart +++ b/lib/utils/fluffy_share.dart @@ -5,21 +5,40 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:share_plus/share_plus.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import '../widgets/matrix.dart'; abstract class FluffyShare { - static Future share(String text, BuildContext context) async { - if (PlatformInfos.isMobile) { + static Future share( + String text, + BuildContext context, { + bool copyOnly = false, + }) async { + if (PlatformInfos.isMobile && !copyOnly) { final box = context.findRenderObject() as RenderBox; - return Share.share( + await Share.share( text, sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, ); + return; } await Clipboard.setData( ClipboardData(text: text), ); ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.copiedToClipboard))); + SnackBar(content: Text(L10n.of(context).copiedToClipboard)), + ); return; } + + static Future shareInviteLink(BuildContext context) async { + final client = Matrix.of(context).client; + final ownProfile = await client.fetchOwnProfile(); + await FluffyShare.share( + L10n.of(context).inviteText( + ownProfile.displayName ?? client.userID!, + 'https://matrix.to/#/${client.userID}?client=im.fluffychat', + ), + context, + ); + } } diff --git a/lib/utils/get_client_secret.dart b/lib/utils/get_client_secret.dart deleted file mode 100644 index d86cd388ea..0000000000 --- a/lib/utils/get_client_secret.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'dart:math'; - -const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890'; -Random _rnd = Random(); - -String getClientSecret(int length) => String.fromCharCodes(Iterable.generate( - length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length)))); diff --git a/lib/utils/init_with_restore.dart b/lib/utils/init_with_restore.dart new file mode 100644 index 0000000000..5870e4b11a --- /dev/null +++ b/lib/utils/init_with_restore.dart @@ -0,0 +1,148 @@ +import 'dart:convert'; +import 'dart:ui'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +class SessionBackup { + final String? olmAccount; + final String accessToken; + final String userId; + final String homeserver; + final String? deviceId; + final String? deviceName; + + const SessionBackup({ + required this.olmAccount, + required this.accessToken, + required this.userId, + required this.homeserver, + required this.deviceId, + this.deviceName, + }); + + factory SessionBackup.fromJsonString(String json) => + SessionBackup.fromJson(jsonDecode(json)); + + factory SessionBackup.fromJson(Map json) => SessionBackup( + olmAccount: json['olm_account'], + accessToken: json['access_token'], + userId: json['user_id'], + homeserver: json['homeserver'], + deviceId: json['device_id'], + deviceName: json['device_name'], + ); + + Map toJson() => { + 'olm_account': olmAccount, + 'access_token': accessToken, + 'user_id': userId, + 'homeserver': homeserver, + 'device_id': deviceId, + if (deviceName != null) 'device_name': deviceName, + }; + + @override + String toString() => jsonEncode(toJson()); +} + +extension InitWithRestoreExtension on Client { + static Future deleteSessionBackup(String clientName) async { + final storage = PlatformInfos.isMobile || PlatformInfos.isLinux + ? const FlutterSecureStorage() + : null; + await storage?.delete( + key: '${AppConfig.applicationName}_session_backup_$clientName', + ); + } + + Future initWithRestore({void Function()? onMigration}) async { + final storageKey = + '${AppConfig.applicationName}_session_backup_$clientName'; + final storage = PlatformInfos.isMobile || PlatformInfos.isLinux + ? const FlutterSecureStorage() + : null; + + try { + await init( + onInitStateChanged: (state) { + if (state == InitState.migratingDatabase) onMigration?.call(); + }, + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + ); + if (isLogged()) { + final accessToken = this.accessToken; + final homeserver = this.homeserver?.toString(); + final deviceId = deviceID; + final userId = userID; + final hasBackup = accessToken != null && + homeserver != null && + deviceId != null && + userId != null; + assert(hasBackup); + if (hasBackup) { + Logs().v('Store session in backup'); + storage?.write( + key: storageKey, + value: SessionBackup( + olmAccount: encryption?.pickledOlmAccount, + accessToken: accessToken, + deviceId: deviceId, + homeserver: homeserver, + deviceName: deviceName, + userId: userId, + ).toString(), + ); + } + } + } catch (e, s) { + Logs().wtf('Client init failed!', e, s); + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + final sessionBackupString = await storage?.read(key: storageKey); + if (sessionBackupString == null) { + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.sessionLostBody(AppConfig.newIssueUrl.toString(), e.toString()), + ); + rethrow; + } + + try { + final sessionBackup = SessionBackup.fromJsonString(sessionBackupString); + await init( + newToken: sessionBackup.accessToken, + newOlmAccount: sessionBackup.olmAccount, + newDeviceID: sessionBackup.deviceId, + newDeviceName: sessionBackup.deviceName, + newHomeserver: Uri.tryParse(sessionBackup.homeserver), + newUserID: sessionBackup.userId, + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + onInitStateChanged: (state) { + if (state == InitState.migratingDatabase) onMigration?.call(); + }, + ); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.restoreSessionBody( + AppConfig.newIssueUrl.toString(), + e.toString(), + ), + ); + } catch (e, s) { + Logs().wtf('Restore client failed!', e, s); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.sessionLostBody(AppConfig.newIssueUrl.toString(), e.toString()), + ); + rethrow; + } + } + } +} diff --git a/lib/utils/localized_exception_extension.dart b/lib/utils/localized_exception_extension.dart index 16dd7f4f36..d97257d94e 100644 --- a/lib/utils/localized_exception_extension.dart +++ b/lib/utils/localized_exception_extension.dart @@ -1,24 +1,58 @@ import 'dart:io'; +import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:http/http.dart'; +import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'uia_request_manager.dart'; extension LocalizedExceptionExtension on Object { - String toLocalizedString(BuildContext context) { + static String _formatFileSize(int size) { + if (size < 1000) return '$size B'; + final i = (log(size) / log(1000)).floor(); + final num = (size / pow(1000, i)); + final round = num.round(); + final numString = round < 10 + ? num.toStringAsFixed(2) + : round < 100 + ? num.toStringAsFixed(1) + : round.toString(); + return '$numString ${'kMGTPEZY'[i - 1]}B'; + } + + String toLocalizedString( + BuildContext context, [ + ExceptionContext? exceptionContext, + ]) { + if (this is FileTooBigMatrixException) { + final exception = this as FileTooBigMatrixException; + return L10n.of(context).fileIsTooBigForServer( + _formatFileSize(exception.maxFileSize), + ); + } if (this is MatrixException) { switch ((this as MatrixException).error) { case MatrixError.M_FORBIDDEN: - return L10n.of(context)!.noPermission; + if (exceptionContext == ExceptionContext.changePassword) { + return L10n.of(context).passwordIsWrong; + } + return L10n.of(context).noPermission; case MatrixError.M_LIMIT_EXCEEDED: - return L10n.of(context)!.tooManyRequestsWarning; + return L10n.of(context).tooManyRequestsWarning; default: + if (exceptionContext == ExceptionContext.joinRoom) { + return L10n.of(context).unableToJoinChat; + } return (this as MatrixException).errorMessage; } } + if (this is InvalidPassphraseException) { + return L10n.of(context).wrongRecoveryKey; + } if (this is BadServerVersionsException) { final serverVersions = (this as BadServerVersionsException) .serverVersions @@ -30,8 +64,12 @@ extension LocalizedExceptionExtension on Object { .toString() .replaceAll('{', '"') .replaceAll('}', '"'); - return L10n.of(context)! - .badServerVersionsException(serverVersions, supportedVersions); + return L10n.of(context).badServerVersionsException( + serverVersions, + supportedVersions, + serverVersions, + supportedVersions, + ); } if (this is BadServerLoginTypesException) { final serverVersions = (this as BadServerLoginTypesException) @@ -44,15 +82,41 @@ extension LocalizedExceptionExtension on Object { .toString() .replaceAll('{', '"') .replaceAll('}', '"'); - return L10n.of(context)! - .badServerLoginTypesException(serverVersions, supportedVersions); + return L10n.of(context).badServerLoginTypesException( + serverVersions, + supportedVersions, + supportedVersions, + ); + } + if (this is IOException || + this is SocketException || + this is SyncConnectionException || + this is ClientException) { + return L10n.of(context).noConnectionToTheServer; + } + if (this is FormatException && + exceptionContext == ExceptionContext.checkHomeserver) { + return L10n.of(context).doesNotSeemToBeAValidHomeserver; } - if (this is MatrixConnectionException || this is SocketException) { - return L10n.of(context)!.noConnectionToTheServer; + if (this is FormatException && + exceptionContext == ExceptionContext.checkServerSupportInfo) { + return L10n.of(context).noContactInformationProvided; } if (this is String) return toString(); if (this is UiaException) return toString(); + + if (exceptionContext == ExceptionContext.joinRoom) { + return L10n.of(context).unableToJoinChat; + } + Logs().w('Something went wrong: ', this); - return L10n.of(context)!.oopsSomethingWentWrong; + return L10n.of(context).oopsSomethingWentWrong; } } + +enum ExceptionContext { + changePassword, + checkHomeserver, + checkServerSupportInfo, + joinRoom, +} diff --git a/lib/utils/markdown_context_builder.dart b/lib/utils/markdown_context_builder.dart new file mode 100644 index 0000000000..ce649488e2 --- /dev/null +++ b/lib/utils/markdown_context_builder.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; + +Widget markdownContextBuilder( + BuildContext context, + EditableTextState editableTextState, + TextEditingController controller, +) { + final value = editableTextState.textEditingValue; + final selectedText = value.selection.textInside(value.text); + final buttonItems = editableTextState.contextMenuButtonItems; + final l10n = L10n.of(context); + + return AdaptiveTextSelectionToolbar.buttonItems( + anchors: editableTextState.contextMenuAnchors, + buttonItems: [ + ...buttonItems, + if (selectedText.isNotEmpty) ...[ + ContextMenuButtonItem( + label: l10n.link, + onPressed: () async { + final input = await showTextInputDialog( + context: context, + title: l10n.addLink, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + validator: (text) { + if (text.isEmpty) { + return l10n.pleaseFillOut; + } + try { + text.startsWith('http') ? Uri.parse(text) : Uri.https(text); + } catch (_) { + return l10n.invalidUrl; + } + return null; + }, + hintText: 'www...', + keyboardType: TextInputType.url, + ); + final urlString = input; + if (urlString == null) return; + final url = urlString.startsWith('http') + ? Uri.parse(urlString) + : Uri.https(urlString); + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '[$selectedText](${url.toString()})', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.boldText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '**$selectedText**', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.italicText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '*$selectedText*', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.strikeThrough, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '~~$selectedText~~', + ); + ContextMenuController.removeAny(); + }, + ), + ], + ], + ); +} diff --git a/lib/utils/matrix_sdk_extensions.dart/client_presence_extension.dart b/lib/utils/matrix_sdk_extensions.dart/client_presence_extension.dart deleted file mode 100644 index e9d06794bc..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/client_presence_extension.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:matrix/matrix.dart'; - -extension ClientPresenceExtension on Client { - List get contactList { - final directChatsMxid = rooms - .where((r) => r.isDirectChat) - .map((r) => r.directChatMatrixID) - .toSet(); - final contactList = directChatsMxid - .map( - (mxid) => - presences[mxid] ?? - CachedPresence( - PresenceType.offline, - 0, - null, - false, - mxid ?? '', - ), - ) - .toList(); - - contactList.sort((a, b) => a.userid.compareTo(b.userid)); - contactList.sort((a, b) => ((a.lastActiveTimestamp ?? - DateTime.fromMillisecondsSinceEpoch(0)) - .compareTo( - b.lastActiveTimestamp ?? DateTime.fromMillisecondsSinceEpoch(0)))); - return contactList; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/client_stories_extension.dart b/lib/utils/matrix_sdk_extensions.dart/client_stories_extension.dart deleted file mode 100644 index 269de73c87..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/client_stories_extension.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:matrix/matrix.dart'; - -extension ClientStoriesExtension on Client { - static const String storiesRoomType = 'msc3588.stories.stories-room'; - static const String storiesBlockListType = 'msc3588.stories.block-list'; - - static const int lifeTimeInHours = 24; - static const int maxPostsPerStory = 20; - - List get contacts => rooms - .where((room) => room.isDirectChat) - .map((room) => - room.unsafeGetUserFromMemoryOrFallback(room.directChatMatrixID!)) - .toList(); - - List get storiesRooms => rooms - .where((room) => - room - .getState(EventTypes.RoomCreate) - ?.content - .tryGet('type') == - storiesRoomType) - .toList(); - - Future> getUndecidedContactsForStories(Room? storiesRoom) async { - if (storiesRoom == null) return contacts; - final invitedContacts = - (await storiesRoom.requestParticipants()).map((user) => user.id); - final decidedContacts = storiesBlockList.toSet()..addAll(invitedContacts); - return contacts - .where((contact) => !decidedContacts.contains(contact.id)) - .toList(); - } - - List get storiesBlockList => - accountData[storiesBlockListType]?.content.tryGetList('users') ?? - []; - - Future setStoriesBlockList(List users) => setAccountData( - userID!, - storiesBlockListType, - {'users': users}, - ); - - Future createStoriesRoom([List? invite]) async { - final roomId = await createRoom( - creationContent: {"type": "msc3588.stories.stories-room"}, - preset: CreateRoomPreset.privateChat, - powerLevelContentOverride: {"events_default": 100}, - name: 'Stories from ${userID!.localpart}', - topic: - 'This is a room for stories sharing, not unlike the similarly named features in other messaging networks. For best experience please use FluffyChat or minesTrix. Feature development can be followed on: https://github.com/matrix-org/matrix-doc/pull/3588', - initialState: [ - StateEvent( - type: EventTypes.Encryption, - stateKey: '', - content: { - 'algorithm': 'm.megolm.v1.aes-sha2', - }, - ), - StateEvent( - type: 'm.room.retention', - stateKey: '', - content: { - 'min_lifetime': 86400000, - 'max_lifetime': 86400000, - }, - ), - ], - invite: invite, - ); - if (getRoomById(roomId) == null) { - // Wait for room actually appears in sync - await onSync.stream - .firstWhere((sync) => sync.rooms?.join?.containsKey(roomId) ?? false); - } - return getRoomById(roomId)!; - } - - Future getStoriesRoom(BuildContext context) async { - final candidates = rooms.where((room) => - room.getState(EventTypes.RoomCreate)?.content.tryGet('type') == - storiesRoomType && - room.ownPowerLevel >= 100); - if (candidates.isEmpty) return null; - if (candidates.length == 1) return candidates.single; - return await showModalActionSheet( - context: context, - actions: candidates - .map( - (room) => SheetAction(label: room.displayname, key: room), - ) - .toList()); - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/event_extension.dart b/lib/utils/matrix_sdk_extensions.dart/event_extension.dart deleted file mode 100644 index b6796a40e8..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/event_extension.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -import 'matrix_file_extension.dart'; - -extension LocalizedBody on Event { - Future> _getFile(BuildContext context) => - showFutureLoadingDialog( - context: context, - future: () => downloadAndDecryptAttachmentCached(), - ); - - void saveFile(BuildContext context) async { - final matrixFile = await _getFile(context); - - matrixFile.result?.save(context); - } - - void shareFile(BuildContext context) async { - final matrixFile = await _getFile(context); - - matrixFile.result?.share(context); - } - - bool get isAttachmentSmallEnough => - infoMap['size'] is int && - infoMap['size'] < room.client.database!.maxFileSize; - - bool get isThumbnailSmallEnough => - thumbnailInfoMap['size'] is int && - thumbnailInfoMap['size'] < room.client.database!.maxFileSize; - - bool get showThumbnail => - [MessageTypes.Image, MessageTypes.Sticker, MessageTypes.Video] - .contains(messageType) && - (kIsWeb || - isAttachmentSmallEnough || - isThumbnailSmallEnough || - (content['url'] is String)); - - String? get sizeString { - if (content['info'] is Map && - content['info'].containsKey('size')) { - num size = content['info']['size']; - if (size < 1000000) { - size = size / 1000; - size = (size * 10).round() / 10; - return '${size.toString()} KB'; - } else if (size < 1000000000) { - size = size / 1000000; - size = (size * 10).round() / 10; - return '${size.toString()} MB'; - } else { - size = size / 1000000000; - size = (size * 10).round() / 10; - return '${size.toString()} GB'; - } - } else { - return null; - } - } - - static final _downloadAndDecryptFutures = >{}; - - Future isAttachmentCached({bool getThumbnail = false}) async { - final mxcUrl = attachmentOrThumbnailMxcUrl(getThumbnail: getThumbnail); - if (mxcUrl == null) return false; - // check if we have it in-memory - if (_downloadAndDecryptFutures.containsKey(mxcUrl)) { - return true; - } - // check if it is stored - if (await isAttachmentInLocalStore(getThumbnail: getThumbnail)) { - return true; - } - // check if the url is cached - final url = mxcUrl.getDownloadLink(room.client); - final file = await DefaultCacheManager().getFileFromCache(url.toString()); - return file != null; - } - - Future downloadAndDecryptAttachmentCached( - {bool getThumbnail = false}) async { - final mxcUrl = - attachmentOrThumbnailMxcUrl(getThumbnail: getThumbnail)?.toString() ?? - eventId; - _downloadAndDecryptFutures[mxcUrl] ??= downloadAndDecryptAttachment( - getThumbnail: getThumbnail, - downloadCallback: (Uri url) async { - final file = await DefaultCacheManager().getSingleFile(url.toString()); - return await file.readAsBytes(); - }, - ); - final res = await _downloadAndDecryptFutures[mxcUrl]; - return res; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart deleted file mode 100644 index 565a07a90b..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:matrix/matrix.dart'; - -import '../../config/app_config.dart'; - -extension FilteredTimelineExtension on Timeline { - List getFilteredEvents({Set unfolded = const {}}) { - final filteredEvents = events - .where((e) => - // always filter out edit and reaction relationships - !{RelationshipTypes.edit, RelationshipTypes.reaction} - .contains(e.relationshipType) && - // always filter out m.key.* events - !e.type.startsWith('m.key.verification.') && - // event types to hide: redaction and reaction events - // if a reaction has been redacted we also want it to be hidden in the timeline - !{EventTypes.Reaction, EventTypes.Redaction}.contains(e.type) && - // if we enabled to hide all redacted events, don't show those - (!AppConfig.hideRedactedEvents || !e.redacted) && - // if we enabled to hide all unknown events, don't show those - (!AppConfig.hideUnknownEvents || e.isEventTypeKnown) && - // remove state events that we don't want to render - (e.isState || !AppConfig.hideAllStateEvents)) - .toList(); - - // Fold state events - var counter = 0; - for (var i = filteredEvents.length - 1; i >= 0; i--) { - if (!filteredEvents[i].isState) continue; - if (i > 0 && - filteredEvents[i - 1].isState && - !unfolded.contains(filteredEvents[i - 1].eventId)) { - counter++; - filteredEvents[i].unsigned ??= {}; - filteredEvents[i].unsigned!['im.fluffychat.collapsed_state_event'] = - true; - } else { - filteredEvents[i].unsigned!['im.fluffychat.collapsed_state_event'] = - false; - filteredEvents[i] - .unsigned!['im.fluffychat.collapsed_state_event_count'] = counter; - counter = 0; - } - } - return filteredEvents; - } -} - -extension IsStateExtension on Event { - bool get isState => !{ - EventTypes.Message, - EventTypes.Sticker, - EventTypes.Encrypted - }.contains(type); -} diff --git a/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart b/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart deleted file mode 100644 index c2e938fd36..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:flutter/foundation.dart' hide Key; -import 'package:flutter/services.dart'; - -import 'package:fluffybox/hive.dart' as fluffybox; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:hive_flutter/hive_flutter.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; - -import '../client_manager.dart'; -import '../famedlysdk_store.dart'; - -// ignore: deprecated_member_use -class FlutterFluffyBoxDatabase extends FluffyBoxDatabase { - FlutterFluffyBoxDatabase( - String name, - String path, { - fluffybox.HiveCipher? key, - }) : super( - name, - path, - key: key, - ); - - static const String _cipherStorageKey = 'database_encryption_key'; - - // ignore: deprecated_member_use - static Future databaseBuilder(Client client) async { - Logs().d('Open FluffyBox...'); - fluffybox.HiveAesCipher? hiverCipher; - try { - // Workaround for secure storage is calling Platform.operatingSystem on web - if (kIsWeb) throw MissingPluginException(); - - const secureStorage = FlutterSecureStorage(); - final containsEncryptionKey = - await secureStorage.containsKey(key: _cipherStorageKey); - if (!containsEncryptionKey) { - // do not try to create a buggy secure storage for new Linux users - if (Platform.isLinux) throw MissingPluginException(); - final key = Hive.generateSecureKey(); - await secureStorage.write( - key: _cipherStorageKey, - value: base64UrlEncode(key), - ); - } - - // workaround for if we just wrote to the key and it still doesn't exist - final rawEncryptionKey = await secureStorage.read(key: _cipherStorageKey); - if (rawEncryptionKey == null) throw MissingPluginException(); - - hiverCipher = fluffybox.HiveAesCipher(base64Url.decode(rawEncryptionKey)); - } on MissingPluginException catch (_) { - Logs().i('FluffyBox encryption is not supported on this platform'); - } catch (_) { - const FlutterSecureStorage().delete(key: _cipherStorageKey); - rethrow; - } - - // ignore: deprecated_member_use - final db = FluffyBoxDatabase( - 'fluffybox_${client.clientName.replaceAll(' ', '_').toLowerCase()}', - await _findDatabasePath(client), - key: hiverCipher, - ); - try { - await db.open(); - } catch (_) { - Logs().w('Unable to open FluffyBox. Delete database and storage key...'); - await Store().deleteItem(ClientManager.clientNamespace); - const FlutterSecureStorage().delete(key: _cipherStorageKey); - await db.clear(); - rethrow; - } - Logs().d('FluffyBox is ready'); - return db; - } - - static Future _findDatabasePath(Client client) async { - String path = client.clientName; - if (!kIsWeb) { - Directory directory; - try { - if (Platform.isLinux) { - directory = await getApplicationSupportDirectory(); - } else { - directory = await getApplicationDocumentsDirectory(); - } - } catch (_) { - try { - directory = await getLibraryDirectory(); - } catch (_) { - directory = Directory.current; - } - } - // do not destroy your stable FluffyChat in debug mode - if (kDebugMode) { - directory = Directory(directory.uri.resolve('debug').toFilePath()); - directory.create(recursive: true); - } - path = directory.path; - } - return path; - } - - @override - int get maxFileSize => supportsFileStoring ? 100 * 1024 * 1024 : 0; - @override - bool get supportsFileStoring => !kIsWeb; - - Future _getFileStoreDirectory() async { - try { - try { - return (await getApplicationSupportDirectory()).path; - } catch (_) { - return (await getApplicationDocumentsDirectory()).path; - } - } catch (_) { - return (await getDownloadsDirectory())!.path; - } - } - - @override - Future getFile(Uri mxcUri) async { - if (!supportsFileStoring) return null; - final tempDirectory = await _getFileStoreDirectory(); - final file = - File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); - if (await file.exists() == false) return null; - final bytes = await file.readAsBytes(); - return bytes; - } - - @override - Future storeFile(Uri mxcUri, Uint8List bytes, int time) async { - if (!supportsFileStoring) return null; - final tempDirectory = await _getFileStoreDirectory(); - final file = - File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); - if (await file.exists()) return; - await file.writeAsBytes(bytes); - return; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart b/lib/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart deleted file mode 100644 index 6c2e4d1205..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter_app_badger/flutter_app_badger.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; - -extension IosBadgeClientExtension on Client { - void updateIosBadge() { - if (PlatformInfos.isIOS) { - // Workaround for iOS not clearing notifications with fcm_shared_isolate - if (!rooms.any((r) => - r.membership == Membership.invite || (r.notificationCount > 0))) { - // ignore: unawaited_futures - FlutterLocalNotificationsPlugin().cancelAll(); - FlutterAppBadger.removeBadge(); - } - } - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart deleted file mode 100644 index 17ebd33910..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:share_plus/share_plus.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; - -extension MatrixFileExtension on MatrixFile { - void save(BuildContext context) async { - if (PlatformInfos.isIOS) { - return share(context); - } - final fileName = name.split('/').last; - - final file = FilePickerCross(bytes); - await file.exportToStorage(fileName: fileName, share: false); - } - - void share(BuildContext context) async { - final fileName = name.split('/').last; - final tmpDirectory = await getTemporaryDirectory(); - final path = '${tmpDirectory.path}$fileName'; - await File(path).writeAsBytes(bytes); - final box = context.findRenderObject() as RenderBox; - await Share.shareFiles( - [path], - sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, - ); - return; - } - - MatrixFile get detectFileType { - if (msgType == MessageTypes.Image) { - return MatrixImageFile(bytes: bytes, name: name); - } - if (msgType == MessageTypes.Video) { - return MatrixVideoFile(bytes: bytes, name: name); - } - if (msgType == MessageTypes.Audio) { - return MatrixAudioFile(bytes: bytes, name: name); - } - return this; - } - - String get sizeString { - var size = this.size.toDouble(); - if (size < 1000000) { - size = size / 1000; - size = (size * 10).round() / 10; - return '${size.toString()} KB'; - } else if (size < 1000000000) { - size = size / 1000000; - size = (size * 10).round() / 10; - return '${size.toString()} MB'; - } else { - size = size / 1000000000; - size = (size * 10).round() / 10; - return '${size.toString()} GB'; - } - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/presence_extension.dart b/lib/utils/matrix_sdk_extensions.dart/presence_extension.dart deleted file mode 100644 index bb6e1069ed..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/presence_extension.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import '../date_time_extension.dart'; - -extension PresenceExtension on CachedPresence { - String getLocalizedLastActiveAgo(BuildContext context) { - final lastActiveTimestamp = this.lastActiveTimestamp; - if (lastActiveTimestamp != null) { - return L10n.of(context)! - .lastActiveAgo(lastActiveTimestamp.localizedTimeShort(context)); - } - return L10n.of(context)!.lastSeenLongTimeAgo; - } - - String getLocalizedStatusMessage(BuildContext context) { - final statusMsg = this.statusMsg; - if (statusMsg != null && statusMsg.isNotEmpty) { - return statusMsg; - } - if (currentlyActive ?? false) { - return L10n.of(context)!.currentlyActive; - } - return getLocalizedLastActiveAgo(context); - } - - Color get color { - switch (presence) { - case PresenceType.online: - return Colors.green; - case PresenceType.offline: - return Colors.grey; - case PresenceType.unavailable: - default: - return Colors.red; - } - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/device_extension.dart b/lib/utils/matrix_sdk_extensions/device_extension.dart similarity index 100% rename from lib/utils/matrix_sdk_extensions.dart/device_extension.dart rename to lib/utils/matrix_sdk_extensions/device_extension.dart diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart new file mode 100644 index 0000000000..2eb5473d80 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -0,0 +1,53 @@ +import 'dart:developer'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:async/async.dart' as async; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'matrix_file_extension.dart'; + +extension LocalizedBody on Event { + Future> _getFile(BuildContext context) => + showFutureLoadingDialog( + context: context, + future: downloadAndDecryptAttachment, + ); + + void saveFile(BuildContext context) async { + final matrixFile = await _getFile(context); + + matrixFile.result?.save(context); + } + + void shareFile(BuildContext context) async { + final matrixFile = await _getFile(context); + inspect(matrixFile); + + matrixFile.result?.share(context); + } + + bool get isAttachmentSmallEnough => + infoMap['size'] is int && + infoMap['size'] < room.client.database!.maxFileSize; + + bool get isThumbnailSmallEnough => + thumbnailInfoMap['size'] is int && + thumbnailInfoMap['size'] < room.client.database!.maxFileSize; + + bool get showThumbnail => + [MessageTypes.Image, MessageTypes.Sticker, MessageTypes.Video] + .contains(messageType) && + (kIsWeb || + isAttachmentSmallEnough || + isThumbnailSmallEnough || + (content['url'] is String)); + + String? get sizeString => content + .tryGetMap('info') + ?.tryGet('size') + ?.sizeString; +} diff --git a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart new file mode 100644 index 0000000000..cd9d223ee3 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart @@ -0,0 +1,63 @@ +import 'package:matrix/matrix.dart'; + +import '../../config/app_config.dart'; + +extension VisibleInGuiExtension on List { + List filterByVisibleInGui({String? exceptionEventId}) { + final visibleEvents = + where((e) => e.isVisibleInGui || e.eventId == exceptionEventId) + .toList(); + + // Hide creation state events: + if (visibleEvents.isNotEmpty && + visibleEvents.last.type == EventTypes.RoomCreate) { + var i = visibleEvents.length - 2; + while (i > 0) { + final event = visibleEvents[i]; + if (!event.isState) break; + if (event.type == EventTypes.Encryption) { + i--; + continue; + } + if (event.type == EventTypes.RoomMember && + event.roomMemberChangeType == RoomMemberChangeType.acceptInvite) { + i--; + continue; + } + visibleEvents.removeAt(i); + i--; + } + } + return visibleEvents; + } +} + +extension IsStateExtension on Event { + bool get isVisibleInGui => + // always filter out edit and reaction relationships + !{RelationshipTypes.edit, RelationshipTypes.reaction} + .contains(relationshipType) && + // always filter out m.key.* events + !type.startsWith('m.key.verification.') && + // event types to hide: redaction and reaction events + // if a reaction has been redacted we also want it to be hidden in the timeline + !{EventTypes.Reaction, EventTypes.Redaction}.contains(type) && + // if we enabled to hide all redacted events, don't show those + (!AppConfig.hideRedactedEvents || !redacted) && + // if we enabled to hide all unknown events, don't show those + (!AppConfig.hideUnknownEvents || isEventTypeKnown) && + // remove state events that we don't want to render + (isState || !AppConfig.hideAllStateEvents) && + // hide simple join/leave member events in public rooms + (!AppConfig.hideUnimportantStateEvents || + type != EventTypes.RoomMember || + room.joinRules != JoinRules.public || + content.tryGet('membership') == 'ban' || + stateKey != senderId); + + bool get isState => !{ + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + }.contains(type); +} diff --git a/lib/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart b/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart similarity index 73% rename from lib/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart rename to lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart index 0f77567273..9ad5ce5c05 100644 --- a/lib/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart @@ -1,6 +1,5 @@ import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; import 'package:flutter/foundation.dart' hide Key; import 'package:flutter/services.dart'; @@ -9,31 +8,34 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:hive/hive.dart'; import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:universal_html/html.dart' as html; +// ignore: deprecated_member_use class FlutterHiveCollectionsDatabase extends HiveCollectionsDatabase { FlutterHiveCollectionsDatabase( - String name, - String path, { - HiveCipher? key, - }) : super( - name, - path, - key: key, - ); + super.name, + String super.path, { + super.key, + }); - static const String _cipherStorageKey = 'database_encryption_key'; + static const String _cipherStorageKey = 'hive_encryption_key'; static Future databaseBuilder( - Client client) async { + Client client, + ) async { Logs().d('Open Hive...'); HiveAesCipher? hiverCipher; try { // Workaround for secure storage is calling Platform.operatingSystem on web - if (kIsWeb) throw MissingPluginException(); + if (kIsWeb) { + // ignore: unawaited_futures + html.window.navigator.storage?.persist(); + throw MissingPluginException(); + } const secureStorage = FlutterSecureStorage(); final containsEncryptionKey = - await secureStorage.containsKey(key: _cipherStorageKey); + await secureStorage.read(key: _cipherStorageKey) != null; if (!containsEncryptionKey) { // do not try to create a buggy secure storage for new Linux users if (Platform.isLinux) throw MissingPluginException(); @@ -50,31 +52,37 @@ class FlutterHiveCollectionsDatabase extends HiveCollectionsDatabase { hiverCipher = HiveAesCipher(base64Url.decode(rawEncryptionKey)); } on MissingPluginException catch (_) { + const FlutterSecureStorage() + .delete(key: _cipherStorageKey) + .catchError((_) {}); Logs().i('Hive encryption is not supported on this platform'); - } catch (_) { - const FlutterSecureStorage().delete(key: _cipherStorageKey); - rethrow; + } catch (e, s) { + const FlutterSecureStorage() + .delete(key: _cipherStorageKey) + .catchError((_) {}); + Logs().w('Unable to init Hive encryption', e, s); } final db = FlutterHiveCollectionsDatabase( 'hive_collections_${client.clientName.replaceAll(' ', '_').toLowerCase()}', - await _findDatabasePath(client), + await findDatabasePath(client), key: hiverCipher, ); try { await db.open(); - } catch (_) { - Logs().w('Unable to open Hive. Delete database and storage key...'); + } catch (e, s) { + Logs().w('Unable to open Hive. Delete database and storage key...', e, s); const FlutterSecureStorage().delete(key: _cipherStorageKey); - await db.clear(); + await db.clear().catchError((_) {}); + await Hive.deleteFromDisk(); rethrow; } Logs().d('Hive is ready'); return db; } - static Future _findDatabasePath(Client client) async { - String path = client.clientName; + static Future findDatabasePath(Client client) async { + var path = client.clientName; if (!kIsWeb) { Directory directory; try { @@ -91,24 +99,24 @@ class FlutterHiveCollectionsDatabase extends HiveCollectionsDatabase { } } // do not destroy your stable FluffyChat in debug mode - if (kDebugMode) { - directory = Directory(directory.uri.resolve('debug').toFilePath()); - directory.create(recursive: true); - } + directory = Directory( + directory.uri.resolve(kDebugMode ? 'hive_debug' : 'hive').toFilePath(), + ); + directory.create(recursive: true); path = directory.path; } return path; } @override - int get maxFileSize => supportsFileStoring ? 100 * 1024 * 1024 : 0; + int get maxFileSize => supportsFileStoring ? 100 * 1000 * 1000 : 0; @override bool get supportsFileStoring => !kIsWeb; Future _getFileStoreDirectory() async { try { try { - return (await getApplicationSupportDirectory()).path; + return (await getTemporaryDirectory()).path; } catch (_) { return (await getApplicationDocumentsDirectory()).path; } diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart new file mode 100644 index 0000000000..0919b607f5 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -0,0 +1,151 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'cipher.dart'; + +import 'sqlcipher_stub.dart' + if (dart.library.io) 'package:sqlcipher_flutter_libs/sqlcipher_flutter_libs.dart'; + +Future flutterMatrixSdkDatabaseBuilder(Client client) async { + MatrixSdkDatabase? database; + try { + database = await _constructDatabase(client); + await database.open(); + return database; + } catch (e, s) { + Logs().wtf('Unable to construct database!', e, s); + // Try to delete database so that it can created again on next init: + database?.delete().catchError( + (e, s) => Logs().wtf( + 'Unable to delete database, after failed construction', + e, + s, + ), + ); + + // Delete database file: + if (database == null && !kIsWeb) { + final dbFile = File(await _getDatabasePath(client.clientName)); + if (await dbFile.exists()) await dbFile.delete(); + } + + try { + // Send error notification: + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.databaseBuildErrorBody( + AppConfig.newIssueUrl.toString(), + e.toString(), + ), + ); + } catch (e, s) { + Logs().e('Unable to send error notification', e, s); + } + + return FlutterHiveCollectionsDatabase.databaseBuilder(client); + } +} + +Future _constructDatabase(Client client) async { + if (kIsWeb) { + html.window.navigator.storage?.persist(); + return MatrixSdkDatabase(client.clientName); + } + + final cipher = await getDatabaseCipher(); + + Directory? fileStorageLocation; + try { + fileStorageLocation = await getTemporaryDirectory(); + } on MissingPlatformDirectoryException catch (_) { + Logs().w( + 'No temporary directory for file cache available on this platform.', + ); + } + + final path = await _getDatabasePath(client.clientName); + + // fix dlopen for old Android + await applyWorkaroundToOpenSqlCipherOnOldAndroidVersions(); + // import the SQLite / SQLCipher shared objects / dynamic libraries + final factory = + createDatabaseFactoryFfi(ffiInit: SQfLiteEncryptionHelper.ffiInit); + + // migrate from potential previous SQLite database path to current one + await _migrateLegacyLocation(path, client.clientName); + + // required for [getDatabasesPath] + databaseFactory = factory; + + // in case we got a cipher, we use the encryption helper + // to manage SQLite encryption + final helper = cipher == null + ? null + : SQfLiteEncryptionHelper( + factory: factory, + path: path, + cipher: cipher, + ); + + // check whether the DB is already encrypted and otherwise do so + await helper?.ensureDatabaseFileEncrypted(); + + final database = await factory.openDatabase( + path, + options: OpenDatabaseOptions( + version: 1, + // most important : apply encryption when opening the DB + onConfigure: helper?.applyPragmaKey, + ), + ); + + return MatrixSdkDatabase( + client.clientName, + database: database, + maxFileSize: 1000 * 1000 * 10, + fileStorageLocation: fileStorageLocation?.uri, + deleteFilesAfterDuration: const Duration(days: 30), + ); +} + +Future _getDatabasePath(String clientName) async { + final databaseDirectory = PlatformInfos.isIOS || PlatformInfos.isMacOS + ? await getLibraryDirectory() + : await getApplicationSupportDirectory(); + + return join(databaseDirectory.path, '$clientName.sqlite'); +} + +Future _migrateLegacyLocation( + String sqlFilePath, + String clientName, +) async { + final oldPath = PlatformInfos.isDesktop + ? (await getApplicationSupportDirectory()).path + : await getDatabasesPath(); + + final oldFilePath = join(oldPath, clientName); + if (oldFilePath == sqlFilePath) return; + + final maybeOldFile = File(oldFilePath); + if (await maybeOldFile.exists()) { + Logs().i( + 'Migrate legacy location for database from "$oldFilePath" to "$sqlFilePath"', + ); + await maybeOldFile.copy(sqlFilePath); + await maybeOldFile.delete(); + } +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart new file mode 100644 index 0000000000..021cd46365 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/client_manager.dart'; + +const _passwordStorageKey = 'database_password'; + +Future getDatabaseCipher() async { + String? password; + + try { + const secureStorage = FlutterSecureStorage(); + final containsEncryptionKey = + await secureStorage.read(key: _passwordStorageKey) != null; + if (!containsEncryptionKey) { + final rng = Random.secure(); + final list = Uint8List(32); + list.setAll(0, Iterable.generate(list.length, (i) => rng.nextInt(256))); + final newPassword = base64UrlEncode(list); + await secureStorage.write( + key: _passwordStorageKey, + value: newPassword, + ); + } + // workaround for if we just wrote to the key and it still doesn't exist + password = await secureStorage.read(key: _passwordStorageKey); + if (password == null) throw MissingPluginException(); + } on MissingPluginException catch (e) { + const FlutterSecureStorage() + .delete(key: _passwordStorageKey) + .catchError((_) {}); + Logs().w('Database encryption is not supported on this platform', e); + _sendNoEncryptionWarning(e); + } catch (e, s) { + const FlutterSecureStorage() + .delete(key: _passwordStorageKey) + .catchError((_) {}); + Logs().w('Unable to init database encryption', e, s); + _sendNoEncryptionWarning(e); + } + + return password; +} + +void _sendNoEncryptionWarning(Object exception) async { + final store = await SharedPreferences.getInstance(); + final isStored = store.getBool(SettingKeys.noEncryptionWarningShown); + + if (isStored == true) return; + + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + ClientManager.sendInitNotification( + l10n.noDatabaseEncryption, + exception.toString(), + ); + + await store.setBool(SettingKeys.noEncryptionWarningShown, true); +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart new file mode 100644 index 0000000000..b0f8b43dcd --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart @@ -0,0 +1 @@ +Future applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() async {} diff --git a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart new file mode 100644 index 0000000000..9327632cb2 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart @@ -0,0 +1,101 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import 'package:file_picker/file_picker.dart'; +import 'package:file_selector/file_selector.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +extension MatrixFileExtension on MatrixFile { + void save(BuildContext context) async { + if (PlatformInfos.isWeb) { + _webDownload(); + return; + } + + final downloadPath = !PlatformInfos.isMobile + ? (await getSaveLocation( + suggestedName: name, + confirmButtonText: L10n.of(context).saveFile, + )) + ?.path + : await FilePicker.platform.saveFile( + dialogTitle: L10n.of(context).saveFile, + fileName: name, + type: filePickerFileType, + bytes: bytes, + ); + if (downloadPath == null) return; + + if (PlatformInfos.isDesktop) { + final result = await showFutureLoadingDialog( + context: context, + future: () => File(downloadPath).writeAsBytes(bytes), + ); + if (result.error != null) return; + } + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + L10n.of(context).fileHasBeenSavedAt(downloadPath), + ), + ), + ); + } + + FileType get filePickerFileType { + if (this is MatrixImageFile) return FileType.image; + if (this is MatrixAudioFile) return FileType.audio; + if (this is MatrixVideoFile) return FileType.video; + return FileType.any; + } + + void _webDownload() { + html.AnchorElement( + href: html.Url.createObjectUrlFromBlob( + html.Blob( + [bytes], + mimeType, + ), + ), + ) + ..download = name + ..click(); + } + + void share(BuildContext context) async { + // Workaround for iPad from + // https://github.com/fluttercommunity/plus_plugins/tree/main/packages/share_plus/share_plus#ipad + final box = context.findRenderObject() as RenderBox?; + + await Share.shareXFiles( + [XFile.fromData(bytes, name: name, mimeType: mimeType)], + sharePositionOrigin: + box == null ? null : box.localToGlobal(Offset.zero) & box.size, + ); + return; + } + + MatrixFile get detectFileType { + if (msgType == MessageTypes.Image) { + return MatrixImageFile(bytes: bytes, name: name); + } + if (msgType == MessageTypes.Video) { + return MatrixVideoFile(bytes: bytes, name: name); + } + if (msgType == MessageTypes.Audio) { + return MatrixAudioFile(bytes: bytes, name: name); + } + return this; + } + + String get sizeString => size.sizeString; +} diff --git a/lib/utils/matrix_sdk_extensions.dart/matrix_locals.dart b/lib/utils/matrix_sdk_extensions/matrix_locals.dart similarity index 80% rename from lib/utils/matrix_sdk_extensions.dart/matrix_locals.dart rename to lib/utils/matrix_sdk_extensions/matrix_locals.dart index f54bd68d47..165130c0b0 100644 --- a/lib/utils/matrix_sdk_extensions.dart/matrix_locals.dart +++ b/lib/utils/matrix_sdk_extensions/matrix_locals.dart @@ -62,7 +62,9 @@ class MatrixLocals extends MatrixLocalizations { @override String changedTheGuestAccessRulesTo( - String senderName, String localizedString) { + String senderName, + String localizedString, + ) { return l10n.changedTheGuestAccessRulesTo(senderName, localizedString); } @@ -73,7 +75,9 @@ class MatrixLocals extends MatrixLocalizations { @override String changedTheHistoryVisibilityTo( - String senderName, String localizedString) { + String senderName, + String localizedString, + ) { return l10n.changedTheHistoryVisibilityTo(senderName, localizedString); } @@ -172,14 +176,18 @@ class MatrixLocals extends MatrixLocalizations { } @override - String get needPantalaimonWarning => l10n.needPantalaimonWarning; + String get needPantalaimonWarning => l10n.oopsSomethingWentWrong; @override - String get noPermission => l10n.noPermission; + String get noPermission => l10n.noKeyForThisMessage; @override - String redactedAnEvent(String senderName) { - return l10n.redactedAnEvent(senderName); + String redactedAnEvent(Event redactedEvent) { + return l10n.redactedAnEvent( + redactedEvent.redactedBecause?.senderFromMemoryOrFallback + .calcDisplayname() ?? + l10n.user, + ); } @override @@ -188,8 +196,10 @@ class MatrixLocals extends MatrixLocalizations { } @override - String removedBy(String calcDisplayname) { - return l10n.removedBy(calcDisplayname); + String removedBy(Event redactedEvent) { + return l10n.redactedBy( + redactedEvent.senderFromMemoryOrFallback.calcDisplayname(), + ); } @override @@ -245,7 +255,7 @@ class MatrixLocals extends MatrixLocalizations { @override String unknownEvent(String typeKey) { - return l10n.unknownEvent(typeKey); + return l10n.userSentUnknownEvent('User', typeKey); } @override @@ -300,4 +310,44 @@ class MatrixLocals extends MatrixLocalizations { @override String youUnbannedUser(String targetName) => l10n.youUnbannedUser(targetName); + + @override + String wasDirectChatDisplayName(String oldDisplayName) => + l10n.wasDirectChatDisplayName(oldDisplayName); + + @override + String get unknownUser => l10n.user; + + @override + String hasKnocked(String targetName) => l10n.hasKnocked(targetName); + + @override + String acceptedKeyVerification(String senderName) => + l10n.acceptedKeyVerification(senderName); + + @override + String canceledKeyVerification(String senderName) => + l10n.canceledKeyVerification(senderName); + + @override + String completedKeyVerification(String senderName) => + l10n.completedKeyVerification(senderName); + + @override + String isReadyForKeyVerification(String senderName) => + l10n.isReadyForKeyVerification(senderName); + + @override + String requestedKeyVerification(String senderName) => + l10n.requestedKeyVerification(senderName); + + @override + String startedKeyVerification(String senderName) => + l10n.startedKeyVerification(senderName); + + @override + String invitedBy(String senderName) => senderName; + + @override + String get cancelledSend => l10n.sendCanceled; } diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index a80714308f..d36d8ae97e 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -4,11 +4,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/widgets/sentry_switch_list_tile.dart'; import '../config/app_config.dart'; abstract class PlatformInfos { @@ -30,6 +29,7 @@ abstract class PlatformInfos { static bool get usesTouchscreen => !isMobile; + /// Web could also record in theory but currently only wav which is too large static bool get platformCanRecord => (isMobile || isMacOS); static String get clientName => @@ -47,24 +47,37 @@ abstract class PlatformInfos { final version = await PlatformInfos.getVersion(); showAboutDialog( context: context, - useRootNavigator: false, children: [ Text('Version: $version'), - OutlinedButton( - onPressed: () => launch(AppConfig.sourceCodeUrl), - child: Text(L10n.of(context)!.sourceCode), + TextButton.icon( + onPressed: () => launchUrlString(AppConfig.sourceCodeUrl), + icon: const Icon(Icons.source_outlined), + label: Text(L10n.of(context).sourceCode), ), - OutlinedButton( - onPressed: () => launch(AppConfig.emojiFontUrl), - child: const Text(AppConfig.emojiFontName), + TextButton.icon( + onPressed: () => launchUrlString(AppConfig.emojiFontUrl), + icon: const Icon(Icons.emoji_emotions_outlined), + label: const Text(AppConfig.emojiFontName), ), - OutlinedButton( - onPressed: () => VRouter.of(context).to('logs'), - child: const Text('Logs'), + Builder( + builder: (innerContext) { + return TextButton.icon( + onPressed: () { + context.go('/logs'); + Navigator.of(innerContext).pop(); + }, + icon: const Icon(Icons.list_outlined), + label: const Text('Logs'), + ); + }, ), - SentrySwitchListTile.adaptive(label: L10n.of(context)!.sendBugReports), ], - applicationIcon: Image.asset('assets/logo.png', width: 64, height: 64), + applicationIcon: Image.asset( + 'assets/logo.png', + width: 64, + height: 64, + filterQuality: FilterQuality.medium, + ), applicationName: AppConfig.applicationName, ); } diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index f21544fee8..51aba8f9be 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -1,23 +1,71 @@ -import 'dart:convert'; import 'dart:ui'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_shortcuts/flutter_shortcuts.dart'; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/voip/callkeep_manager.dart'; Future pushHelper( PushNotification notification, { Client? client, L10n? l10n, String? activeRoomId, - Future Function(String?)? onSelectNotification, + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, +}) async { + try { + await _tryPushHelper( + notification, + client: client, + l10n: l10n, + activeRoomId: activeRoomId, + flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, + ); + } catch (e, s) { + Logs().v('Push Helper has crashed!', e, s); + + l10n ??= await lookupL10n(const Locale('en')); + flutterLocalNotificationsPlugin.show( + notification.roomId?.hashCode ?? 0, + l10n.newMessageInFluffyChat, + l10n.openAppToReadMessages, + NotificationDetails( + iOS: const DarwinNotificationDetails(), + android: AndroidNotificationDetails( + AppConfig.pushNotificationsChannelId, + l10n.incomingMessages, + number: notification.counts?.unread, + ticker: l10n.unreadChatsInApp( + AppConfig.applicationName, + (notification.counts?.unread ?? 0).toString(), + ), + importance: Importance.high, + priority: Priority.max, + shortcutId: notification.roomId, + ), + ), + ); + rethrow; + } +} + +Future _tryPushHelper( + PushNotification notification, { + Client? client, + L10n? l10n, + String? activeRoomId, + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, }) async { final isBackgroundMessage = client == null; Logs().v( @@ -25,25 +73,18 @@ Future pushHelper( notification.toJson(), ); - if (!isBackgroundMessage && + if (notification.roomId != null && activeRoomId == notification.roomId && - activeRoomId != null && - client?.syncPresence == null) { + WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { Logs().v('Room is in foreground. Stop push helper here.'); return; } - // Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project - final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); - await _flutterLocalNotificationsPlugin.initialize( - const InitializationSettings( - android: AndroidInitializationSettings('notifications_icon'), - iOS: IOSInitializationSettings(), - ), - onSelectNotification: onSelectNotification, - ); - - client ??= (await ClientManager.getClients(initialize: false)).first; + client ??= (await ClientManager.getClients( + initialize: false, + store: await SharedPreferences.getInstance(), + )) + .first; final event = await client.getEventByPushNotification( notification, storeInDatabase: isBackgroundMessage, @@ -51,72 +92,205 @@ Future pushHelper( if (event == null) { Logs().v('Notification is a clearing indicator.'); - await _flutterLocalNotificationsPlugin.cancelAll(); - final store = await SharedPreferences.getInstance(); - await store.setString(SettingKeys.notificationCurrentIds, json.encode({})); + if (notification.counts?.unread == null || + notification.counts?.unread == 0) { + await flutterLocalNotificationsPlugin.cancelAll(); + } else { + // Make sure client is fully loaded and synced before dismiss notifications: + await client.roomsLoading; + await client.oneShotSync(); + final activeNotifications = + await flutterLocalNotificationsPlugin.getActiveNotifications(); + for (final activeNotification in activeNotifications) { + final room = client.rooms.singleWhereOrNull( + (room) => room.id.hashCode == activeNotification.id, + ); + if (room == null || !room.isUnreadOrInvited) { + flutterLocalNotificationsPlugin.cancel(activeNotification.id!); + } + } + } return; } - Logs().v('Push helper got notification event.'); + Logs().v('Push helper got notification event of type ${event.type}.'); + + if (event.type.startsWith('m.call')) { + // make sure bg sync is on (needed to update hold, unhold events) + // prevent over write from app life cycle change + client.backgroundSync = true; + } - l10n ??= await L10n.delegate.load(window.locale); + if (event.type == EventTypes.CallInvite) { + CallKeepManager().initialize(); + } else if (event.type == EventTypes.CallHangup) { + client.backgroundSync = false; + } + + if (event.type.startsWith('m.call') && event.type != EventTypes.CallInvite) { + Logs().v('Push message is a m.call but not invite. Do not display.'); + return; + } + + if ((event.type.startsWith('m.call') && + event.type != EventTypes.CallInvite) || + event.type == 'org.matrix.call.sdp_stream_metadata_changed') { + Logs().v('Push message was for a call, but not call invite.'); + return; + } + + l10n ??= await L10n.delegate.load(PlatformDispatcher.instance.locale); final matrixLocals = MatrixLocals(l10n); // Calculate the body - final body = await event.calcLocalizedBody( - matrixLocals, - plaintextBody: true, - withSenderNamePrefix: !event.room.isDirectChat, - hideReply: true, - hideEdit: true, - removeMarkdown: true, - ); + final body = event.type == EventTypes.Encrypted + ? l10n.newMessageInFluffyChat + : await event.calcLocalizedBody( + matrixLocals, + plaintextBody: true, + withSenderNamePrefix: false, + hideReply: true, + hideEdit: true, + removeMarkdown: true, + ); // The person object for the android message style notification - final avatar = event.room.avatar - ?.getThumbnail( - client, - width: 126, - height: 126, - ) - .toString(); - final avatarFile = - avatar == null ? null : await DefaultCacheManager().getSingleFile(avatar); + final avatar = event.room.avatar; + final senderAvatar = event.room.isDirectChat + ? avatar + : event.senderFromMemoryOrFallback.avatarUrl; + + Uint8List? roomAvatarFile, senderAvatarFile; + try { + roomAvatarFile = avatar == null + ? null + : await client + .downloadMxcCached( + avatar, + thumbnailMethod: ThumbnailMethod.scale, + width: 256, + height: 256, + animated: false, + isThumbnail: true, + ) + .timeout(const Duration(seconds: 3)); + } catch (e, s) { + Logs().e('Unable to get avatar picture', e, s); + } + try { + senderAvatarFile = event.room.isDirectChat + ? roomAvatarFile + : senderAvatar == null + ? null + : await client + .downloadMxcCached( + senderAvatar, + thumbnailMethod: ThumbnailMethod.scale, + width: 256, + height: 256, + animated: false, + isThumbnail: true, + ) + .timeout(const Duration(seconds: 3)); + } catch (e, s) { + Logs().e('Unable to get avatar picture', e, s); + } + final id = notification.roomId.hashCode; + + final senderName = event.senderFromMemoryOrFallback.calcDisplayname(); // Show notification + + final newMessage = Message( + body, + event.originServerTs, + Person( + bot: event.messageType == MessageTypes.Notice, + key: event.senderId, + name: senderName, + icon: senderAvatarFile == null + ? null + : ByteArrayAndroidIcon(senderAvatarFile), + ), + ); + + final messagingStyleInformation = PlatformInfos.isAndroid + ? await AndroidFlutterLocalNotificationsPlugin() + .getActiveNotificationMessagingStyle(id) + : null; + messagingStyleInformation?.messages?.add(newMessage); + + final roomName = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); + + final notificationGroupId = + event.room.isDirectChat ? 'directChats' : 'groupChats'; + final groupName = event.room.isDirectChat ? l10n.directChats : l10n.groups; + + final messageRooms = AndroidNotificationChannelGroup( + notificationGroupId, + groupName, + ); + final roomsChannel = AndroidNotificationChannel( + event.room.id, + roomName, + groupId: notificationGroupId, + ); + + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannelGroup(messageRooms); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(roomsChannel); + final androidPlatformChannelSpecifics = AndroidNotificationDetails( AppConfig.pushNotificationsChannelId, - AppConfig.pushNotificationsChannelName, - channelDescription: AppConfig.pushNotificationsChannelDescription, - styleInformation: MessagingStyleInformation( - Person(name: event.room.client.userID), - conversationTitle: event.room.displayname, - groupConversation: !event.room.isDirectChat, - messages: [ - Message( - body, - event.originServerTs, + l10n.incomingMessages, + number: notification.counts?.unread, + category: AndroidNotificationCategory.message, + shortcutId: event.room.id, + styleInformation: messagingStyleInformation ?? + MessagingStyleInformation( Person( - name: event.room.displayname, - icon: avatarFile == null + name: senderName, + icon: roomAvatarFile == null ? null - : BitmapFilePathAndroidIcon(avatarFile.path), + : ByteArrayAndroidIcon(roomAvatarFile), + key: event.roomId, + important: event.room.isFavourite, ), - ) - ], + conversationTitle: event.room.isDirectChat ? null : roomName, + groupConversation: !event.room.isDirectChat, + messages: [newMessage], + ), + ticker: event.calcLocalizedBodyFallback( + matrixLocals, + plaintextBody: true, + withSenderNamePrefix: !event.room.isDirectChat, + hideReply: true, + hideEdit: true, + removeMarkdown: true, ), - ticker: l10n.unreadChats(notification.counts?.unread ?? 1), - importance: Importance.max, - priority: Priority.high, - groupKey: event.room.id, + importance: Importance.high, + priority: Priority.max, + groupKey: event.room.spaceParents.firstOrNull?.roomId ?? 'rooms', ); - const iOSPlatformChannelSpecifics = IOSNotificationDetails(); + const iOSPlatformChannelSpecifics = DarwinNotificationDetails(); final platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics, ); - await _flutterLocalNotificationsPlugin.show( - await mapRoomIdToInt(event.room.id), - event.room.displayname, + + final title = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); + + if (PlatformInfos.isAndroid && messagingStyleInformation == null) { + await _setShortcut(event, l10n, title, roomAvatarFile); + } + + await flutterLocalNotificationsPlugin.show( + id, + title, body, platformChannelSpecifics, payload: event.roomId, @@ -124,27 +298,30 @@ Future pushHelper( Logs().v('Push helper has been completed!'); } -/// Workaround for the problem that local notification IDs must be int but we -/// sort by [roomId] which is a String. To make sure that we don't have duplicated -/// IDs we map the [roomId] to a number and store this number. -Future mapRoomIdToInt(String roomId) async { - final store = await SharedPreferences.getInstance(); - final idMap = Map.from( - jsonDecode(store.getString(SettingKeys.notificationCurrentIds) ?? '{}')); - int? currentInt; - try { - currentInt = idMap[roomId]; - } catch (_) { - currentInt = null; - } - if (currentInt != null) { - return currentInt; - } - var nCurrentInt = 0; - while (idMap.values.contains(nCurrentInt)) { - nCurrentInt++; - } - idMap[roomId] = nCurrentInt; - await store.setString(SettingKeys.notificationCurrentIds, json.encode(idMap)); - return nCurrentInt; +/// Creates a shortcut for Android platform but does not block displaying the +/// notification. This is optional but provides a nicer view of the +/// notification popup. +Future _setShortcut( + Event event, + L10n l10n, + String title, + Uint8List? avatarFile, +) async { + final flutterShortcuts = FlutterShortcuts(); + await flutterShortcuts.initialize(debug: !kReleaseMode); + await flutterShortcuts.pushShortcutItem( + shortcut: ShortcutItem( + id: event.room.id, + action: AppConfig.inviteLinkPrefix + event.room.id, + shortLabel: title, + conversationShortcut: true, + icon: avatarFile == null + ? null + : ShortcutMemoryIcon(jpegImage: avatarFile).toString(), + shortcutIconAsset: avatarFile == null + ? ShortcutIconAsset.androidAsset + : ShortcutIconAsset.memoryAsset, + isImportant: event.room.isFavourite, + ), + ); } diff --git a/lib/utils/resize_image.dart b/lib/utils/resize_image.dart deleted file mode 100644 index c18a8e2921..0000000000 --- a/lib/utils/resize_image.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:blurhash_dart/blurhash_dart.dart'; -import 'package:image/image.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:video_compress/video_compress.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; - -extension ResizeImage on MatrixFile { - static const int max = 1200; - static const int quality = 40; - - Future resizeVideo() async { - final tmpDir = await getTemporaryDirectory(); - final tmpFile = File(tmpDir.path + '/' + name); - MediaInfo? mediaInfo; - await tmpFile.writeAsBytes(bytes); - try { - // will throw an error e.g. on Android SDK < 18 - mediaInfo = await VideoCompress.compressVideo(tmpFile.path); - } catch (e, s) { - SentryController.captureException(e, s); - } - return MatrixVideoFile( - bytes: (await mediaInfo?.file?.readAsBytes()) ?? bytes, - name: name, - mimeType: mimeType, - width: mediaInfo?.width, - height: mediaInfo?.height, - duration: mediaInfo?.duration?.round(), - ); - } - - Future getVideoThumbnail() async { - if (!PlatformInfos.isMobile) return null; - final tmpDir = await getTemporaryDirectory(); - final tmpFile = File(tmpDir.path + '/' + name); - if (await tmpFile.exists() == false) { - await tmpFile.writeAsBytes(bytes); - } - try { - final bytes = await VideoCompress.getByteThumbnail(tmpFile.path); - if (bytes == null) return null; - return MatrixImageFile( - bytes: bytes, - name: name, - ); - } catch (e, s) { - SentryController.captureException(e, s); - } - return null; - } -} - -Future createBlurHash(Uint8List file) async { - final image = decodeImage(file)!; - return BlurHash.encode(image, numCompX: 4, numCompY: 3); -} diff --git a/lib/utils/resize_video.dart b/lib/utils/resize_video.dart new file mode 100644 index 0000000000..768677106a --- /dev/null +++ b/lib/utils/resize_video.dart @@ -0,0 +1,46 @@ +import 'package:cross_file/cross_file.dart'; +import 'package:matrix/matrix.dart'; +import 'package:video_compress/video_compress.dart'; + +import 'package:fluffychat/utils/platform_infos.dart'; + +extension ResizeImage on XFile { + static const int max = 1200; + static const int quality = 40; + + Future resizeVideo() async { + MediaInfo? mediaInfo; + try { + if (PlatformInfos.isMobile) { + // will throw an error e.g. on Android SDK < 18 + mediaInfo = await VideoCompress.compressVideo(path); + } + } catch (e, s) { + Logs().w('Error while compressing video', e, s); + } + return MatrixVideoFile( + bytes: (await mediaInfo?.file?.readAsBytes()) ?? await readAsBytes(), + name: name, + mimeType: mimeType, + width: mediaInfo?.width, + height: mediaInfo?.height, + duration: mediaInfo?.duration?.round(), + ); + } + + Future getVideoThumbnail() async { + if (!PlatformInfos.isMobile) return null; + + try { + final bytes = await VideoCompress.getByteThumbnail(path); + if (bytes == null) return null; + return MatrixImageFile( + bytes: bytes, + name: name, + ); + } catch (e, s) { + Logs().w('Error while compressing video', e, s); + } + return null; + } +} diff --git a/lib/utils/room_status_extension.dart b/lib/utils/room_status_extension.dart index 5468010cda..4407d8b6a3 100644 --- a/lib/utils/room_status_extension.dart +++ b/lib/utils/room_status_extension.dart @@ -4,75 +4,42 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import '../config/app_config.dart'; -import 'date_time_extension.dart'; -import 'matrix_sdk_extensions.dart/filtered_timeline_extension.dart'; extension RoomStatusExtension on Room { - CachedPresence? get directChatPresence => - client.presences[directChatMatrixID]; - - String getLocalizedStatus(BuildContext context) { - if (isDirectChat) { - final directChatPresence = this.directChatPresence; - if (directChatPresence != null && - (directChatPresence.lastActiveTimestamp != null || - directChatPresence.currentlyActive != null)) { - if (directChatPresence.statusMsg?.isNotEmpty ?? false) { - return directChatPresence.statusMsg!; - } - if (directChatPresence.currentlyActive == true) { - return L10n.of(context)!.currentlyActive; - } - if (directChatPresence.lastActiveTimestamp == null) { - return L10n.of(context)!.lastSeenLongTimeAgo; - } - final time = directChatPresence.lastActiveTimestamp!; - return L10n.of(context)! - .lastActiveAgo(time.localizedTimeShort(context)); - } - return L10n.of(context)!.lastSeenLongTimeAgo; - } - return L10n.of(context)! - .countParticipants(summary.mJoinedMemberCount.toString()); - } - String getLocalizedTypingText(BuildContext context) { var typingText = ''; final typingUsers = this.typingUsers; typingUsers.removeWhere((User u) => u.id == client.userID); if (AppConfig.hideTypingUsernames) { - typingText = L10n.of(context)!.isTyping; + typingText = L10n.of(context).isTyping; if (typingUsers.first.id != directChatMatrixID) { typingText = - L10n.of(context)!.numUsersTyping(typingUsers.length.toString()); + L10n.of(context).numUsersTyping(typingUsers.length.toString()); } } else if (typingUsers.length == 1) { - typingText = L10n.of(context)!.isTyping; + typingText = L10n.of(context).isTyping; if (typingUsers.first.id != directChatMatrixID) { typingText = - L10n.of(context)!.userIsTyping(typingUsers.first.calcDisplayname()); + L10n.of(context).userIsTyping(typingUsers.first.calcDisplayname()); } } else if (typingUsers.length == 2) { - typingText = L10n.of(context)!.userAndUserAreTyping( - typingUsers.first.calcDisplayname(), - typingUsers[1].calcDisplayname()); + typingText = L10n.of(context).userAndUserAreTyping( + typingUsers.first.calcDisplayname(), + typingUsers[1].calcDisplayname(), + ); } else if (typingUsers.length > 2) { - typingText = L10n.of(context)!.userAndOthersAreTyping( - typingUsers.first.calcDisplayname(), - (typingUsers.length - 1).toString()); + typingText = L10n.of(context).userAndOthersAreTyping( + typingUsers.first.calcDisplayname(), + (typingUsers.length - 1).toString(), + ); } return typingText; } - List getSeenByUsers( - Timeline timeline, List filteredEvents, Set unfolded, - {String? eventId}) { + List getSeenByUsers(Timeline timeline, {String? eventId}) { if (timeline.events.isEmpty) return []; - - final filteredEvents = timeline.getFilteredEvents(unfolded: unfolded); - if (filteredEvents.isEmpty) return []; - eventId ??= filteredEvents.first.eventId; + eventId ??= timeline.events.first.eventId; final lastReceipts = {}; // now we iterate the timeline events until we hit the first rendered event @@ -82,8 +49,10 @@ extension RoomStatusExtension on Room { break; } } - lastReceipts.removeWhere((user) => - user.id == client.userID || user.id == filteredEvents.first.senderId); + lastReceipts.removeWhere( + (user) => + user.id == client.userID || user.id == timeline.events.first.senderId, + ); return lastReceipts.toList(); } } diff --git a/lib/utils/run_in_background.dart b/lib/utils/run_in_background.dart deleted file mode 100644 index e75d14525b..0000000000 --- a/lib/utils/run_in_background.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'dart:async'; - -import 'package:isolate/isolate.dart'; - -Future runInBackground( - FutureOr Function(U arg) function, U arg) async { - final isolate = await IsolateRunner.spawn(); - try { - return await isolate.run(function, arg); - } finally { - await isolate.close(); - } -} diff --git a/lib/utils/sentry_controller.dart b/lib/utils/sentry_controller.dart deleted file mode 100644 index f81c6ca22d..0000000000 --- a/lib/utils/sentry_controller.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:sentry/sentry.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import '../config/setting_keys.dart'; -import 'famedlysdk_store.dart'; - -abstract class SentryController { - static Future toggleSentryAction( - BuildContext context, bool enableSentry) async { - if (!AppConfig.enableSentry) return; - final storage = Store(); - await storage.setItemBool(SettingKeys.sentry, enableSentry); - return; - } - - static Future getSentryStatus() async { - if (!AppConfig.enableSentry) return false; - final storage = Store(); - return await storage.getItemBool(SettingKeys.sentry); - } - - static final sentry = SentryClient(SentryOptions(dsn: AppConfig.sentryDns)); - - static void captureException(error, stackTrace) async { - Logs().e('Capture exception', error, stackTrace); - if (!kDebugMode && await getSentryStatus()) { - await sentry.captureException( - error, - stackTrace: stackTrace, - ); - } - } -} diff --git a/lib/utils/show_scaffold_dialog.dart b/lib/utils/show_scaffold_dialog.dart new file mode 100644 index 0000000000..0c09a7037e --- /dev/null +++ b/lib/utils/show_scaffold_dialog.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; + +Future showScaffoldDialog({ + required BuildContext context, + Color? barrierColor, + Color? containerColor, + double maxWidth = 480, + double maxHeight = 720, + required Widget Function(BuildContext context) builder, +}) => + showDialog( + context: context, + useSafeArea: false, + builder: FluffyThemes.isColumnMode(context) + ? (context) => Center( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: containerColor ?? + Theme.of(context).scaffoldBackgroundColor, + ), + clipBehavior: Clip.hardEdge, + margin: const EdgeInsets.all(16), + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: maxHeight, + ), + child: builder(context), + ), + ) + : builder, + ); diff --git a/lib/utils/show_update_snackbar.dart b/lib/utils/show_update_snackbar.dart new file mode 100644 index 0000000000..1b408ec224 --- /dev/null +++ b/lib/utils/show_update_snackbar.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +abstract class UpdateNotifier { + static const String versionStoreKey = 'last_known_version'; + + static void showUpdateSnackBar(BuildContext context) async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + final currentVersion = await PlatformInfos.getVersion(); + final store = await SharedPreferences.getInstance(); + final storedVersion = store.getString(versionStoreKey); + + if (currentVersion != storedVersion) { + if (storedVersion != null) { + scaffoldMessenger.showSnackBar( + SnackBar( + duration: const Duration(seconds: 30), + showCloseIcon: true, + content: Text(L10n.of(context).updateInstalled(currentVersion)), + action: SnackBarAction( + label: L10n.of(context).changelog, + onPressed: () => launchUrlString(AppConfig.changelogUrl), + ), + ), + ); + } + await store.setString(versionStoreKey, currentVersion); + } + } +} diff --git a/lib/utils/size_string.dart b/lib/utils/size_string.dart new file mode 100644 index 0000000000..315033076a --- /dev/null +++ b/lib/utils/size_string.dart @@ -0,0 +1,21 @@ +extension SizeString on num { + String get sizeString { + var size = toDouble(); + if (size < 1000) { + return '${size.round()} Bytes'; + } + if (size < 1000 * 1000) { + size = size / 1000; + size = (size * 10).round() / 10; + return '${size.toString()} KB'; + } + if (size < 1000 * 1000 * 1000) { + size = size / 1000000; + size = (size * 10).round() / 10; + return '${size.toString()} MB'; + } + size = size / 1000 * 1000 * 1000 * 1000; + size = (size * 10).round() / 10; + return '${size.toString()} GB'; + } +} diff --git a/lib/utils/story_theme_data.dart b/lib/utils/story_theme_data.dart deleted file mode 100644 index 9006dcc0a5..0000000000 --- a/lib/utils/story_theme_data.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -class StoryThemeData { - final Color? color1; - final Color? color2; - final BoxFit fit; - final int alignmentX; - final int alignmentY; - - static const String contentKey = 'msc3588.stories.design'; - - const StoryThemeData({ - this.color1, - this.color2, - this.fit = BoxFit.contain, - this.alignmentX = 0, - this.alignmentY = 0, - }); - - factory StoryThemeData.fromJson(Map json) { - final color1Int = json.tryGet('color1'); - final color2Int = json.tryGet('color2'); - final color1 = color1Int == null ? null : Color(color1Int); - final color2 = color2Int == null ? null : Color(color2Int); - return StoryThemeData( - color1: color1, - color2: color2, - fit: - json.tryGet('fit') == 'cover' ? BoxFit.cover : BoxFit.contain, - alignmentX: json.tryGet('alignment_x') ?? 0, - alignmentY: json.tryGet('alignment_y') ?? 0, - ); - } - - Map toJson() => { - if (color1 != null) 'color1': color1?.value, - if (color2 != null) 'color2': color2?.value, - 'fit': fit.name, - 'alignment_x': alignmentX, - 'alignment_y': alignmentY, - }; -} diff --git a/lib/utils/stream_extension.dart b/lib/utils/stream_extension.dart index afd8deba80..66e840fcee 100644 --- a/lib/utils/stream_extension.dart +++ b/lib/utils/stream_extension.dart @@ -9,9 +9,9 @@ extension StreamExtension on Stream { var gotMessage = false; // as we call our inline-defined function recursively we need to make sure that the // variable exists prior of creating the function. Silly dart. - Function? _onMessage; + Function? onMessage; // callback to determine if we should send out an update - _onMessage = () { + onMessage = () { // do nothing if it is already closed if (controller.isClosed) { return; @@ -25,7 +25,7 @@ extension StreamExtension on Stream { // method to send out an update! timer = null; if (gotMessage) { - _onMessage?.call(); + onMessage?.call(); } }); } else { @@ -33,9 +33,11 @@ extension StreamExtension on Stream { gotMessage = true; } }; - final subscription = listen((_) => _onMessage?.call(), - onDone: () => controller.close(), - onError: (e, s) => controller.addError(e, s)); + final subscription = listen( + (_) => onMessage?.call(), + onDone: () => controller.close(), + onError: (e, s) => controller.addError(e, s), + ); // add proper cleanup to the subscription and the controller, to not memory leak controller.onCancel = () { subscription.cancel(); diff --git a/lib/utils/string_color.dart b/lib/utils/string_color.dart index 4ed39432b9..d854d15278 100644 --- a/lib/utils/string_color.dart +++ b/lib/utils/string_color.dart @@ -1,30 +1,34 @@ import 'package:flutter/material.dart'; extension StringColor on String { - Color get color { + static final _colorCache = >{}; + + Color _getColorLight(double light) { var number = 0.0; for (var i = 0; i < length; i++) { number += codeUnitAt(i); } number = (number % 12) * 25.5; - return HSLColor.fromAHSL(1, number, 1, 0.35).toColor(); + return HSLColor.fromAHSL(1, number, 1, light).toColor(); + } + + Color get color { + _colorCache[this] ??= {}; + return _colorCache[this]![0.3] ??= _getColorLight(0.3); } Color get darkColor { - var number = 0.0; - for (var i = 0; i < length; i++) { - number += codeUnitAt(i); - } - number = (number % 12) * 25.5; - return HSLColor.fromAHSL(1, number, 1, 0.2).toColor(); + _colorCache[this] ??= {}; + return _colorCache[this]![0.2] ??= _getColorLight(0.2); } - Color get lightColor { - var number = 0.0; - for (var i = 0; i < length; i++) { - number += codeUnitAt(i); - } - number = (number % 12) * 25.5; - return HSLColor.fromAHSL(1, number, 1, 0.8).toColor(); + Color get lightColorText { + _colorCache[this] ??= {}; + return _colorCache[this]![0.7] ??= _getColorLight(0.7); + } + + Color get lightColorAvatar { + _colorCache[this] ??= {}; + return _colorCache[this]![0.4] ??= _getColorLight(0.4); } } diff --git a/lib/utils/string_extension.dart b/lib/utils/string_extension.dart deleted file mode 100644 index 3c77ed4ae1..0000000000 --- a/lib/utils/string_extension.dart +++ /dev/null @@ -1,15 +0,0 @@ -extension StringCasingExtension on String { - String removeDiacritics() { - const withDia = - 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž'; - const withoutDia = - 'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz'; - - String str = this; - for (int i = 0; i < withDia.length; i++) { - str = str.replaceAll(withDia[i], withoutDia[i]); - } - - return str; - } -} diff --git a/lib/utils/tor_stub.dart b/lib/utils/tor_stub.dart new file mode 100644 index 0000000000..3223d087f9 --- /dev/null +++ b/lib/utils/tor_stub.dart @@ -0,0 +1,7 @@ +/// Stub class for [TorBrowserDetector] +/// +/// statically returns false as Tor **browser** can only be detected in a +/// **browser**. +abstract class TorBrowserDetector { + static Future get isTorBrowser => Future.value(false); +} diff --git a/lib/utils/uia_request_manager.dart b/lib/utils/uia_request_manager.dart index 757ff4572b..9187ed2734 100644 --- a/lib/utils/uia_request_manager.dart +++ b/lib/utils/uia_request_manager.dart @@ -1,14 +1,20 @@ import 'dart:async'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher/url_launcher_string.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/matrix.dart'; extension UiaRequestManager on MatrixState { Future uiaRequestHandler(UiaRequest uiaRequest) async { + final l10n = L10n.of(context); + final navigatorContext = + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context; try { if (uiaRequest.state != UiaRequestState.waitForUser || uiaRequest.nextStages.isEmpty) { @@ -22,19 +28,14 @@ extension UiaRequestManager on MatrixState { final input = cachedPassword ?? (await showTextInputDialog( context: navigatorContext, - title: L10n.of(context)!.pleaseEnterYourPassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - const DialogTextField( - minLines: 1, - maxLines: 1, - obscureText: true, - hintText: '******', - ) - ], - )) - ?.single; + title: l10n.pleaseEnterYourPassword, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + minLines: 1, + maxLines: 1, + obscureText: true, + hintText: '******', + )); if (input == null || input.isEmpty) { return uiaRequest.cancel(); } @@ -46,17 +47,16 @@ extension UiaRequestManager on MatrixState { ), ); case AuthenticationTypes.emailIdentity: - final currentThreepidCreds = this.currentThreepidCreds; if (currentThreepidCreds == null) { return uiaRequest.cancel( - UiaException(L10n.of(widget.context)!.serverRequiresEmail), + UiaException(L10n.of(context).serverRequiresEmail), ); } final auth = AuthenticationThreePidCreds( session: uiaRequest.session, type: AuthenticationTypes.emailIdentity, threepidCreds: ThreepidCreds( - sid: currentThreepidCreds.sid, + sid: currentThreepidCreds!.sid, clientSecret: currentClientSecret, ), ); @@ -64,10 +64,10 @@ extension UiaRequestManager on MatrixState { await showOkCancelAlertDialog( useRootNavigator: false, context: navigatorContext, - title: L10n.of(context)!.weSentYouAnEmail, - message: L10n.of(context)!.pleaseClickOnLink, - okLabel: L10n.of(context)!.iHaveClickedOnLink, - cancelLabel: L10n.of(context)!.cancel, + title: l10n.weSentYouAnEmail, + message: l10n.pleaseClickOnLink, + okLabel: l10n.iHaveClickedOnLink, + cancelLabel: l10n.cancel, )) { return uiaRequest.completeStage(auth); } @@ -80,20 +80,17 @@ extension UiaRequestManager on MatrixState { ), ); default: - final url = Uri.parse(client.homeserver.toString() + - '/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}'); - launch( - url.toString(), - forceSafariVC: true, - forceWebView: false, + final url = Uri.parse( + '${client.homeserver}/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}', ); + launchUrlString(url.toString()); if (OkCancelResult.ok == await showOkCancelAlertDialog( useRootNavigator: false, - message: L10n.of(context)!.pleaseFollowInstructionsOnWeb, + title: l10n.pleaseFollowInstructionsOnWeb, context: navigatorContext, - okLabel: L10n.of(context)!.next, - cancelLabel: L10n.of(context)!.cancel, + okLabel: l10n.next, + cancelLabel: l10n.cancel, )) { return uiaRequest.completeStage( AuthenticationData(session: uiaRequest.session), diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index 3d60efbd8c..da892c893e 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -1,26 +1,34 @@ import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart' show IterableExtension; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:punycode/punycode.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import 'package:fluffychat/widgets/profile_bottom_sheet.dart'; import 'package:fluffychat/widgets/public_room_bottom_sheet.dart'; import 'platform_infos.dart'; class UrlLauncher { + /// The url to open. final String? url; + + /// The visible name in the GUI. For example the name of a markdown link + /// which may differ from the actual url to open. + final String? name; + final BuildContext context; - const UrlLauncher(this.context, this.url); - void launchUrl() { + const UrlLauncher(this.context, this.url, [this.name]); + + void launchUrl() async { if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || {'#', '@', '!', '+', '\$'}.contains(url![0]) || @@ -31,9 +39,24 @@ class UrlLauncher { if (uri == null) { // we can't open this thing ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.cantOpenUri(url!)))); + SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), + ); return; } + + if (name != null && url != name) { + // If there is a name which differs from the url, we need to make sure + // that the user can see the actual url before opening the browser. + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).openLinkInBrowser, + message: url, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + } + if (!{'https', 'http'}.contains(uri.scheme)) { // just launch non-https / non-http uris directly @@ -54,22 +77,24 @@ class UrlLauncher { // to an apple maps thingy // https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html final ll = '${latlong.first},${latlong.last}'; - launch('https://maps.apple.com/?q=$ll&sll=$ll'); + launchUrlString('https://maps.apple.com/?q=$ll&sll=$ll'); } else { // transmute geo URIs on desktop to openstreetmap links, as those usually can't handle // geo URIs - launch( - 'https://www.openstreetmap.org/?mlat=${latlong.first}&mlon=${latlong.last}#map=16/${latlong.first}/${latlong.last}'); + launchUrlString( + 'https://www.openstreetmap.org/?mlat=${latlong.first}&mlon=${latlong.last}#map=16/${latlong.first}/${latlong.last}', + ); } return; } } - launch(url!); + launchUrlString(url!); return; } if (uri.host.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.cantOpenUri(url!)))); + SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), + ); return; } // okay, we have either an http or an https URI. @@ -78,11 +103,16 @@ class UrlLauncher { final newHost = uri.host.split('.').map((hostPartEncoded) { final hostPart = Uri.decodeComponent(hostPartEncoded); final hostPartPunycode = punycodeEncode(hostPart); - return hostPartPunycode != hostPart + '-' + return hostPartPunycode != '$hostPart-' ? 'xn--$hostPartPunycode' : hostPart; }).join('.'); - launch(uri.replace(host: newHost).toString()); + // Force LaunchMode.externalApplication, otherwise url_launcher will default + // to opening links in a webview on mobile platforms. + launchUrlString( + uri.replace(host: newHost).toString(), + mode: LaunchMode.externalApplication, + ); } void openMatrixToUrl() async { @@ -130,16 +160,26 @@ class UrlLauncher { } servers.addAll(identityParts.via); if (room != null) { + if (room.isSpace) { + // TODO: Implement navigate to space + context.go('/rooms/${room.id}'); + + return; + } // we have the room, so....just open it if (event != null) { - VRouter.of(context).toSegments(['rooms', room.id], - queryParameters: {'event': event}); + context.go( + '/${Uri( + pathSegments: ['rooms', room.id], + queryParameters: {'event': event}, + )}', + ); } else { - VRouter.of(context).toSegments(['rooms', room.id]); + context.go('/rooms/${room.id}'); } return; } else { - await showModalBottomSheet( + await showAdaptiveBottomSheet( context: context, builder: (c) => PublicRoomBottomSheet( roomAlias: identityParts.primaryIdentifier, @@ -165,20 +205,25 @@ class UrlLauncher { if (response.error != null) return; // wait for two seconds so that it probably came down /sync await showFutureLoadingDialog( - context: context, - future: () => Future.delayed(const Duration(seconds: 2))); + context: context, + future: () => Future.delayed(const Duration(seconds: 2)), + ); if (event != null) { - VRouter.of(context).toSegments(['rooms', response.result!], - queryParameters: {'event': event}); + context.go( + Uri( + pathSegments: ['rooms', response.result!], + queryParameters: {'event': event}, + ).toString(), + ); } else { - VRouter.of(context).toSegments(['rooms', response.result!]); + context.go('/rooms/${response.result!}'); } } } } else if (identityParts.primaryIdentifier.sigil == '@') { - await showModalBottomSheet( + await showAdaptiveBottomSheet( context: context, - builder: (c) => ProfileBottomSheet( + builder: (c) => LoadProfileBottomSheet( userId: identityParts.primaryIdentifier, outerContext: context, ), diff --git a/lib/utils/voip/callkeep_manager.dart b/lib/utils/voip/callkeep_manager.dart index d2b56f23bc..a662524149 100644 --- a/lib/utils/voip/callkeep_manager.dart +++ b/lib/utils/voip/callkeep_manager.dart @@ -1,73 +1,58 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:callkeep/callkeep.dart'; +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:uuid/uuid.dart'; - -import 'package:fluffychat/utils/voip_plugin.dart'; +import 'package:permission_handler/permission_handler.dart'; class CallKeeper { - CallKeeper(this.callKeepManager, this.uuid, this.number, this.call) { - call?.onCallStateChanged.stream.listen(_handleCallState); + CallKeeper(this.callKeepManager, this.call) { + call.onCallStateChanged.stream.listen(_handleCallState); } CallKeepManager callKeepManager; - String number; - String uuid; - bool held = false; - bool muted = false; + bool? held = false; + bool? muted = false; bool connected = false; - CallSession? call; + CallSession call; + // update native caller to show what remote user has done. void _handleCallState(CallState state) { - Logs().v('CallKeepManager::handleCallState: ${state.toString()}'); + Logs().i('CallKeepManager::handleCallState: ${state.toString()}'); switch (state) { case CallState.kConnecting: + Logs().v('callkeep connecting'); break; case CallState.kConnected: + Logs().v('callkeep connected'); if (!connected) { - callKeepManager.answer(uuid); + callKeepManager.answer(call.callId); } else { - callKeepManager.setMutedCall(uuid, false); - callKeepManager.setOnHold(uuid, false); + callKeepManager.setMutedCall(call.callId, false); + callKeepManager.setOnHold(call.callId, false); } break; case CallState.kEnded: - callKeepManager.hangup(uuid); - break; - /* TODO: - case CallState.kMuted: - callKeepManager.setMutedCall(uuid, true); - break; - case CallState.kHeld: - callKeepManager.setOnHold(uuid, true); + callKeepManager.hangup(call.callId); break; - */ + case CallState.kFledgling: - // TODO: Handle this case. - break; case CallState.kInviteSent: - // TODO: Handle this case. - break; case CallState.kWaitLocalMedia: - // TODO: Handle this case. - break; case CallState.kCreateOffer: - // TODO: Handle this case. - break; case CallState.kCreateAnswer: - // TODO: Handle this case. - break; case CallState.kRinging: - // TODO: Handle this case. + case CallState.kEnding: break; } } } +Map calls = {}; + class CallKeepManager { factory CallKeepManager() { return _instance; @@ -80,83 +65,74 @@ class CallKeepManager { static final CallKeepManager _instance = CallKeepManager._internal(); late FlutterCallkeep _callKeep; - VoipPlugin? _voipPlugin; - Map calls = {}; - String newUUID() => const Uuid().v4(); + String get appName => 'FluffyChat'; - String get appName => 'Famedly'; + Future get hasPhoneAccountEnabled async => + await _callKeep.hasPhoneAccount(); Map get alertOptions => { 'alertTitle': 'Permissions required', - 'alertDescription': '$appName needs to access your phone accounts!', + 'alertDescription': + 'Allow $appName to register as a calling account? This will allow calls to be handled by the native android dialer.', 'cancelButton': 'Cancel', 'okButton': 'ok', // Required to get audio in background when using Android 11 'foregroundService': { - 'channelId': 'com.famedly.talk', + 'channelId': 'com.fluffy.fluffychat', 'channelName': 'Foreground service for my app', 'notificationTitle': '$appName is running on background', 'notificationIcon': 'mipmap/ic_notification_launcher', }, + 'additionalPermissions': [''], }; + bool setupDone = false; - void setVoipPlugin(VoipPlugin plugin) { - if (kIsWeb) { - throw 'Not support callkeep for flutter web'; - } - _voipPlugin = plugin; - _voipPlugin!.onIncomingCall = (CallSession call) async { + Future showCallkitIncoming(CallSession call) async { + if (!setupDone) { await _callKeep.setup( - null, - { - 'ios': { - 'appName': appName, - }, - 'android': alertOptions, + null, + { + 'ios': { + 'appName': appName, }, - backgroundMode: true); - - await displayIncomingCall(call); - - call.onCallStateChanged.stream.listen((state) { - if (state == CallState.kEnded) { - _callKeep.endAllCalls(); - } - }); - call.onCallEventChanged.stream.listen((event) { - if (event == CallEvent.kLocalHoldUnhold) { + 'android': alertOptions, + }, + backgroundMode: true, + ); + } + setupDone = true; + await displayIncomingCall(call); + call.onCallStateChanged.stream.listen((state) { + if (state == CallState.kEnded) { + _callKeep.endAllCalls(); + } + }); + call.onCallEventChanged.stream.listen( + (event) { + if (event == CallStateChange.kLocalHoldUnhold) { Logs().i( - 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}'); + 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}', + ); } - }); - }; + }, + ); } - void removeCall(String callUUID) { + void removeCall(String? callUUID) { calls.remove(callUUID); } - void addCall(String callUUID, CallKeeper callKeeper) { + void addCall(String? callUUID, CallKeeper callKeeper) { + if (calls.containsKey(callUUID)) return; calls[callUUID] = callKeeper; } - String findCallUUID(String number) { - var uuid = ''; - calls.forEach((String key, CallKeeper item) { - if (item.number == number) { - uuid = key; - return; - } - }); - return uuid; - } - - void setCallHeld(String callUUID, bool held) { + void setCallHeld(String? callUUID, bool? held) { calls[callUUID]!.held = held; } - void setCallMuted(String callUUID, bool muted) { + void setCallMuted(String? callUUID, bool? muted) { calls[callUUID]!.muted = muted; } @@ -164,7 +140,7 @@ class CallKeepManager { final callUUID = event.callUUID; final number = event.handle; Logs().v('[displayIncomingCall] $callUUID number: $number'); - addCall(callUUID!, CallKeeper(this, callUUID, number!, null)); + // addCall(callUUID, CallKeeper(this null)); } void onPushKitToken(CallKeepPushKitToken event) { @@ -174,14 +150,16 @@ class CallKeepManager { Future initialize() async { _callKeep.on(CallKeepPerformAnswerCallAction(), answerCall); _callKeep.on(CallKeepDidPerformDTMFAction(), didPerformDTMFAction); - _callKeep.on( - CallKeepDidReceiveStartCallAction(), didReceiveStartCallAction); + _callKeep.on(CallKeepDidToggleHoldAction(), didToggleHoldCallAction); _callKeep.on( - CallKeepDidPerformSetMutedCallAction(), didPerformSetMutedCallAction); + CallKeepDidPerformSetMutedCallAction(), + didPerformSetMutedCallAction, + ); _callKeep.on(CallKeepPerformEndCallAction(), endCall); _callKeep.on(CallKeepPushKitToken(), onPushKitToken); _callKeep.on(CallKeepDidDisplayIncomingCall(), didDisplayIncomingCall); + Logs().i('[VOIP] Initialized'); } Future hangup(String callUUID) async { @@ -193,10 +171,10 @@ class CallKeepManager { await _callKeep.rejectCall(callUUID); } - Future answer(String callUUID) async { - final keeper = calls[callUUID]; - if (!keeper!.connected) { - await _callKeep.answerIncomingCall(callUUID); + Future answer(String? callUUID) async { + final keeper = calls[callUUID]!; + if (!keeper.connected) { + await _callKeep.answerIncomingCall(callUUID!); keeper.connected = true; } } @@ -212,27 +190,74 @@ class CallKeepManager { } Future updateDisplay(String callUUID) async { - final number = calls[callUUID]!.number; // Workaround because Android doesn't display well displayName, se we have to switch ... if (isIOS) { - await _callKeep.updateDisplay(callUUID, - displayName: 'New Name', handle: number); + await _callKeep.updateDisplay( + callUUID, + displayName: 'New Name', + handle: callUUID, + ); } else { - await _callKeep.updateDisplay(callUUID, - displayName: number, handle: 'New Name'); + await _callKeep.updateDisplay( + callUUID, + displayName: callUUID, + handle: 'New Name', + ); } } Future displayIncomingCall(CallSession call) async { - final callUUID = newUUID(); - final callKeeper = CallKeeper(this, callUUID, call.displayName!, call); - addCall(callUUID, callKeeper); - await _callKeep.displayIncomingCall(callUUID, call.displayName!, - handleType: 'number', hasVideo: call.type == CallType.kVideo); + final callKeeper = CallKeeper(this, call); + addCall(call.callId, callKeeper); + await _callKeep.displayIncomingCall( + call.callId, + '${call.room.getLocalizedDisplayname()} (FluffyChat)', + localizedCallerName: + '${call.room.getLocalizedDisplayname()} (FluffyChat)', + handleType: 'number', + hasVideo: call.type == CallType.kVideo, + ); return callKeeper; } Future checkoutPhoneAccountSetting(BuildContext context) async { + showDialog( + context: context, + barrierDismissible: true, + useRootNavigator: false, + builder: (_) => AlertDialog( + title: Text(L10n.of(context).callingPermissions), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + onTap: () => openCallingAccountsPage(context), + title: Text(L10n.of(context).callingAccount), + subtitle: Text(L10n.of(context).callingAccountDetails), + trailing: const Icon(Icons.phone), + ), + const Divider(), + ListTile( + onTap: () => FlutterForegroundTask.openSystemAlertWindowSettings( + forceOpen: true, + ), + title: Text(L10n.of(context).appearOnTop), + subtitle: Text(L10n.of(context).appearOnTopDetails), + trailing: const Icon(Icons.file_upload_rounded), + ), + const Divider(), + ListTile( + onTap: () => openAppSettings(), + title: Text(L10n.of(context).otherCallingPermissions), + trailing: const Icon(Icons.mic), + ), + ], + ), + ), + ); + } + + void openCallingAccountsPage(BuildContext context) async { await _callKeep.setup(context, { 'ios': { 'appName': appName, @@ -240,8 +265,11 @@ class CallKeepManager { 'android': alertOptions, }); final hasPhoneAccount = await _callKeep.hasPhoneAccount(); + Logs().e(hasPhoneAccount.toString()); if (!hasPhoneAccount) { await _callKeep.hasDefaultPhoneAccount(context, alertOptions); + } else { + await _callKeep.openPhoneAccounts(); } } @@ -250,8 +278,9 @@ class CallKeepManager { final callUUID = event.callUUID; final keeper = calls[event.callUUID]!; if (!keeper.connected) { + Logs().e('answered'); // Answer Call - keeper.call!.answer(); + keeper.call.answer(); keeper.connected = true; } Timer(const Duration(seconds: 1), () { @@ -261,52 +290,36 @@ class CallKeepManager { Future endCall(CallKeepPerformEndCallAction event) async { final keeper = calls[event.callUUID]; - keeper?.call?.hangup(); - removeCall(event.callUUID!); + keeper?.call.hangup(reason: CallErrorCode.userHangup); + removeCall(event.callUUID); } Future didPerformDTMFAction(CallKeepDidPerformDTMFAction event) async { final keeper = calls[event.callUUID]!; - keeper.call?.sendDTMF(event.digits!); - } - - Future didReceiveStartCallAction( - CallKeepDidReceiveStartCallAction event) async { - if (event.handle == null) { - // @TODO: sometime we receive `didReceiveStartCallAction` with handle` undefined` - return; - } - final callUUID = event.callUUID ?? newUUID(); - if (event.callUUID == null) { - final call = - await _voipPlugin!.voip.inviteToCall(event.handle!, CallType.kVideo); - addCall(callUUID, CallKeeper(this, callUUID, call.displayName!, call)); - } - await _callKeep.startCall(callUUID, event.handle!, event.handle!); - Timer(const Duration(seconds: 1), () { - _callKeep.setCurrentCallActive(callUUID); - }); + keeper.call.sendDTMF(event.digits!); } Future didPerformSetMutedCallAction( - CallKeepDidPerformSetMutedCallAction event) async { - final keeper = calls[event.callUUID]!; - if (event.muted ?? false) { - keeper.call?.setMicrophoneMuted(true); + CallKeepDidPerformSetMutedCallAction event, + ) async { + final keeper = calls[event.callUUID]; + if (event.muted!) { + keeper!.call.setMicrophoneMuted(true); } else { - keeper.call?.setMicrophoneMuted(false); + keeper!.call.setMicrophoneMuted(false); } - setCallMuted(event.callUUID!, event.muted!); + setCallMuted(event.callUUID, event.muted); } Future didToggleHoldCallAction( - CallKeepDidToggleHoldAction event) async { - final keeper = calls[event.callUUID]!; - if (event.hold ?? false) { - keeper.call?.setRemoteOnHold(true); + CallKeepDidToggleHoldAction event, + ) async { + final keeper = calls[event.callUUID]; + if (event.hold!) { + keeper!.call.setRemoteOnHold(true); } else { - keeper.call?.setRemoteOnHold(false); + keeper!.call.setRemoteOnHold(false); } - setCallHeld(event.callUUID!, event.hold!); + setCallHeld(event.callUUID, event.hold); } } diff --git a/lib/utils/voip/user_media_manager.dart b/lib/utils/voip/user_media_manager.dart index 874da93ee1..03ecd60305 100644 --- a/lib/utils/voip/user_media_manager.dart +++ b/lib/utils/voip/user_media_manager.dart @@ -16,9 +16,11 @@ class UserMediaManager { AudioPlayer? _assetsAudioPlayer; + final FlutterRingtonePlayer _flutterRingtonePlayer = FlutterRingtonePlayer(); + Future startRingingTone() async { if (PlatformInfos.isMobile) { - await FlutterRingtonePlayer.playRingtone(volume: 80); + await _flutterRingtonePlayer.playRingtone(volume: 80); } else if ((kIsWeb || PlatformInfos.isMacOS) && _assetsAudioPlayer != null) { const path = 'assets/sounds/phone.ogg'; @@ -31,7 +33,7 @@ class UserMediaManager { Future stopRingingTone() async { if (PlatformInfos.isMobile) { - await FlutterRingtonePlayer.stop(); + await _flutterRingtonePlayer.stop(); } await _assetsAudioPlayer?.stop(); _assetsAudioPlayer = null; diff --git a/lib/utils/voip/video_renderer.dart b/lib/utils/voip/video_renderer.dart new file mode 100644 index 0000000000..afdd9be2ec --- /dev/null +++ b/lib/utils/voip/video_renderer.dart @@ -0,0 +1,86 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:matrix/matrix.dart'; + +class VideoRenderer extends StatefulWidget { + final WrappedMediaStream? stream; + final bool mirror; + final RTCVideoViewObjectFit fit; + + const VideoRenderer( + this.stream, { + this.mirror = false, + this.fit = RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, + super.key, + }); + + @override + State createState() => _VideoRendererState(); +} + +class _VideoRendererState extends State { + RTCVideoRenderer? _renderer; + bool _rendererReady = false; + MediaStream? get mediaStream => widget.stream?.stream; + StreamSubscription? _streamChangeSubscription; + + Future _initializeRenderer() async { + _renderer ??= RTCVideoRenderer(); + await _renderer!.initialize(); + _renderer!.srcObject = mediaStream; + return _renderer!; + } + + void disposeRenderer() { + try { + _renderer?.srcObject = null; + _renderer?.dispose(); + _renderer = null; + // ignore: empty_catches + } catch (e) {} + } + + @override + void initState() { + _streamChangeSubscription = + widget.stream?.onStreamChanged.stream.listen((stream) { + setState(() { + _renderer?.srcObject = stream; + }); + }); + setupRenderer(); + super.initState(); + } + + Future setupRenderer() async { + await _initializeRenderer(); + setState(() => _rendererReady = true); + } + + @override + void dispose() { + _streamChangeSubscription?.cancel(); + disposeRenderer(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => !_rendererReady + ? Container() + : Builder( + key: widget.key, + builder: (ctx) { + return RTCVideoView( + _renderer!, + mirror: widget.mirror, + filterQuality: FilterQuality.medium, + objectFit: widget.fit, + placeholderBuilder: (_) => + Container(color: Colors.white.withAlpha(45)), + ); + }, + ); +} diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index c14207214e..6d0c06dcdd 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -3,72 +3,48 @@ import 'dart:core'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc_impl; import 'package:matrix/matrix.dart'; import 'package:webrtc_interface/webrtc_interface.dart' hide Navigator; +import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/dialer/dialer.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import '../../utils/voip/callkeep_manager.dart'; import '../../utils/voip/user_media_manager.dart'; +import '../widgets/matrix.dart'; -class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { - VoipPlugin({required this.client, required this.context}) { +class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { + final MatrixState matrix; + Client get client => matrix.client; + VoipPlugin(this.matrix) { voip = VoIP(client, this); - try { - Connectivity() - .onConnectivityChanged - .listen(_handleNetworkChanged) - .onError((e) => _currentConnectivity = ConnectivityResult.none); - } catch (e, s) { - Logs().w('Could not subscribe network updates', e, s); - } - Connectivity() - .checkConnectivity() - .then((result) => _currentConnectivity = result) - .catchError((e) => _currentConnectivity = ConnectivityResult.none); if (!kIsWeb) { final wb = WidgetsBinding.instance; wb.addObserver(this); - didChangeAppLifecycleState(wb.lifecycleState!); + didChangeAppLifecycleState(wb.lifecycleState); } } - - final Client client; bool background = false; bool speakerOn = false; late VoIP voip; - ConnectivityResult? _currentConnectivity; - ValueChanged? onIncomingCall; OverlayEntry? overlayEntry; - - // hacky workaround: in order to have [Overlay.of] working on web, the context - // mus explicitly be re-assigned - // - // hours wasted: 5 - BuildContext context; - - void _handleNetworkChanged(ConnectivityResult result) async { - /// Got a new connectivity status! - if (_currentConnectivity != result) { - voip.calls.forEach((_, sess) { - sess.restartIce(); - }); - } - _currentConnectivity = result; - } + BuildContext get context => matrix.context; @override - void didChangeAppLifecycleState(AppLifecycleState state) { - Logs().v('AppLifecycleState = $state'); - background = !(state != AppLifecycleState.detached && - state != AppLifecycleState.paused); + void didChangeAppLifecycleState(AppLifecycleState? state) { + background = (state == AppLifecycleState.detached || + state == AppLifecycleState.paused); } - void addCallingOverlay( - BuildContext context, String callId, CallSession call) { + void addCallingOverlay(String callId, CallSession call) { + final context = + kIsWeb ? ChatList.contextForVoip! : this.context; // web is weird + if (overlayEntry != null) { - Logs().w('[VOIP] addCallingOverlay: The call session already exists?'); - overlayEntry?.remove(); + Logs().e('[VOIP] addCallingOverlay: The call session already exists?'); + overlayEntry!.remove(); } // Overlay.of(context) is broken on web // falling back on a dialog @@ -86,42 +62,39 @@ class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { } else { overlayEntry = OverlayEntry( builder: (_) => Calling( - context: context, - client: client, - callId: callId, - call: call, - onClear: () { - overlayEntry?.remove(); - overlayEntry = null; - }), + context: context, + client: client, + callId: callId, + call: call, + onClear: () { + overlayEntry?.remove(); + overlayEntry = null; + }, + ), ); - Overlay.of(context)!.insert(overlayEntry!); + Overlay.of(context).insert(overlayEntry!); } } @override MediaDevices get mediaDevices => webrtc_impl.navigator.mediaDevices; - @override - bool get isBackgroud => background; - @override bool get isWeb => kIsWeb; @override Future createPeerConnection( - Map configuration, - [Map constraints = const {}]) => + Map configuration, [ + Map constraints = const {}, + ]) => webrtc_impl.createPeerConnection(configuration, constraints); - @override - VideoRenderer createRenderer() { - return webrtc_impl.RTCVideoRenderer(); - } + Future get hasCallingAccount async => + kIsWeb ? false : await CallKeepManager().hasPhoneAccountEnabled; @override - void playRingtone() async { - if (!background) { + Future playRingtone() async { + if (!background && !await hasCallingAccount) { try { await UserMediaManager().startRingingTone(); } catch (_) {} @@ -129,8 +102,8 @@ class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { } @override - void stopRingtone() async { - if (!background) { + Future stopRingtone() async { + if (!background && !await hasCallingAccount) { try { await UserMediaManager().stopRingingTone(); } catch (_) {} @@ -138,36 +111,94 @@ class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { } @override - void handleNewCall(CallSession call) async { - /// Popup CallingPage for incoming call. - if (!background) { - addCallingOverlay(context, call.callId, call); + Future handleNewCall(CallSession call) async { + if (PlatformInfos.isAndroid) { + // probably works on ios too + final hasCallingAccount = await CallKeepManager().hasPhoneAccountEnabled; + if (call.direction == CallDirection.kIncoming && + hasCallingAccount && + call.type == CallType.kVoice) { + ///Popup native telecom manager call UI for incoming call. + final callKeeper = CallKeeper(CallKeepManager(), call); + CallKeepManager().addCall(call.callId, callKeeper); + await CallKeepManager().showCallkitIncoming(call); + return; + } else { + try { + final wasForeground = await FlutterForegroundTask.isAppOnForeground; + + await matrix.store.setString( + 'wasForeground', + wasForeground == true ? 'true' : 'false', + ); + FlutterForegroundTask.setOnLockScreenVisibility(true); + FlutterForegroundTask.wakeUpScreen(); + FlutterForegroundTask.launchApp(); + } catch (e) { + Logs().e('VOIP foreground failed $e'); + } + // use fallback flutter call pages for outgoing and video calls. + addCallingOverlay(call.callId, call); + try { + if (!hasCallingAccount) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'No calling accounts found (used for native calls UI)', + ), + ), + ); + } + } catch (e) { + Logs().e('failed to show snackbar'); + } + } } else { - onIncomingCall?.call(call); + addCallingOverlay(call.callId, call); } } @override - void handleCallEnded(CallSession session) async { + Future handleCallEnded(CallSession session) async { if (overlayEntry != null) { - overlayEntry?.remove(); + overlayEntry!.remove(); overlayEntry = null; + if (PlatformInfos.isAndroid) { + FlutterForegroundTask.setOnLockScreenVisibility(false); + FlutterForegroundTask.stopService(); + final wasForeground = matrix.store.getString('wasForeground'); + wasForeground == 'false' ? FlutterForegroundTask.minimizeApp() : null; + } } } @override - void handleGroupCallEnded(GroupCall groupCall) { + Future handleGroupCallEnded(GroupCallSession groupCall) async { // TODO: implement handleGroupCallEnded } @override - void handleNewGroupCall(GroupCall groupCall) { + Future handleNewGroupCall(GroupCallSession groupCall) async { // TODO: implement handleNewGroupCall } @override - Future cloneStream(webrtc_impl.MediaStream stream) { - // TODO: implement cloneStream + // TODO: implement canHandleNewCall + bool get canHandleNewCall => + voip.currentCID == null && voip.currentGroupCID == null; + + @override + Future handleMissedCall(CallSession session) async { + // TODO: implement handleMissedCall + } + + @override + // TODO: implement keyProvider + EncryptionKeyProvider? get keyProvider => throw UnimplementedError(); + + @override + Future registerListeners(CallSession session) { + // TODO: implement registerListeners throw UnimplementedError(); } } diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart new file mode 100644 index 0000000000..12ce7c8aef --- /dev/null +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -0,0 +1,38 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class AdaptiveDialogAction extends StatelessWidget { + final VoidCallback? onPressed; + final bool autofocus; + final Widget child; + + const AdaptiveDialogAction({ + super.key, + required this.onPressed, + required this.child, + this.autofocus = false, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.linux: + case TargetPlatform.windows: + return TextButton( + onPressed: onPressed, + autofocus: autofocus, + child: child, + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return CupertinoDialogAction( + onPressed: onPressed, + isDefaultAction: autofocus, + child: child, + ); + } + } +} diff --git a/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart b/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart new file mode 100644 index 0000000000..7e67098716 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart @@ -0,0 +1,116 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +Future showModalActionPopup({ + required BuildContext context, + required List> actions, + String? title, + String? message, + String? cancelLabel, + bool useRootNavigator = true, +}) { + final theme = Theme.of(context); + + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.windows: + case TargetPlatform.linux: + return showModalBottomSheet( + isScrollControlled: true, + useRootNavigator: useRootNavigator, + context: context, + clipBehavior: Clip.hardEdge, + constraints: BoxConstraints( + maxWidth: 512, + maxHeight: MediaQuery.of(context).size.height - 32, + ), + builder: (context) => ListView( + shrinkWrap: true, + children: [ + if (title != null || message != null) ...[ + ListTile( + title: title == null + ? null + : Text( + title, + style: theme.textTheme.labelSmall, + ), + subtitle: message == null ? null : Text(message), + ), + const Divider(height: 1), + ], + ...actions.map( + (action) => ListTile( + leading: action.icon, + title: Text( + action.label, + maxLines: 1, + style: action.isDestructive + ? TextStyle( + color: theme.colorScheme.error, + fontWeight: + action.isDefaultAction ? FontWeight.bold : null, + ) + : null, + ), + onTap: () => Navigator.of(context).pop(action.value), + ), + ), + if (cancelLabel != null) ...[ + const Divider(height: 1), + ListTile( + title: Text(cancelLabel), + onTap: () => Navigator.of(context).pop(null), + ), + ], + ], + ), + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return showCupertinoModalPopup( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 512), + child: CupertinoActionSheet( + title: title == null ? null : Text(title), + message: message == null ? null : Text(message), + cancelButton: cancelLabel == null + ? null + : CupertinoActionSheetAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(cancelLabel), + ), + actions: actions + .map( + (action) => CupertinoActionSheetAction( + isDestructiveAction: action.isDestructive, + isDefaultAction: action.isDefaultAction, + onPressed: () => Navigator.of(context).pop(action.value), + child: Text(action.label, maxLines: 1), + ), + ) + .toList(), + ), + ), + ); + } +} + +class AdaptiveModalAction { + final String label; + final T value; + Icon? icon; + final bool isDefaultAction; + final bool isDestructive; + + AdaptiveModalAction({ + required this.label, + required this.value, + this.icon, + this.isDefaultAction = false, + this.isDestructive = false, + }); +} diff --git a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart new file mode 100644 index 0000000000..c8fb53c382 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +enum OkCancelResult { ok, cancel } + +Future showOkCancelAlertDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + String? cancelLabel, + bool isDestructive = false, + bool useRootNavigator = true, +}) => + showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: message == null ? null : Text(message), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context) + .pop(OkCancelResult.cancel), + child: Text(cancelLabel ?? L10n.of(context).cancel), + ), + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(OkCancelResult.ok), + autofocus: true, + child: Text( + okLabel ?? L10n.of(context).ok, + style: isDestructive + ? TextStyle(color: Theme.of(context).colorScheme.error) + : null, + ), + ), + ], + ), + ); + +Future showOkAlertDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + bool useRootNavigator = true, +}) => + showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: message == null ? null : Text(message), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(OkCancelResult.ok), + autofocus: true, + child: Text(okLabel ?? L10n.of(context).close), + ), + ], + ), + ); diff --git a/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart new file mode 100644 index 0000000000..3a0f02e0bf --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +Future showTextInputDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + String? cancelLabel, + bool useRootNavigator = true, + String? hintText, + String? labelText, + String? initialText, + String? prefixText, + String? suffixText, + bool obscureText = false, + bool isDestructive = false, + int? minLines, + int? maxLines, + String? Function(String input)? validator, + TextInputType? keyboardType, + int? maxLength, + bool autocorrect = true, +}) => + showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) { + final controller = TextEditingController(text: initialText); + final error = ValueNotifier(null); + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 512), + child: AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (message != null) + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(message), + ), + ), + ValueListenableBuilder( + valueListenable: error, + builder: (context, error, _) { + return TextField( + controller: controller, + obscureText: obscureText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + autocorrect: autocorrect, + decoration: InputDecoration( + errorText: error, + hintText: hintText, + labelText: labelText, + prefixText: prefixText, + suffixText: suffixText, + ), + ); + }, + ), + ], + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(cancelLabel ?? L10n.of(context).cancel), + ), + AdaptiveDialogAction( + onPressed: () { + final input = controller.text; + final errorText = validator?.call(input); + if (errorText != null) { + error.value = errorText; + return; + } + Navigator.of(context).pop(input); + }, + autofocus: true, + child: Text( + okLabel ?? L10n.of(context).ok, + style: isDestructive + ? TextStyle(color: Theme.of(context).colorScheme.error) + : null, + ), + ), + ], + ), + ); + }, + ); diff --git a/lib/widgets/adaptive_flat_button.dart b/lib/widgets/adaptive_flat_button.dart deleted file mode 100644 index 7faa7eed48..0000000000 --- a/lib/widgets/adaptive_flat_button.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; - -class AdaptiveFlatButton extends StatelessWidget { - final String label; - final Color? textColor; - final void Function()? onPressed; - - const AdaptiveFlatButton({ - Key? key, - required this.label, - this.textColor, - this.onPressed, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - if (PlatformInfos.isCupertinoStyle) { - return CupertinoDialogAction( - onPressed: onPressed, - textStyle: textColor != null ? TextStyle(color: textColor) : null, - child: Text(label), - ); - } - return TextButton( - onPressed: onPressed, - child: Text( - label, - style: TextStyle(color: textColor), - ), - ); - } -} diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart new file mode 100644 index 0000000000..d337358d7c --- /dev/null +++ b/lib/widgets/app_lock.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; +import 'package:provider/provider.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/widgets/lock_screen.dart'; + +class AppLockWidget extends StatefulWidget { + const AppLockWidget({ + required this.child, + required this.pincode, + required this.clients, + super.key, + }); + + final List clients; + final String? pincode; + final Widget child; + + @override + State createState() => AppLock(); +} + +class AppLock extends State with WidgetsBindingObserver { + String? _pincode; + bool _isLocked = false; + bool _paused = false; + bool get isActive => + _pincode != null && + int.tryParse(_pincode!) != null && + _pincode!.length == 4 && + !_paused; + + @override + void initState() { + _pincode = widget.pincode; + _isLocked = isActive; + super.initState(); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback(_checkLoggedIn); + } + + void _checkLoggedIn(_) async { + if (widget.clients.any((client) => client.isLogged())) return; + + await changePincode(null); + setState(() { + _isLocked = false; + }); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (isActive && + state == AppLifecycleState.hidden && + !_isLocked && + isActive) { + showLockScreen(); + } + } + + bool get isLocked => _isLocked; + + Future changePincode(String? pincode) async { + await const FlutterSecureStorage().write( + key: SettingKeys.appLockKey, + value: pincode, + ); + _pincode = pincode; + return; + } + + bool unlock(String pincode) { + final isCorrect = pincode == _pincode; + if (isCorrect) { + setState(() { + _isLocked = false; + }); + } + return isCorrect; + } + + void showLockScreen() => setState(() { + _isLocked = true; + }); + + Future pauseWhile(Future future) async { + _paused = true; + try { + return await future; + } finally { + _paused = false; + } + } + + static AppLock of(BuildContext context) => Provider.of( + context, + listen: false, + ); + + @override + Widget build(BuildContext context) => Provider( + create: (_) => this, + child: Stack( + fit: StackFit.expand, + children: [ + widget.child, + if (isLocked) const LockScreen(), + ], + ), + ); +} diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index 0d90f31dd3..c6bcaf9f13 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/utils/string_color.dart'; -import 'matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; class Avatar extends StatelessWidget { final Uri? mxContent; @@ -13,7 +13,11 @@ class Avatar extends StatelessWidget { final void Function()? onTap; static const double defaultSize = 44; final Client? client; - final double fontSize; + final String? presenceUserId; + final Color? presenceBackgroundColor; + final BorderRadius? borderRadius; + final IconData? icon; + final BorderSide? border; const Avatar({ this.mxContent, @@ -21,17 +25,18 @@ class Avatar extends StatelessWidget { this.size = defaultSize, this.onTap, this.client, - this.fontSize = 18, - Key? key, - }) : super(key: key); + this.presenceUserId, + this.presenceBackgroundColor, + this.borderRadius, + this.border, + this.icon, + super.key, + }); @override Widget build(BuildContext context) { - final src = mxContent?.getThumbnail( - client ?? Matrix.of(context).client, - width: size * MediaQuery.of(context).devicePixelRatio, - height: size * MediaQuery.of(context).devicePixelRatio, - ); + final theme = Theme.of(context); + var fallbackLetters = '@'; final name = this.name; if (name != null) { @@ -44,44 +49,98 @@ class Avatar extends StatelessWidget { final noPic = mxContent == null || mxContent.toString().isEmpty || mxContent.toString() == 'null'; - final textWidget = Center( + final textColor = name?.lightColorAvatar; + final textWidget = Container( + color: textColor, + alignment: Alignment.center, child: Text( fallbackLetters, style: TextStyle( - color: noPic ? name?.darkColor : null, - fontSize: fontSize, + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: (size / 3).roundToDouble(), ), ), ); - final borderRadius = BorderRadius.circular(size / 2); - final container = Container( - decoration: BoxDecoration( - border: Border.all(color: Theme.of(context).dividerColor), - borderRadius: borderRadius, - ), - child: ClipRRect( - borderRadius: borderRadius, - child: Container( + final borderRadius = this.borderRadius ?? BorderRadius.circular(size / 2); + final presenceUserId = this.presenceUserId; + final container = Stack( + children: [ + SizedBox( width: size, height: size, - color: - noPic ? name?.lightColor : Theme.of(context).secondaryHeaderColor, - child: noPic - ? textWidget - : CachedNetworkImage( - imageUrl: src.toString(), - fit: BoxFit.cover, - width: size, - height: size, - placeholder: (c, s) => textWidget, - errorWidget: (c, s, d) => Stack( - children: [ - textWidget, - ], + child: Material( + color: theme.brightness == Brightness.light + ? Colors.white + : Colors.black, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, + side: border ?? BorderSide.none, + ), + clipBehavior: Clip.hardEdge, + child: noPic + ? textWidget + : MxcImage( + client: client, + key: ValueKey(mxContent.toString()), + cacheKey: '${mxContent}_$size', + uri: mxContent, + fit: BoxFit.cover, + width: size, + height: size, + placeholder: (_) => Center( + child: Icon( + Icons.person_2, + color: theme.colorScheme.tertiary, + size: size / 1.5, + ), + ), ), - ), + ), ), - ), + if (presenceUserId != null) + PresenceBuilder( + client: client, + userId: presenceUserId, + builder: (context, presence) { + if (presence == null || + (presence.presence == PresenceType.offline && + presence.lastActiveTimestamp == null)) { + return const SizedBox.shrink(); + } + final dotColor = presence.presence.isOnline + ? Colors.green + : presence.presence.isUnavailable + ? Colors.orange + : Colors.grey; + return Positioned( + bottom: -3, + right: -3, + child: Container( + width: 16, + height: 16, + decoration: BoxDecoration( + color: presenceBackgroundColor ?? theme.colorScheme.surface, + borderRadius: BorderRadius.circular(32), + ), + alignment: Alignment.center, + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: dotColor, + borderRadius: BorderRadius.circular(16), + border: Border.all( + width: 1, + color: theme.colorScheme.surface, + ), + ), + ), + ), + ); + }, + ), + ], ); if (onTap == null) return container; return InkWell( diff --git a/lib/widgets/blur_hash.dart b/lib/widgets/blur_hash.dart new file mode 100644 index 0000000000..d4ad1dd47a --- /dev/null +++ b/lib/widgets/blur_hash.dart @@ -0,0 +1,104 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:blurhash_dart/blurhash_dart.dart' as b; +import 'package:image/image.dart' as image; + +class BlurHash extends StatefulWidget { + final double width; + final double height; + final String blurhash; + final BoxFit fit; + + const BlurHash({ + super.key, + String? blurhash, + required this.width, + required this.height, + this.fit = BoxFit.cover, + }) : blurhash = blurhash ?? 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + + @override + State createState() => _BlurHashState(); +} + +class _BlurHashState extends State { + Uint8List? _data; + + static Future getBlurhashData( + BlurhashData blurhashData, + ) async { + final blurhash = b.BlurHash.decode(blurhashData.hsh); + final img = blurhash.toImage(blurhashData.w, blurhashData.h); + return Uint8List.fromList(image.encodePng(img)); + } + + Future _computeBlurhashData() async { + if (_data != null) return _data!; + final ratio = widget.width / widget.height; + var width = 32; + var height = 32; + if (ratio > 1.0) { + height = (width / ratio).round(); + } else { + width = (height * ratio).round(); + } + + return _data ??= await compute( + getBlurhashData, + BlurhashData( + hsh: widget.blurhash, + w: width, + h: height, + ), + ); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _computeBlurhashData(), + initialData: _data, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return Container( + width: widget.width, + height: widget.height, + color: Theme.of(context).colorScheme.onInverseSurface, + ); + } + return Image.memory( + data, + fit: widget.fit, + width: widget.width, + height: widget.height, + ); + }, + ); + } +} + +class BlurhashData { + final String hsh; + final int w; + final int h; + + const BlurhashData({ + required this.hsh, + required this.w, + required this.h, + }); + + factory BlurhashData.fromJson(Map json) => BlurhashData( + hsh: json['hsh'], + w: json['w'], + h: json['h'], + ); + + Map toJson() => { + 'hsh': hsh, + 'w': w, + 'h': h, + }; +} diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index 34a589056c..a31b9e5a34 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -1,33 +1,28 @@ import 'dart:async'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/pages/chat/cupertino_widgets_bottom_sheet.dart'; -import 'package:fluffychat/pages/chat/edit_widgets_dialog.dart'; -import 'package:fluffychat/pages/chat/widgets_bottom_sheet.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'matrix.dart'; +enum ChatPopupMenuActions { details, mute, unmute, leave, search } + class ChatSettingsPopupMenu extends StatefulWidget { final Room room; final bool displayChatDetails; - const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {Key? key}) - : super(key: key); + const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {super.key}); @override - _ChatSettingsPopupMenuState createState() => _ChatSettingsPopupMenuState(); + ChatSettingsPopupMenuState createState() => ChatSettingsPopupMenuState(); } -class _ChatSettingsPopupMenuState extends State { +class ChatSettingsPopupMenuState extends State { StreamSubscription? notificationChangeSub; @override @@ -40,160 +35,132 @@ class _ChatSettingsPopupMenuState extends State { Widget build(BuildContext context) { notificationChangeSub ??= Matrix.of(context) .client - .onAccountData + .onSync .stream - .where((u) => u.type == 'm.push_rules') + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) .listen( (u) => setState(() {}), ); - final items = >[ - PopupMenuItem( - value: 'widgets', - child: Row( - children: [ - const Icon(Icons.widgets_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.matrixWidgets), - ], - ), - ), - widget.room.pushRuleState == PushRuleState.notify - ? PopupMenuItem( - value: 'mute', - child: Row( - children: [ - const Icon(Icons.notifications_off_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.muteChat), - ], - ), - ) - : PopupMenuItem( - value: 'unmute', - child: Row( - children: [ - const Icon(Icons.notifications_on_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.unmuteChat), - ], - ), - ), - PopupMenuItem( - value: 'leave', - child: Row( - children: [ - const Icon(Icons.delete_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.leave), - ], - ), - ), - ]; - if (widget.displayChatDetails) { - items.insert( - 0, - PopupMenuItem( - value: 'details', - child: Row( - children: [ - const Icon(Icons.info_outline_rounded), - const SizedBox(width: 12), - Text(L10n.of(context)!.chatDetails), - ], - ), - ), - ); - } return Stack( alignment: Alignment.center, children: [ - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.keyI - }, - helpLabel: L10n.of(context)!.chatDetails, - onKeysPressed: _showChatDetails, - ), - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.keyW - }, - helpLabel: L10n.of(context)!.matrixWidgets, - onKeysPressed: _showWidgets, - ), - PopupMenuButton( - onSelected: (String choice) async { + const SizedBox.shrink(), + PopupMenuButton( + onSelected: (choice) async { switch (choice) { - case 'widgets': - if (widget.room.widgets.isNotEmpty) { - _showWidgets(); - } else { - showDialog( - context: context, - builder: (context) => EditWidgetsDialog(room: widget.room), - useRootNavigator: false, - ); - } - break; - case 'leave': + case ChatPopupMenuActions.leave: final confirmed = await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).archiveRoomDescription, + isDestructive: true, ); if (confirmed == OkCancelResult.ok) { final success = await showFutureLoadingDialog( - context: context, future: () => widget.room.leave()); + context: context, + future: () => widget.room.leave(), + ); if (success.error == null) { - VRouter.of(context).to('/rooms'); + context.go('/rooms'); } } break; - case 'mute': + case ChatPopupMenuActions.mute: await showFutureLoadingDialog( - context: context, - future: () => widget.room - .setPushRuleState(PushRuleState.mentionsOnly)); + context: context, + future: () => + widget.room.setPushRuleState(PushRuleState.mentionsOnly), + ); break; - case 'unmute': + case ChatPopupMenuActions.unmute: await showFutureLoadingDialog( - context: context, - future: () => - widget.room.setPushRuleState(PushRuleState.notify)); + context: context, + future: () => + widget.room.setPushRuleState(PushRuleState.notify), + ); break; - case 'details': + case ChatPopupMenuActions.details: _showChatDetails(); break; + case ChatPopupMenuActions.search: + context.go('/rooms/${widget.room.id}/search'); + break; } }, - itemBuilder: (BuildContext context) => items, + itemBuilder: (BuildContext context) => [ + if (widget.displayChatDetails) + PopupMenuItem( + value: ChatPopupMenuActions.details, + child: Row( + children: [ + const Icon(Icons.info_outline_rounded), + const SizedBox(width: 12), + Text(L10n.of(context).chatDetails), + ], + ), + ), + if (widget.room.pushRuleState == PushRuleState.notify) + PopupMenuItem( + value: ChatPopupMenuActions.mute, + child: Row( + children: [ + const Icon(Icons.notifications_off_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).muteChat), + ], + ), + ) + else + PopupMenuItem( + value: ChatPopupMenuActions.unmute, + child: Row( + children: [ + const Icon(Icons.notifications_on_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).unmuteChat), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.search, + child: Row( + children: [ + const Icon(Icons.search_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).search), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.leave, + child: Row( + children: [ + const Icon(Icons.delete_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).leave), + ], + ), + ), + ], ), ], ); } - void _showWidgets() => [TargetPlatform.iOS, TargetPlatform.macOS] - .contains(Theme.of(context).platform) - ? showCupertinoModalPopup( - context: context, - builder: (context) => CupertinoWidgetsBottomSheet(room: widget.room), - ) - : showModalBottomSheet( - context: context, - builder: (context) => WidgetsBottomSheet(room: widget.room), - ); - void _showChatDetails() { - if (VRouter.of(context).path.endsWith('/details')) { - VRouter.of(context).toSegments(['rooms', widget.room.id]); + if (GoRouterState.of(context).uri.path.endsWith('/details')) { + context.go('/rooms/${widget.room.id}'); } else { - VRouter.of(context).toSegments(['rooms', widget.room.id, 'details']); + context.go('/rooms/${widget.room.id}/details'); } } } diff --git a/lib/widgets/connection_status_header.dart b/lib/widgets/connection_status_header.dart index 2bfc83e8e2..d12e252d43 100644 --- a/lib/widgets/connection_status_header.dart +++ b/lib/widgets/connection_status_header.dart @@ -5,17 +5,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import '../config/themes.dart'; import '../utils/localized_exception_extension.dart'; import 'matrix.dart'; class ConnectionStatusHeader extends StatefulWidget { - const ConnectionStatusHeader({Key? key}) : super(key: key); + const ConnectionStatusHeader({super.key}); @override - _ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState(); + ConnectionStatusHeaderState createState() => ConnectionStatusHeaderState(); } -class _ConnectionStatusHeaderState extends State { +class ConnectionStatusHeaderState extends State { late final StreamSubscription _onSyncSub; @override @@ -34,18 +35,21 @@ class _ConnectionStatusHeaderState extends State { @override Widget build(BuildContext context) { - final status = Matrix.of(context).client.onSyncStatus.value ?? + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + final status = client.onSyncStatus.value ?? const SyncStatusUpdate(SyncStatus.waitingForResponse); - final hide = Matrix.of(context).client.onSync.value != null && + final hide = client.onSync.value != null && status.status != SyncStatus.error && - Matrix.of(context).client.prevBatch != null; + client.prevBatch != null; return AnimatedContainer( - duration: const Duration(milliseconds: 200), - curve: Curves.bounceInOut, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, height: hide ? 0 : 36, clipBehavior: Clip.hardEdge, - decoration: BoxDecoration(color: Theme.of(context).colorScheme.surface), + decoration: const BoxDecoration(color: Colors.transparent), padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -63,7 +67,7 @@ class _ConnectionStatusHeaderState extends State { status.toLocalizedString(context), maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(color: Theme.of(context).colorScheme.onSurface), + style: TextStyle(color: theme.colorScheme.onSurface), ), ], ), @@ -75,15 +79,14 @@ extension on SyncStatusUpdate { String toLocalizedString(BuildContext context) { switch (status) { case SyncStatus.waitingForResponse: - return L10n.of(context)!.loadingPleaseWait; + return L10n.of(context).loadingPleaseWait; case SyncStatus.error: return ((error?.exception ?? Object()) as Object) .toLocalizedString(context); case SyncStatus.processing: case SyncStatus.cleaningUp: case SyncStatus.finished: - default: - return L10n.of(context)!.synchronizingPleaseWait; + return L10n.of(context).synchronizingPleaseWait; } } } diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart deleted file mode 100644 index a021d2acae..0000000000 --- a/lib/widgets/contacts_list.dart +++ /dev/null @@ -1,119 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/matrix_sdk_extensions.dart/client_presence_extension.dart'; -import '../utils/matrix_sdk_extensions.dart/presence_extension.dart'; - -class ContactsList extends StatefulWidget { - final TextEditingController searchController; - - const ContactsList({ - Key? key, - required this.searchController, - }) : super(key: key); - @override - _ContactsState createState() => _ContactsState(); -} - -class _ContactsState extends State { - StreamSubscription? _onSync; - - @override - void dispose() { - _onSync?.cancel(); - super.dispose(); - } - - DateTime _lastSetState = DateTime.now(); - Timer? _coolDown; - - void _updateView() { - _lastSetState = DateTime.now(); - setState(() {}); - } - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - _onSync ??= client.onSync.stream.listen((_) { - if (DateTime.now().millisecondsSinceEpoch - - _lastSetState.millisecondsSinceEpoch < - 1000) { - _coolDown?.cancel(); - _coolDown = Timer(const Duration(seconds: 1), _updateView); - } else { - _updateView(); - } - }); - final contactList = Matrix.of(context) - .client - .contactList - .where((p) => p.userid - .toLowerCase() - .contains(widget.searchController.text.toLowerCase())) - .toList(); - return ListView.builder( - itemCount: contactList.length, - itemBuilder: (_, i) => _ContactListTile(contact: contactList[i]), - ); - } -} - -class _ContactListTile extends StatelessWidget { - final CachedPresence contact; - - const _ContactListTile({Key? key, required this.contact}) : super(key: key); - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: Matrix.of(context).client.getProfileFromUserId(contact.userid), - builder: (context, snapshot) { - final displayname = snapshot.data?.displayName ?? - contact.userid.localpart ?? - 'No valid MXID'; - final avatarUrl = snapshot.data?.avatarUrl; - return ListTile( - leading: SizedBox( - width: Avatar.defaultSize, - height: Avatar.defaultSize, - child: Stack( - children: [ - Center( - child: Avatar( - mxContent: avatarUrl, - name: displayname, - ), - ), - Align( - alignment: Alignment.bottomRight, - child: Icon( - Icons.circle, - color: contact.color, - size: 12, - ), - ), - ], - ), - ), - title: Text(displayname), - subtitle: Text(contact.getLocalizedStatusMessage(context), - style: contact.statusMsg?.isNotEmpty ?? false - ? TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ) - : null), - onTap: () => VRouter.of(context).toSegments([ - 'rooms', - Matrix.of(context).client.getDirectChatFromUserId(contact.userid)! - ]), - ); - }); - } -} diff --git a/lib/widgets/content_banner.dart b/lib/widgets/content_banner.dart deleted file mode 100644 index d1a6b71793..0000000000 --- a/lib/widgets/content_banner.dart +++ /dev/null @@ -1,106 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:matrix/matrix.dart'; - -import 'matrix.dart'; - -class ContentBanner extends StatelessWidget { - final Uri? mxContent; - final double height; - final IconData defaultIcon; - final bool loading; - final void Function()? onEdit; - final Client? client; - final double opacity; - final String heroTag; - - const ContentBanner( - {this.mxContent, - this.height = 400, - this.defaultIcon = Icons.account_circle_outlined, - this.loading = false, - this.onEdit, - this.client, - this.opacity = 0.75, - this.heroTag = 'content_banner', - Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final onEdit = this.onEdit; - return Container( - height: height, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondaryContainer, - ), - child: Stack( - children: [ - Positioned( - left: 0, - right: 0, - top: 0, - bottom: 0, - child: Opacity( - opacity: opacity, - child: (!loading) - ? LayoutBuilder(builder: - (BuildContext context, BoxConstraints constraints) { - // #775 don't request new image resolution on every resize - // by rounding up to the next multiple of stepSize - const stepSize = 300; - final bannerSize = - constraints.maxWidth * window.devicePixelRatio; - final steppedBannerSize = - (bannerSize / stepSize).ceil() * stepSize; - final src = mxContent?.getThumbnail( - client ?? Matrix.of(context).client, - width: steppedBannerSize, - height: steppedBannerSize, - method: ThumbnailMethod.scale, - animated: true, - ); - return Hero( - tag: heroTag, - child: CachedNetworkImage( - imageUrl: src.toString(), - height: 300, - fit: BoxFit.cover, - errorWidget: (c, m, e) => Icon( - defaultIcon, - size: 200, - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - ), - ); - }) - : Icon( - defaultIcon, - size: 200, - color: Theme.of(context).colorScheme.onSecondaryContainer, - ), - ), - ), - if (onEdit != null) - Container( - margin: const EdgeInsets.all(8), - alignment: Alignment.bottomRight, - child: FloatingActionButton( - mini: true, - onPressed: onEdit, - backgroundColor: Theme.of(context).backgroundColor, - foregroundColor: Theme.of(context).textTheme.bodyText1?.color, - child: const Icon(Icons.camera_alt_outlined), - ), - ), - ], - ), - ); - } -} diff --git a/lib/widgets/error_widget.dart b/lib/widgets/error_widget.dart new file mode 100644 index 0000000000..b14a18b31a --- /dev/null +++ b/lib/widgets/error_widget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/utils/error_reporter.dart'; + +class FluffyChatErrorWidget extends StatefulWidget { + final FlutterErrorDetails details; + const FluffyChatErrorWidget(this.details, {super.key}); + + @override + State createState() => _FluffyChatErrorWidgetState(); +} + +class _FluffyChatErrorWidgetState extends State { + static final Set knownExceptions = {}; + @override + void initState() { + super.initState(); + + if (knownExceptions.contains(widget.details.exception.toString())) { + return; + } + knownExceptions.add(widget.details.exception.toString()); + WidgetsBinding.instance.addPostFrameCallback((_) { + ErrorReporter(context, 'Error Widget').onErrorCallback( + widget.details.exception, + widget.details.stack, + ); + }); + } + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.orange, + child: Placeholder( + child: Center( + child: Material( + color: Colors.white.withAlpha(230), + borderRadius: BorderRadius.circular(8), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart new file mode 100644 index 0000000000..661fb33624 --- /dev/null +++ b/lib/widgets/fluffy_chat_app.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/routes.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/theme_builder.dart'; +import '../config/app_config.dart'; +import '../utils/custom_scroll_behaviour.dart'; +import 'matrix.dart'; + +class FluffyChatApp extends StatelessWidget { + final Widget? testWidget; + final List clients; + final String? pincode; + final SharedPreferences store; + + const FluffyChatApp({ + super.key, + this.testWidget, + required this.clients, + required this.store, + this.pincode, + }); + + /// getInitialLink may rereturn the value multiple times if this view is + /// opened multiple times for example if the user logs out after they logged + /// in with qr code or magic link. + static bool gotInitialLink = false; + + // Router must be outside of build method so that hot reload does not reset + // the current path. + static final GoRouter router = GoRouter( + routes: AppRoutes.routes, + debugLogDiagnostics: true, + ); + + @override + Widget build(BuildContext context) { + return ThemeBuilder( + builder: (context, themeMode, primaryColor) => MaterialApp.router( + title: AppConfig.applicationName, + themeMode: themeMode, + theme: FluffyThemes.buildTheme(context, Brightness.light, primaryColor), + darkTheme: + FluffyThemes.buildTheme(context, Brightness.dark, primaryColor), + scrollBehavior: CustomScrollBehavior(), + localizationsDelegates: L10n.localizationsDelegates, + supportedLocales: L10n.supportedLocales, + routerConfig: router, + builder: (context, child) => AppLockWidget( + pincode: pincode, + clients: clients, + // Need a navigator above the Matrix widget for + // displaying dialogs + child: Matrix( + clients: clients, + store: store, + child: testWidget ?? child, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart new file mode 100644 index 0000000000..61a137c256 --- /dev/null +++ b/lib/widgets/future_loading_dialog.dart @@ -0,0 +1,146 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:async/async.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +/// Displays a loading dialog which reacts to the given [future]. The dialog +/// will be dismissed and the value will be returned when the future completes. +/// If an error occured, then [onError] will be called and this method returns +/// null. +Future> showFutureLoadingDialog({ + required BuildContext context, + required Future Function() future, + String? title, + String? backLabel, + bool barrierDismissible = false, + bool delay = true, + ExceptionContext? exceptionContext, +}) async { + final futureExec = future(); + final resultFuture = ResultFuture(futureExec); + + if (delay) { + var i = 3; + while (i > 0) { + final result = resultFuture.result; + if (result != null) { + if (result.isError) break; + return result; + } + await Future.delayed(const Duration(milliseconds: 100)); + i--; + } + } + + final result = await showAdaptiveDialog>( + context: context, + barrierDismissible: barrierDismissible, + builder: (BuildContext context) => LoadingDialog( + future: futureExec, + title: title, + backLabel: backLabel, + exceptionContext: exceptionContext, + ), + ); + return result ?? + Result.error( + Exception('FutureDialog canceled'), + StackTrace.current, + ); +} + +class LoadingDialog extends StatefulWidget { + final String? title; + final String? backLabel; + final Future future; + final ExceptionContext? exceptionContext; + + const LoadingDialog({ + super.key, + required this.future, + this.title, + this.backLabel, + this.exceptionContext, + }); + @override + LoadingDialogState createState() => LoadingDialogState(); +} + +class LoadingDialogState extends State { + Object? exception; + StackTrace? stackTrace; + + @override + void initState() { + super.initState(); + widget.future.then( + (result) => Navigator.of(context).pop>(Result.value(result)), + onError: (e, s) => setState(() { + exception = e; + stackTrace = s; + }), + ); + } + + @override + Widget build(BuildContext context) { + final exception = this.exception; + final titleLabel = exception != null + ? exception.toLocalizedString(context, widget.exceptionContext) + : widget.title ?? L10n.of(context).loadingPleaseWait; + + return AlertDialog.adaptive( + title: exception == null + ? null + : Icon( + Icons.error_outline_outlined, + color: Theme.of(context).colorScheme.error, + size: 48, + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (exception == null) ...[ + const CircularProgressIndicator.adaptive(), + const SizedBox(width: 20), + ], + Expanded( + child: Text( + titleLabel, + maxLines: 4, + textAlign: exception == null ? TextAlign.left : null, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + actions: exception == null + ? null + : [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop>( + Result.error( + exception, + stackTrace, + ), + ), + child: Text(widget.backLabel ?? L10n.of(context).close), + ), + ], + ); + } +} + +extension DeprecatedApiAccessExtension on Result { + T? get result => asValue?.value; + + Object? get error => asError?.error; +} diff --git a/lib/widgets/hover_builder.dart b/lib/widgets/hover_builder.dart new file mode 100644 index 0000000000..f895d85322 --- /dev/null +++ b/lib/widgets/hover_builder.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class HoverBuilder extends StatefulWidget { + final Widget Function(BuildContext context, bool hovered) builder; + const HoverBuilder({required this.builder, super.key}); + + @override + State createState() => _HoverBuilderState(); +} + +class _HoverBuilderState extends State { + bool hovered = false; + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: (_) => hovered + ? null + : setState(() { + hovered = true; + }), + onExit: (_) => !hovered + ? null + : setState(() { + hovered = false; + }), + child: widget.builder(context, hovered), + ); + } +} diff --git a/lib/widgets/layouts/empty_page.dart b/lib/widgets/layouts/empty_page.dart index 0f3b2d428e..4a30abe7a1 100644 --- a/lib/widgets/layouts/empty_page.dart +++ b/lib/widgets/layouts/empty_page.dart @@ -3,41 +3,29 @@ import 'dart:math'; import 'package:flutter/material.dart'; class EmptyPage extends StatelessWidget { - final bool loading; - static const double _width = 200; - const EmptyPage({this.loading = false, Key? key}) : super(key: key); + static const double _width = 400; + const EmptyPage({super.key}); @override Widget build(BuildContext context) { - final _width = min(MediaQuery.of(context).size.width, EmptyPage._width); + final width = min(MediaQuery.of(context).size.width, EmptyPage._width) / 2; + final theme = Theme.of(context); return Scaffold( // Add invisible appbar to make status bar on Android tablets bright. appBar: AppBar( automaticallyImplyLeading: false, elevation: 0, - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + backgroundColor: Colors.transparent, ), extendBodyBehindAppBar: true, - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Center( - child: Hero( - tag: 'info-logo', - child: Image.asset( - 'assets/info-logo.png', - width: _width, - height: _width, - ), - ), - ), - if (loading) - Center( - child: SizedBox( - width: _width, - child: const LinearProgressIndicator(), - ), - ), - ], + body: Container( + alignment: Alignment.center, + child: Image.asset( + 'assets/logo_transparent.png', + color: theme.colorScheme.surfaceContainerHigh, + width: width, + height: width, + filterQuality: FilterQuality.medium, + ), ), ); } diff --git a/lib/widgets/layouts/loading_view.dart b/lib/widgets/layouts/loading_view.dart deleted file mode 100644 index 7015bcd97f..0000000000 --- a/lib/widgets/layouts/loading_view.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/widgets/layouts/empty_page.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class LoadingView extends StatelessWidget { - const LoadingView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback( - (_) => VRouter.of(context).to( - Matrix.of(context).widget.clients.any((client) => - client.onLoginStateChanged.value == LoginState.loggedIn) - ? '/rooms' - : '/home', - queryParameters: VRouter.of(context).queryParameters, - ), - ); - return const EmptyPage(loading: true); - } -} diff --git a/lib/widgets/layouts/login_scaffold.dart b/lib/widgets/layouts/login_scaffold.dart index 90cc5f35bd..64eecb7399 100644 --- a/lib/widgets/layouts/login_scaffold.dart +++ b/lib/widgets/layouts/login_scaffold.dart @@ -1,46 +1,126 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; class LoginScaffold extends StatelessWidget { final Widget body; final AppBar? appBar; + final bool enforceMobileMode; const LoginScaffold({ - Key? key, + super.key, required this.body, this.appBar, - }) : super(key: key); + this.enforceMobileMode = false, + }); @override Widget build(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback((_) { - SystemChrome.setSystemUIOverlayStyle( - const SystemUiOverlayStyle( - statusBarIconBrightness: Brightness.light, - statusBarColor: Colors.transparent, - systemNavigationBarContrastEnforced: false, - systemNavigationBarColor: Colors.black, - systemNavigationBarIconBrightness: Brightness.light, - ), + final theme = Theme.of(context); + + final isMobileMode = + enforceMobileMode || !FluffyThemes.isColumnMode(context); + if (isMobileMode) { + return Scaffold( + key: const Key('LoginScaffold'), + appBar: appBar, + body: SafeArea(child: body), ); - }); - return Scaffold( - appBar: appBar, - extendBodyBehindAppBar: true, - extendBody: true, - body: Container( - decoration: const BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage( - 'assets/login_wallpaper.png', + } + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + theme.colorScheme.surfaceContainerLow, + theme.colorScheme.surfaceContainer, + theme.colorScheme.surfaceContainerHighest, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: Column( + children: [ + const SizedBox(height: 16), + Expanded( + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + elevation: theme.appBarTheme.scrolledUnderElevation ?? 4, + shadowColor: theme.appBarTheme.shadowColor, + child: ConstrainedBox( + constraints: isMobileMode + ? const BoxConstraints() + : const BoxConstraints(maxWidth: 480, maxHeight: 640), + child: Scaffold( + key: const Key('LoginScaffold'), + appBar: appBar, + body: SafeArea(child: body), + ), + ), + ), + ), ), ), - ), - alignment: Alignment.center, - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 480), - child: body, + const _PrivacyButtons(mainAxisAlignment: MainAxisAlignment.center), + ], + ), + ); + } +} + +class _PrivacyButtons extends StatelessWidget { + final MainAxisAlignment mainAxisAlignment; + const _PrivacyButtons({required this.mainAxisAlignment}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final shadowTextStyle = TextStyle(color: theme.colorScheme.secondary); + return SizedBox( + height: 64, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: mainAxisAlignment, + children: [ + TextButton( + onPressed: () => launchUrlString(AppConfig.website), + child: Text( + L10n.of(context).website, + style: shadowTextStyle, + ), + ), + TextButton( + onPressed: () => launchUrlString(AppConfig.supportUrl), + child: Text( + L10n.of(context).help, + style: shadowTextStyle, + ), + ), + TextButton( + onPressed: () => launchUrlString(AppConfig.privacyUrl), + child: Text( + L10n.of(context).privacy, + style: shadowTextStyle, + ), + ), + TextButton( + onPressed: () => PlatformInfos.showDialog(context), + child: Text( + L10n.of(context).about, + style: shadowTextStyle, + ), + ), + ], ), ), ); diff --git a/lib/widgets/layouts/max_width_body.dart b/lib/widgets/layouts/max_width_body.dart index 804f317f5a..4e44cc796d 100644 --- a/lib/widgets/layouts/max_width_body.dart +++ b/lib/widgets/layouts/max_width_body.dart @@ -1,38 +1,57 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; + class MaxWidthBody extends StatelessWidget { - final Widget? child; + final Widget child; final double maxWidth; final bool withScrolling; + final EdgeInsets? innerPadding; const MaxWidthBody({ - this.child, + required this.child, this.maxWidth = 600, - this.withScrolling = false, - Key? key, - }) : super(key: key); + this.withScrolling = true, + this.innerPadding, + super.key, + }); @override Widget build(BuildContext context) { - return LayoutBuilder( - builder: (context, constraints) { - final padding = EdgeInsets.symmetric( - horizontal: max(0, (constraints.maxWidth - maxWidth) / 2), - ); - return withScrolling - ? SingleChildScrollView( - physics: const ScrollPhysics(), - child: Padding( - padding: padding, - child: child, - ), - ) - : Padding( - padding: padding, - child: child, - ); - }, + return SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + final theme = Theme.of(context); + + const desiredWidth = FluffyThemes.columnWidth * 1.5; + final body = constraints.maxWidth <= desiredWidth + ? child + : Container( + alignment: Alignment.topCenter, + padding: const EdgeInsets.all(32), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: Material( + elevation: theme.appBarTheme.scrolledUnderElevation ?? 4, + clipBehavior: Clip.hardEdge, + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + shadowColor: theme.appBarTheme.shadowColor, + child: child, + ), + ), + ); + if (!withScrolling) return body; + + return SingleChildScrollView( + padding: innerPadding, + physics: const ScrollPhysics(), + child: body, + ); + }, + ), ); } } diff --git a/lib/widgets/layouts/side_view_layout.dart b/lib/widgets/layouts/side_view_layout.dart deleted file mode 100644 index d0955cbabd..0000000000 --- a/lib/widgets/layouts/side_view_layout.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/themes.dart'; - -class SideViewLayout extends StatelessWidget { - final Widget mainView; - final Widget? sideView; - - const SideViewLayout({Key? key, required this.mainView, this.sideView}) - : super(key: key); - @override - Widget build(BuildContext context) { - var currentUrl = Uri.decodeFull(VRouter.of(context).url); - if (!currentUrl.endsWith('/')) currentUrl += '/'; - final hideSideView = currentUrl.split('/').length == 4; - final sideView = this.sideView; - return sideView == null - ? mainView - : MediaQuery.of(context).size.width < FluffyThemes.columnWidth * 3.5 && - !hideSideView - ? sideView - : Row( - children: [ - Expanded( - child: ClipRRect(child: mainView), - ), - Container( - width: 1.0, - color: Theme.of(context).dividerColor, - ), - AnimatedContainer( - duration: const Duration(milliseconds: 300), - clipBehavior: Clip.antiAlias, - decoration: const BoxDecoration(), - width: hideSideView ? 0 : 360.0, - child: hideSideView ? null : sideView, - ), - ], - ); - } -} diff --git a/lib/widgets/layouts/two_column_layout.dart b/lib/widgets/layouts/two_column_layout.dart index 9371be3d2f..36e815ebb8 100644 --- a/lib/widgets/layouts/two_column_layout.dart +++ b/lib/widgets/layouts/two_column_layout.dart @@ -1,16 +1,22 @@ import 'package:flutter/material.dart'; +import 'package:fluffychat/config/themes.dart'; + class TwoColumnLayout extends StatelessWidget { final Widget mainView; final Widget sideView; + final bool displayNavigationRail; const TwoColumnLayout({ - Key? key, + super.key, required this.mainView, required this.sideView, - }) : super(key: key); + required this.displayNavigationRail, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return ScaffoldMessenger( child: Scaffold( body: Row( @@ -18,12 +24,13 @@ class TwoColumnLayout extends StatelessWidget { Container( clipBehavior: Clip.antiAlias, decoration: const BoxDecoration(), - width: 360.0, + width: FluffyThemes.columnWidth + + (displayNavigationRail ? FluffyThemes.navRailWidth : 0), child: mainView, ), Container( width: 1.0, - color: Theme.of(context).dividerColor, + color: theme.dividerColor, ), Expanded( child: ClipRRect( diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index 37e8fbcf0d..a59a540fa9 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -1,26 +1,33 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; -import 'package:desktop_lifecycle/desktop_lifecycle.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:http/http.dart' as http; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:universal_html/html.dart' as html; -import 'package:vrouter/vrouter.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/matrix.dart'; extension LocalNotificationsExtension on MatrixState { + static final html.AudioElement _audioPlayer = html.AudioElement() + ..src = 'assets/assets/sounds/notification.ogg' + ..load(); + void showLocalNotification(EventUpdate eventUpdate) async { final roomId = eventUpdate.roomID; if (activeRoomId == roomId) { if (kIsWeb && webHasFocus) return; - if (Platform.isLinux && DesktopLifecycle.instance.isActive.value) return; + if (PlatformInfos.isDesktop && + WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { + return; + } } final room = client.getRoomById(roomId); if (room == null) { @@ -28,11 +35,11 @@ extension LocalNotificationsExtension on MatrixState { return; } if (room.notificationCount == 0) return; + final event = Event.fromJson(eventUpdate.content, room); - final title = - room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)!)); + final title = room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))); final body = await event.calcLocalizedBody( - MatrixLocals(L10n.of(widget.context)!), + MatrixLocals(L10n.of(context)), withSenderNamePrefix: !room.isDirectChat || room.lastEvent?.senderId == client.userID, plaintextBody: true, @@ -40,56 +47,55 @@ extension LocalNotificationsExtension on MatrixState { hideEdit: true, removeMarkdown: true, ); - final icon = event.senderFromMemoryOrFallback.avatarUrl?.getThumbnail( - client, - width: 64, - height: 64, - method: ThumbnailMethod.crop) ?? - room.avatar?.getThumbnail(client, - width: 64, height: 64, method: ThumbnailMethod.crop); + if (kIsWeb) { - html.AudioElement() - ..src = - 'assets/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg' - ..autoplay = true - ..load(); + final avatarUrl = event.senderFromMemoryOrFallback.avatarUrl; + Uri? thumbnailUri; + + if (avatarUrl != null) { + const size = 64; + const thumbnailMethod = ThumbnailMethod.crop; + // Pre-cache so that we can later just set the thumbnail uri as icon: + await client.downloadMxcCached( + avatarUrl, + width: size, + height: size, + thumbnailMethod: thumbnailMethod, + isThumbnail: true, + ); + + thumbnailUri = + await event.senderFromMemoryOrFallback.avatarUrl?.getThumbnailUri( + client, + width: size, + height: size, + method: thumbnailMethod, + ); + } + + _audioPlayer.play(); + html.Notification( title, body: body, - icon: icon.toString(), + icon: thumbnailUri?.toString(), + tag: event.room.id, ); } else if (Platform.isLinux) { - final appIconUrl = room.avatar?.getThumbnail( - room.client, - width: 56, - height: 56, - ); - File? appIconFile; - if (appIconUrl != null) { - final tempDirectory = await getApplicationSupportDirectory(); - final avatarDirectory = - await Directory('${tempDirectory.path}/notiavatars/').create(); - appIconFile = File( - '${avatarDirectory.path}/${Uri.encodeComponent(appIconUrl.toString())}'); - if (await appIconFile.exists() == false) { - final response = await http.get(appIconUrl); - await appIconFile.writeAsBytes(response.bodyBytes); - } - } final notification = await linuxNotifications!.notify( title, body: body, replacesId: linuxNotificationIds[roomId] ?? 0, appName: AppConfig.applicationName, - appIcon: appIconFile?.path ?? '', + appIcon: 'fluffychat', actions: [ NotificationAction( DesktopNotificationActions.openChat.name, - L10n.of(widget.context)!.openChat, + L10n.of(context).openChat, ), NotificationAction( DesktopNotificationActions.seen.name, - L10n.of(widget.context)!.markAsRead, + L10n.of(context).markAsRead, ), ], hints: [ @@ -101,10 +107,14 @@ extension LocalNotificationsExtension on MatrixState { .singleWhere((a) => a.name == actionStr); switch (action) { case DesktopNotificationActions.seen: - room.setReadMarker(event.eventId, mRead: event.eventId); + room.setReadMarker( + event.eventId, + mRead: event.eventId, + public: AppConfig.sendPublicReadReceipts, + ); break; case DesktopNotificationActions.openChat: - VRouter.of(navigatorContext).toSegments(['rooms', room.id]); + context.go('/rooms/${room.id}'); break; } }); diff --git a/lib/widgets/lock_screen.dart b/lib/widgets/lock_screen.dart index 1a5a457542..d8d3d3c630 100644 --- a/lib/widgets/lock_screen.dart +++ b/lib/widgets/lock_screen.dart @@ -1,87 +1,117 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:pin_code_text_field/pin_code_text_field.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; -import 'layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; class LockScreen extends StatefulWidget { - const LockScreen({Key? key}) : super(key: key); + const LockScreen({super.key}); @override - _LockScreenState createState() => _LockScreenState(); + State createState() => _LockScreenState(); } class _LockScreenState extends State { + String? _errorText; + int _coolDownSeconds = 5; + bool _inputBlocked = false; final TextEditingController _textEditingController = TextEditingController(); - final FocusNode _focusNode = FocusNode(); - bool _wrongInput = false; + + void tryUnlock(String text) async { + setState(() { + _errorText = null; + }); + if (text.length < 4) return; + + final enteredPin = int.tryParse(text); + if (enteredPin == null || text.length != 4) { + setState(() { + _errorText = L10n.of(context).invalidInput; + }); + _textEditingController.clear(); + return; + } + + if (AppLock.of(context).unlock(enteredPin.toString())) { + setState(() { + _inputBlocked = false; + _errorText = null; + }); + _textEditingController.clear(); + return; + } + + setState(() { + _errorText = L10n.of(context).wrongPinEntered(_coolDownSeconds); + _inputBlocked = true; + }); + Future.delayed(Duration(seconds: _coolDownSeconds)).then((_) { + setState(() { + _inputBlocked = false; + _coolDownSeconds *= 2; + _errorText = null; + }); + }); + _textEditingController.clear(); + } + @override Widget build(BuildContext context) { - return MaterialApp( - theme: FluffyThemes.light(), - darkTheme: FluffyThemes.light(), - localizationsDelegates: L10n.localizationsDelegates, - supportedLocales: L10n.supportedLocales, - home: Builder( - builder: (context) => LoginScaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - elevation: 0, - centerTitle: true, - title: Text(L10n.of(context)!.pleaseEnterYourPin), - backgroundColor: Colors.transparent, - ), - body: Container( - decoration: BoxDecoration( - color: Theme.of(context).backgroundColor, - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - stops: const [ - 0.1, - 0.4, - 0.6, - 0.9, - ], - colors: [ - Theme.of(context).secondaryHeaderColor.withAlpha(16), - Theme.of(context).primaryColor.withAlpha(16), - Theme.of(context).colorScheme.secondary.withAlpha(16), - Theme.of(context).backgroundColor.withAlpha(16), - ], - ), + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).pleaseEnterYourPin), + centerTitle: true, + ), + extendBodyBehindAppBar: true, + body: Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth, ), - alignment: Alignment.center, - child: PinCodeTextField( - autofocus: true, - controller: _textEditingController, - focusNode: _focusNode, - pinBoxRadius: AppConfig.borderRadius, - pinTextStyle: const TextStyle(fontSize: 32), - hideCharacter: true, - hasError: _wrongInput, - onDone: (String input) async { - if (input == - await ([TargetPlatform.linux] - .contains(Theme.of(context).platform) - ? SharedPreferences.getInstance().then( - (prefs) => prefs.getString(SettingKeys.appLockKey)) - : const FlutterSecureStorage() - .read(key: SettingKeys.appLockKey))) { - AppLock.of(context)!.didUnlock(); - } else { - _textEditingController.clear(); - setState(() => _wrongInput = true); - _focusNode.requestFocus(); - } - }, + child: ListView( + shrinkWrap: true, + children: [ + Center( + child: Image.asset( + 'assets/info-logo.png', + width: 256, + ), + ), + TextField( + controller: _textEditingController, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.number, + obscureText: true, + autofocus: true, + textAlign: TextAlign.center, + readOnly: _inputBlocked, + onChanged: tryUnlock, + onSubmitted: tryUnlock, + style: const TextStyle(fontSize: 40), + inputFormatters: [ + LengthLimitingTextInputFormatter(4), + ], + decoration: InputDecoration( + errorText: _errorText, + hintText: '****', + suffix: IconButton( + icon: const Icon(Icons.lock_open_outlined), + onPressed: () => tryUnlock(_textEditingController.text), + ), + ), + ), + if (_inputBlocked) + const Padding( + padding: EdgeInsets.all(8.0), + child: LinearProgressIndicator(), + ), + ], ), ), ), diff --git a/lib/widgets/log_view.dart b/lib/widgets/log_view.dart index 0c18fa50de..caeaeee44a 100644 --- a/lib/widgets/log_view.dart +++ b/lib/widgets/log_view.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; class LogViewer extends StatefulWidget { - const LogViewer({Key? key}) : super(key: key); + const LogViewer({super.key}); @override - _LogViewerState createState() => _LogViewerState(); + LogViewerState createState() => LogViewerState(); } -class _LogViewerState extends State { +class LogViewerState extends State { Level logLevel = Level.debug; double fontSize = 14; @override @@ -22,7 +23,9 @@ class _LogViewerState extends State { backgroundColor: Colors.black, appBar: AppBar( title: Text(logLevel.toString()), - leading: const BackButton(), + leading: BackButton( + onPressed: () => context.go('/'), + ), actions: [ IconButton( icon: const Icon(Icons.zoom_in_outlined), @@ -34,10 +37,12 @@ class _LogViewerState extends State { ), PopupMenuButton( itemBuilder: (context) => Level.values - .map((level) => PopupMenuItem( - value: level, - child: Text(level.toString()), - )) + .map( + (level) => PopupMenuItem( + value: level, + child: Text(level.toString()), + ), + ) .toList(), onSelected: (Level level) => setState(() => logLevel = level), ), @@ -73,7 +78,6 @@ extension on LogEvent { case Level.debug: return Colors.white; case Level.verbose: - default: return Colors.grey; } } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index dd876482e7..1dac4ae9cf 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -1,39 +1,36 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:collection/collection.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; +import 'package:intl/intl.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/html.dart' as html; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; import 'package:fluffychat/utils/uia_request_manager.dart'; import 'package:fluffychat/utils/voip_plugin.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; import '../pages/key_verification/key_verification_dialog.dart'; import '../utils/account_bundles.dart'; import '../utils/background_push.dart'; -import '../utils/famedlysdk_store.dart'; -import '../utils/platform_infos.dart'; import 'local_notifications_extension.dart'; // import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -41,22 +38,19 @@ import 'local_notifications_extension.dart'; class Matrix extends StatefulWidget { final Widget? child; - final GlobalKey? router; - - final BuildContext context; - final List clients; final Map? queryParameters; + final SharedPreferences store; + const Matrix({ this.child, - required this.router, - required this.context, required this.clients, + required this.store, this.queryParameters, - Key? key, - }) : super(key: key); + super.key, + }); @override MatrixState createState() => MatrixState(); @@ -69,15 +63,14 @@ class Matrix extends StatefulWidget { class MatrixState extends State with WidgetsBindingObserver { int _activeClient = -1; String? activeBundle; - Store store = Store(); - late BuildContext navigatorContext; - HomeserverSummary? loginHomeserverSummary; + SharedPreferences get store => widget.store; + XFile? loginAvatar; String? loginUsername; bool? loginRegistrationSupported; - BackgroundPush? _backgroundPush; + BackgroundPush? backgroundPush; Client get client { if (widget.clients.isEmpty) { @@ -89,12 +82,6 @@ class MatrixState extends State with WidgetsBindingObserver { return widget.clients[_activeClient]; } - bool get webrtcIsSupported => - kIsWeb || - PlatformInfos.isMobile || - PlatformInfos.isWindows || - PlatformInfos.isMacOS; - VoipPlugin? voipPlugin; bool get isMultiAccount => widget.clients.length > 1; @@ -136,18 +123,22 @@ class MatrixState extends State with WidgetsBindingObserver { continue; } resBundles[bundle.name] ??= []; - resBundles[bundle.name]!.add(_AccountBundleWithClient( - client: widget.clients[i], - bundle: bundle, - )); + resBundles[bundle.name]!.add( + _AccountBundleWithClient( + client: widget.clients[i], + bundle: bundle, + ), + ); } } for (final b in resBundles.values) { - b.sort((a, b) => a.bundle!.priority == null - ? 1 - : b.bundle!.priority == null - ? -1 - : a.bundle!.priority!.compareTo(b.bundle!.priority!)); + b.sort( + (a, b) => a.bundle!.priority == null + ? 1 + : b.bundle!.priority == null + ? -1 + : a.bundle!.priority!.compareTo(b.bundle!.priority!), + ); } return resBundles .map((k, v) => MapEntry(k, v.map((vv) => vv.client).toList())); @@ -162,8 +153,8 @@ class MatrixState extends State with WidgetsBindingObserver { return client; } final candidate = _loginClientCandidate ??= ClientManager.createClient( - '${AppConfig.applicationName}-${DateTime.now().millisecondsSinceEpoch}') - ..onLoginStateChanged + '${AppConfig.applicationName}-${DateTime.now().millisecondsSinceEpoch}', + )..onLoginStateChanged .stream .where((l) => l == LoginState.loggedIn) .first @@ -171,10 +162,13 @@ class MatrixState extends State with WidgetsBindingObserver { if (!widget.clients.contains(_loginClientCandidate)) { widget.clients.add(_loginClientCandidate!); } - ClientManager.addClientNameToStore(_loginClientCandidate!.clientName); + ClientManager.addClientNameToStore( + _loginClientCandidate!.clientName, + store, + ); _registerSubs(_loginClientCandidate!.clientName); _loginClientCandidate = null; - widget.router!.currentState!.to('/rooms'); + FluffyChatApp.router.go('/rooms'); }); return candidate; } @@ -182,41 +176,6 @@ class MatrixState extends State with WidgetsBindingObserver { Client? getClientByName(String name) => widget.clients.firstWhereOrNull((c) => c.clientName == name); - Map? get shareContent => _shareContent; - - set shareContent(Map? content) { - _shareContent = content; - onShareContentChanged.add(_shareContent); - } - - Map? _shareContent; - - final StreamController?> onShareContentChanged = - StreamController.broadcast(); - - File? wallpaper; - - void _initWithStore() async { - try { - if (client.isLogged()) { - // TODO: Figure out how this works in multi account - final statusMsg = await store.getItem(SettingKeys.ownStatusMessage); - if (statusMsg?.isNotEmpty ?? false) { - Logs().v('Send cached status message: "$statusMsg"'); - await client.setPresence( - client.userID!, - PresenceType.online, - statusMsg: statusMsg, - ); - } - } - } catch (e, s) { - client.onLoginStateChanged.addError(e, s); - SentryController.captureException(e, s); - rethrow; - } - } - final onRoomKeyRequestSub = {}; final onKeyVerificationRequestSub = {}; final onNotification = {}; @@ -224,7 +183,6 @@ class MatrixState extends State with WidgetsBindingObserver { final onUiaRequest = >{}; StreamSubscription? onFocusSub; StreamSubscription? onBlurSub; - final onOwnPresence = >{}; String? _cachedPassword; Timer? _cachedPasswordClearTimer; @@ -243,8 +201,11 @@ class MatrixState extends State with WidgetsBindingObserver { bool webHasFocus = true; - String? get activeRoomId => - VRouter.of(navigatorContext).pathParameters['roomid']; + String? get activeRoomId { + final route = FluffyChatApp.router.routeInformationProvider.value.uri.path; + if (!route.startsWith('/rooms/')) return null; + return route.split('/')[2]; + } final linuxNotifications = PlatformInfos.isLinux ? NotificationsClient() : null; @@ -275,29 +236,24 @@ class MatrixState extends State with WidgetsBindingObserver { } } - void _reportSyncError(SyncStatusUpdate update) => - SentryController.captureException( - update.error!.exception, - update.error!.stackTrace, - ); - void _registerSubs(String name) { final c = getClientByName(name); if (c == null) { Logs().w( - 'Attempted to register subscriptions for non-existing client $name'); + 'Attempted to register subscriptions for non-existing client $name', + ); return; } - c.onSyncStatus.stream - .where((s) => s.status == SyncStatus.error) - .listen(_reportSyncError); onRoomKeyRequestSub[name] ??= c.onRoomKeyRequest.stream.listen((RoomKeyRequest request) async { - if (widget.clients.any(((cl) => - cl.userID == request.requestingDevice.userId && - cl.identityKey == request.requestingDevice.curve25519Key))) { + if (widget.clients.any( + ((cl) => + cl.userID == request.requestingDevice.userId && + cl.identityKey == request.requestingDevice.curve25519Key), + )) { Logs().i( - '[Key Request] Request is from one of our own clients, forwarding the key...'); + '[Key Request] Request is from one of our own clients, forwarding the key...', + ); await request.forwardKey(); } }); @@ -308,46 +264,41 @@ class MatrixState extends State with WidgetsBindingObserver { if (!hidPopup && {KeyVerificationState.done, KeyVerificationState.error} .contains(request.state)) { - Navigator.of(navigatorContext).pop('dialog'); + FluffyChatApp.router.pop('dialog'); } hidPopup = true; }; request.onUpdate = null; hidPopup = true; - await KeyVerificationDialog(request: request).show(navigatorContext); + await KeyVerificationDialog(request: request).show( + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context, + ); }); onLoginStateChanged[name] ??= c.onLoginStateChanged.stream.listen((state) { final loggedInWithMultipleClients = widget.clients.length > 1; + if (state == LoginState.loggedOut) { + InitWithRestoreExtension.deleteSessionBackup(name); + } if (loggedInWithMultipleClients && state != LoginState.loggedIn) { _cancelSubs(c.clientName); widget.clients.remove(c); - ClientManager.removeClientNameFromStore(c.clientName); - ScaffoldMessenger.of(context).showSnackBar( + ClientManager.removeClientNameFromStore(c.clientName, store); + ScaffoldMessenger.of( + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context, + ).showSnackBar( SnackBar( - content: Text(L10n.of(context)!.oneClientLoggedOut), + content: Text(L10n.of(context).oneClientLoggedOut), ), ); if (state != LoginState.loggedIn) { - widget.router!.currentState!.to( - '/rooms', - queryParameters: widget.router!.currentState!.queryParameters, - ); + FluffyChatApp.router.go('/rooms'); } } else { - widget.router!.currentState!.to( - state == LoginState.loggedIn ? '/rooms' : '/home', - queryParameters: widget.router!.currentState!.queryParameters, - ); - } - }); - // Cache and resend status message - onOwnPresence[name] ??= c.onPresenceChanged.stream.listen((presence) { - if (c.isLogged() && - c.userID == presence.userid && - presence.statusMsg != null) { - Logs().v('Update status message: "${presence.statusMsg}"'); - store.setItem(SettingKeys.ownStatusMessage, presence.statusMsg); + FluffyChatApp.router + .go(state == LoginState.loggedIn ? '/rooms' : '/home'); } }); onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler); @@ -355,11 +306,13 @@ class MatrixState extends State with WidgetsBindingObserver { c.onSync.stream.first.then((s) { html.Notification.requestPermission(); onNotification[name] ??= c.onEvent.stream - .where((e) => - e.type == EventUpdateType.timeline && - [EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] - .contains(e.content['type']) && - e.content['sender'] != c.userID) + .where( + (e) => + e.type == EventUpdateType.timeline && + [EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] + .contains(e.content['type']) && + e.content['sender'] != c.userID, + ) .listen(showLocalNotification); }); } @@ -372,32 +325,11 @@ class MatrixState extends State with WidgetsBindingObserver { onKeyVerificationRequestSub.remove(name); onLoginStateChanged[name]?.cancel(); onLoginStateChanged.remove(name); - onOwnPresence[name]?.cancel(); - onOwnPresence.remove(name); onNotification[name]?.cancel(); onNotification.remove(name); } void initMatrix() { - // Display the app lock - if (PlatformInfos.isMobile) { - WidgetsBinding.instance.addPostFrameCallback((_) { - ([TargetPlatform.linux].contains(Theme.of(context).platform) - ? SharedPreferences.getInstance() - .then((prefs) => prefs.getString(SettingKeys.appLockKey)) - : const FlutterSecureStorage() - .read(key: SettingKeys.appLockKey)) - .then((lock) { - if (lock?.isNotEmpty ?? false) { - AppLock.of(widget.context)!.enable(); - AppLock.of(widget.context)!.showLockScreen(); - } - }); - }); - } - - _initWithStore(); - for (final c in widget.clients) { _registerSubs(c.clientName); } @@ -408,26 +340,29 @@ class MatrixState extends State with WidgetsBindingObserver { } if (PlatformInfos.isMobile) { - _backgroundPush = BackgroundPush( - client, - context, - widget.router, - onFcmError: (errorMsg, {Uri? link}) => Timer( - const Duration(seconds: 1), - () { - final banner = SnackBar( - content: Text(errorMsg), - duration: const Duration(seconds: 30), - action: link == null - ? null - : SnackBarAction( - label: L10n.of(context)!.link, - onPressed: () => launch(link.toString()), - ), + backgroundPush = BackgroundPush( + this, + onFcmError: (errorMsg, {Uri? link}) async { + final result = await showOkCancelAlertDialog( + context: FluffyChatApp + .router.routerDelegate.navigatorKey.currentContext ?? + context, + title: L10n.of(context).pushNotificationsNotAvailable, + message: errorMsg, + okLabel: + link == null ? L10n.of(context).ok : L10n.of(context).learnMore, + cancelLabel: L10n.of(context).doNotShowAgain, + ); + if (result == OkCancelResult.ok && link != null) { + launchUrlString( + link.toString(), + mode: LaunchMode.externalApplication, ); - ScaffoldMessenger.of(navigatorContext).showSnackBar(banner); - }, - ), + } + if (result == OkCancelResult.cancel) { + await store.setBool(SettingKeys.showNoGoogle, true); + } + }, ); } @@ -435,79 +370,74 @@ class MatrixState extends State with WidgetsBindingObserver { } void createVoipPlugin() async { - if (await store.getItemBool(SettingKeys.experimentalVoip) == false) { + if (store.getBool(SettingKeys.experimentalVoip) == false) { voipPlugin = null; return; } - voipPlugin = - webrtcIsSupported ? VoipPlugin(client: client, context: context) : null; + voipPlugin = VoipPlugin(this); } - bool _firstStartup = true; - @override void didChangeAppLifecycleState(AppLifecycleState state) { Logs().v('AppLifecycleState = $state'); - final foreground = state != AppLifecycleState.detached && + final foreground = state != AppLifecycleState.inactive && state != AppLifecycleState.paused; - client.backgroundSync = foreground; - client.syncPresence = foreground ? null : PresenceType.unavailable; - client.requestHistoryOnLimitedTimeline = !foreground; - if (_firstStartup) { - _firstStartup = false; - _backgroundPush?.setupPush(); + client.syncPresence = + state == AppLifecycleState.resumed ? null : PresenceType.unavailable; + if (PlatformInfos.isMobile) { + client.backgroundSync = foreground; + client.requestHistoryOnLimitedTimeline = !foreground; + Logs().v('Set background sync to', foreground); } } void initSettings() { - store.getItem(SettingKeys.wallpaper).then((final path) async { - if (path == null) return; - final file = File(path); - if (await file.exists()) { - wallpaper = file; - } - }); - store.getItem(SettingKeys.fontSizeFactor).then((value) => - AppConfig.fontSizeFactor = - double.tryParse(value ?? '') ?? AppConfig.fontSizeFactor); - store.getItem(SettingKeys.bubbleSizeFactor).then((value) => - AppConfig.bubbleSizeFactor = - double.tryParse(value ?? '') ?? AppConfig.bubbleSizeFactor); - store - .getItemBool(SettingKeys.renderHtml, AppConfig.renderHtml) - .then((value) => AppConfig.renderHtml = value); - store - .getItemBool( - SettingKeys.hideRedactedEvents, AppConfig.hideRedactedEvents) - .then((value) => AppConfig.hideRedactedEvents = value); - store - .getItemBool(SettingKeys.hideUnknownEvents, AppConfig.hideUnknownEvents) - .then((value) => AppConfig.hideUnknownEvents = value); - store - .getItemBool(SettingKeys.showDirectChatsInSpaces, - AppConfig.showDirectChatsInSpaces) - .then((value) => AppConfig.showDirectChatsInSpaces = value); - store - .getItemBool(SettingKeys.separateChatTypes, AppConfig.separateChatTypes) - .then((value) => AppConfig.separateChatTypes = value); - store - .getItemBool(SettingKeys.autoplayImages, AppConfig.autoplayImages) - .then((value) => AppConfig.autoplayImages = value); - store - .getItemBool(SettingKeys.sendOnEnter, AppConfig.sendOnEnter) - .then((value) => AppConfig.sendOnEnter = value); - store - .getItemBool(SettingKeys.experimentalVoip, AppConfig.experimentalVoip) - .then((value) => AppConfig.experimentalVoip = value); - store.getItem(SettingKeys.chatColor).then((value) { - if (value != null && int.tryParse(value) != null) { - AppConfig.colorSchemeSeed = Color(int.parse(value)); - AdaptiveTheme.of(context).setTheme( - light: FluffyThemes.light(), - dark: FluffyThemes.dark(), - ); - } - }); + AppConfig.fontSizeFactor = + double.tryParse(store.getString(SettingKeys.fontSizeFactor) ?? '') ?? + AppConfig.fontSizeFactor; + + AppConfig.renderHtml = + store.getBool(SettingKeys.renderHtml) ?? AppConfig.renderHtml; + + AppConfig.swipeRightToLeftToReply = + store.getBool(SettingKeys.swipeRightToLeftToReply) ?? + AppConfig.swipeRightToLeftToReply; + + AppConfig.hideRedactedEvents = + store.getBool(SettingKeys.hideRedactedEvents) ?? + AppConfig.hideRedactedEvents; + + AppConfig.hideUnknownEvents = + store.getBool(SettingKeys.hideUnknownEvents) ?? + AppConfig.hideUnknownEvents; + + AppConfig.hideUnimportantStateEvents = + store.getBool(SettingKeys.hideUnimportantStateEvents) ?? + AppConfig.hideUnimportantStateEvents; + + AppConfig.separateChatTypes = + store.getBool(SettingKeys.separateChatTypes) ?? + AppConfig.separateChatTypes; + + AppConfig.autoplayImages = + store.getBool(SettingKeys.autoplayImages) ?? AppConfig.autoplayImages; + + AppConfig.sendTypingNotifications = + store.getBool(SettingKeys.sendTypingNotifications) ?? + AppConfig.sendTypingNotifications; + + AppConfig.sendPublicReadReceipts = + store.getBool(SettingKeys.sendPublicReadReceipts) ?? + AppConfig.sendPublicReadReceipts; + + AppConfig.sendOnEnter = + store.getBool(SettingKeys.sendOnEnter) ?? AppConfig.sendOnEnter; + + AppConfig.experimentalVoip = store.getBool(SettingKeys.experimentalVoip) ?? + AppConfig.experimentalVoip; + + AppConfig.showPresences = + store.getBool(SettingKeys.showPresences) ?? AppConfig.showPresences; } @override @@ -517,12 +447,10 @@ class MatrixState extends State with WidgetsBindingObserver { onRoomKeyRequestSub.values.map((s) => s.cancel()); onKeyVerificationRequestSub.values.map((s) => s.cancel()); onLoginStateChanged.values.map((s) => s.cancel()); - onOwnPresence.values.map((s) => s.cancel()); onNotification.values.map((s) => s.cancel()); client.httpClient.close(); onFocusSub?.cancel(); onBlurSub?.cancel(); - _backgroundPush?.onLogin?.cancel(); linuxNotifications?.close(); @@ -536,29 +464,33 @@ class MatrixState extends State with WidgetsBindingObserver { child: widget.child, ); } -} -class FixedThreepidCreds extends ThreepidCreds { - FixedThreepidCreds({ - required String sid, - required String clientSecret, - String? idServer, - String? idAccessToken, - }) : super( - sid: sid, - clientSecret: clientSecret, - idServer: idServer, - idAccessToken: idAccessToken, - ); + Future dehydrateAction(BuildContext context) async { + final response = await showOkCancelAlertDialog( + context: context, + isDestructive: true, + title: L10n.of(context).dehydrate, + message: L10n.of(context).dehydrateWarning, + ); + if (response != OkCancelResult.ok) { + return; + } + final result = await showFutureLoadingDialog( + context: context, + future: client.exportDump, + ); + final export = result.result; + if (export == null) return; - @override - Map toJson() { - final data = {}; - data['sid'] = sid; - data['client_secret'] = clientSecret; - if (idServer != null) data['id_server'] = idServer; - if (idAccessToken != null) data['id_access_token'] = idAccessToken; - return data; + final exportBytes = Uint8List.fromList( + const Utf8Codec().encode(export), + ); + + final exportFileName = + 'fluffychat-export-${DateFormat(DateFormat.YEAR_MONTH_DAY).format(DateTime.now())}.fluffybackup'; + + final file = MatrixFile(bytes: exportBytes, name: exportFileName); + file.save(context); } } diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart new file mode 100644 index 0000000000..1d5625998a --- /dev/null +++ b/lib/widgets/mxc_image.dart @@ -0,0 +1,165 @@ +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class MxcImage extends StatefulWidget { + final Uri? uri; + final Event? event; + final double? width; + final double? height; + final BoxFit? fit; + final bool isThumbnail; + final bool animated; + final Duration retryDuration; + final Duration animationDuration; + final Curve animationCurve; + final ThumbnailMethod thumbnailMethod; + final Widget Function(BuildContext context)? placeholder; + final String? cacheKey; + final Client? client; + + const MxcImage({ + this.uri, + this.event, + this.width, + this.height, + this.fit, + this.placeholder, + this.isThumbnail = true, + this.animated = false, + this.animationDuration = FluffyThemes.animationDuration, + this.retryDuration = const Duration(seconds: 2), + this.animationCurve = FluffyThemes.animationCurve, + this.thumbnailMethod = ThumbnailMethod.scale, + this.cacheKey, + this.client, + super.key, + }); + + @override + State createState() => _MxcImageState(); +} + +class _MxcImageState extends State { + static final Map _imageDataCache = {}; + Uint8List? _imageDataNoCache; + + Uint8List? get _imageData => widget.cacheKey == null + ? _imageDataNoCache + : _imageDataCache[widget.cacheKey]; + + set _imageData(Uint8List? data) { + if (data == null) return; + final cacheKey = widget.cacheKey; + cacheKey == null + ? _imageDataNoCache = data + : _imageDataCache[cacheKey] = data; + } + + Future _load() async { + final client = + widget.client ?? widget.event?.room.client ?? Matrix.of(context).client; + final uri = widget.uri; + final event = widget.event; + + if (uri != null) { + final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; + final width = widget.width; + final realWidth = width == null ? null : width * devicePixelRatio; + final height = widget.height; + final realHeight = height == null ? null : height * devicePixelRatio; + + final remoteData = await client.downloadMxcCached( + uri, + width: realWidth, + height: realHeight, + thumbnailMethod: widget.thumbnailMethod, + isThumbnail: widget.isThumbnail, + animated: widget.animated, + ); + if (!mounted) return; + setState(() { + _imageData = remoteData; + }); + } + + if (event != null) { + final data = await event.downloadAndDecryptAttachment( + getThumbnail: widget.isThumbnail, + ); + if (data.detectFileType is MatrixImageFile) { + if (!mounted) return; + setState(() { + _imageData = data.bytes; + }); + return; + } + } + } + + void _tryLoad(_) async { + if (_imageData != null) { + return; + } + try { + await _load(); + } catch (_) { + if (!mounted) return; + await Future.delayed(widget.retryDuration); + _tryLoad(_); + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback(_tryLoad); + } + + Widget placeholder(BuildContext context) => + widget.placeholder?.call(context) ?? + Container( + width: widget.width, + height: widget.height, + alignment: Alignment.center, + child: const CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + + @override + Widget build(BuildContext context) { + final data = _imageData; + final hasData = data != null && data.isNotEmpty; + + return AnimatedCrossFade( + crossFadeState: + hasData ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 128), + firstChild: placeholder(context), + secondChild: hasData + ? Image.memory( + data, + width: widget.width, + height: widget.height, + fit: widget.fit, + filterQuality: + widget.isThumbnail ? FilterQuality.low : FilterQuality.medium, + errorBuilder: (context, __, ___) { + _imageData = null; + WidgetsBinding.instance.addPostFrameCallback(_tryLoad); + return placeholder(context); + }, + ) + : SizedBox( + width: widget.width, + height: widget.height, + ), + ); + } +} diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index 47733e1b09..cdff7b5cbf 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -3,89 +3,29 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_flat_button.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; -class PermissionSliderDialog extends StatefulWidget { - const PermissionSliderDialog({ - Key? key, - this.initialPermission = 0, - }) : super(key: key); - - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - useRootNavigator: false, - ); - - final int initialPermission; - @override - _PermissionSliderDialogState createState() => _PermissionSliderDialogState(); -} - -class _PermissionSliderDialogState extends State { - late int _permission; - @override - void initState() { - _permission = widget.initialPermission; - super.initState(); - } - - @override - Widget build(BuildContext context) { - final title = Text( - L10n.of(context)!.setPermissionsLevel, - textAlign: TextAlign.center, - ); - final content = Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Level: ' + - (_permission == 100 - ? '$_permission (${L10n.of(context)!.admin})' - : _permission >= 50 - ? '$_permission (${L10n.of(context)!.moderator})' - : _permission.toString())), - SizedBox( - height: 56, - child: Slider.adaptive( - value: _permission.toDouble(), - onChanged: (d) => setState(() => _permission = d.round()), - max: 100.0, - min: 0.0, - ), - ), - ], - ); - final buttons = [ - AdaptiveFlatButton( - label: L10n.of(context)!.cancel, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(null), - ), - AdaptiveFlatButton( - label: L10n.of(context)!.confirm, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(_permission), - ), - ]; - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: content, - actions: buttons, - ); - } - return AlertDialog( - title: title, - content: content, - actions: buttons, - ); - } +Future showPermissionChooser( + BuildContext context, { + int currentLevel = 0, +}) async { + final customLevel = await showTextInputDialog( + context: context, + title: L10n.of(context).setPermissionsLevel, + initialText: currentLevel.toString(), + keyboardType: TextInputType.number, + autocorrect: false, + validator: (text) { + if (text.isEmpty) { + return L10n.of(context).pleaseEnterANumber; + } + final level = int.tryParse(text); + if (level == null) { + return L10n.of(context).pleaseEnterANumber; + } + return null; + }, + ); + if (customLevel == null) return null; + return int.tryParse(customLevel); } diff --git a/lib/widgets/presence_builder.dart b/lib/widgets/presence_builder.dart new file mode 100644 index 0000000000..7aacc6f86b --- /dev/null +++ b/lib/widgets/presence_builder.dart @@ -0,0 +1,56 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/matrix.dart'; + +class PresenceBuilder extends StatefulWidget { + final Widget Function(BuildContext context, CachedPresence? presence) builder; + final String? userId; + final Client? client; + + const PresenceBuilder({ + required this.builder, + this.userId, + this.client, + super.key, + }); + + @override + State createState() => _PresenceBuilderState(); +} + +class _PresenceBuilderState extends State { + CachedPresence? _presence; + StreamSubscription? _sub; + + void _updatePresence(CachedPresence? presence) { + setState(() { + _presence = presence; + }); + } + + @override + void initState() { + super.initState(); + final client = widget.client ?? Matrix.of(context).client; + final userId = widget.userId; + if (userId != null) { + client.fetchCurrentPresence(userId).then(_updatePresence); + _sub = client.onPresenceChanged.stream + .where((presence) => presence.userid == userId) + .listen(_updatePresence); + } + } + + @override + void dispose() { + _sub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => widget.builder(context, _presence); +} diff --git a/lib/widgets/profile_bottom_sheet.dart b/lib/widgets/profile_bottom_sheet.dart deleted file mode 100644 index 6ab03a4909..0000000000 --- a/lib/widgets/profile_bottom_sheet.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/widgets/content_banner.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/localized_exception_extension.dart'; - -class ProfileBottomSheet extends StatelessWidget { - final String userId; - final BuildContext outerContext; - const ProfileBottomSheet({ - required this.userId, - required this.outerContext, - Key? key, - }) : super(key: key); - - void _startDirectChat(BuildContext context) async { - final client = Matrix.of(context).client; - final result = await showFutureLoadingDialog( - context: context, - future: () => client.startDirectChat(userId), - ); - if (result.error == null) { - VRouter.of(context).toSegments(['rooms', result.result!]); - Navigator.of(context, rootNavigator: false).pop(); - return; - } - } - - @override - Widget build(BuildContext context) { - return Center( - child: SizedBox( - width: min( - MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5), - child: Material( - elevation: 4, - child: SafeArea( - child: Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - backgroundColor: - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), - onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, - ), - ), - body: FutureBuilder( - future: - Matrix.of(context).client.getProfileFromUserId(userId), - builder: (context, snapshot) { - final profile = snapshot.data; - - return Column( - children: [ - Expanded( - child: profile == null - ? Container( - alignment: Alignment.center, - color: Theme.of(context).secondaryHeaderColor, - child: snapshot.hasError - ? Text(snapshot.error! - .toLocalizedString(context)) - : const CircularProgressIndicator - .adaptive(strokeWidth: 2), - ) - : ContentBanner( - mxContent: profile.avatarUrl, - defaultIcon: Icons.account_circle_outlined, - client: Matrix.of(context).client, - ), - ), - ListTile( - title: Text( - profile?.displayName ?? userId.localpart ?? ''), - subtitle: Text(userId), - trailing: const Icon(Icons.account_box_outlined), - ), - Container( - width: double.infinity, - padding: const EdgeInsets.all(12), - child: ElevatedButton.icon( - onPressed: () => _startDirectChat(context), - label: Text(L10n.of(context)!.newChat), - icon: const Icon(Icons.send_outlined), - ), - ), - const SizedBox(height: 8), - ], - ); - }), - ), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/public_room_bottom_sheet.dart b/lib/widgets/public_room_bottom_sheet.dart index 40b9d5544d..cabcaecfd4 100644 --- a/lib/widgets/public_room_bottom_sheet.dart +++ b/lib/widgets/public_room_bottom_sheet.dart @@ -1,138 +1,229 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_matrix_html/flutter_html.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/widgets/content_banner.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/qr_code_viewer.dart'; class PublicRoomBottomSheet extends StatelessWidget { - final String roomAlias; + final String? roomAlias; final BuildContext outerContext; final PublicRoomsChunk? chunk; - const PublicRoomBottomSheet({ - required this.roomAlias, + final List? via; + + PublicRoomBottomSheet({ + this.roomAlias, required this.outerContext, this.chunk, - Key? key, - }) : super(key: key); + this.via, + super.key, + }) { + assert(roomAlias != null || chunk != null); + } void _joinRoom(BuildContext context) async { - final client = Matrix.of(context).client; + final client = Matrix.of(outerContext).client; + final chunk = this.chunk; + final knock = chunk?.joinRule == 'knock'; final result = await showFutureLoadingDialog( context: context, - future: () => client.joinRoom(roomAlias), + future: () async { + if (chunk != null && client.getRoomById(chunk.roomId) != null) { + return chunk.roomId; + } + final roomId = chunk != null && knock + ? await client.knockRoom(chunk.roomId, serverName: via) + : await client.joinRoom( + roomAlias ?? chunk!.roomId, + serverName: via, + ); + + if (!knock && client.getRoomById(roomId) == null) { + await client.waitForRoomInSync(roomId); + } + return roomId; + }, ); + if (knock) { + return; + } if (result.error == null) { - if (client.getRoomById(result.result!) == null) { - await client.onSync.stream.firstWhere( - (sync) => sync.rooms?.join?.containsKey(result.result) ?? false); + Navigator.of(context).pop(true); + // don't open the room if the joined room is a space + if (chunk?.roomType != 'm.space' && + !client.getRoomById(result.result!)!.isSpace) { + outerContext.go('/rooms/${result.result!}'); } - VRouter.of(context).toSegments(['rooms', result.result!]); - Navigator.of(context, rootNavigator: false).pop(); return; } } bool _testRoom(PublicRoomsChunk r) => r.canonicalAlias == roomAlias; - Future _search(BuildContext context) async { + Future _search() async { final chunk = this.chunk; if (chunk != null) return chunk; - final query = await Matrix.of(context).client.queryPublicRooms( - server: roomAlias.domain, + final query = await Matrix.of(outerContext).client.queryPublicRooms( + server: roomAlias!.domain, filter: PublicRoomQueryFilter( genericSearchTerm: roomAlias, ), ); if (!query.chunk.any(_testRoom)) { - throw (L10n.of(context)!.noRoomsFound); + throw (L10n.of(outerContext).noRoomsFound); } return query.chunk.firstWhere(_testRoom); } @override Widget build(BuildContext context) { - final roomAlias = this.roomAlias; - return Center( - child: SizedBox( - width: min( - MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5), - child: Material( - elevation: 4, - child: SafeArea( - child: Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - titleSpacing: 0, - backgroundColor: - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5), - title: Text( - roomAlias, - overflow: TextOverflow.fade, - ), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), - onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, - ), - actions: [ - TextButton.icon( - onPressed: () => _joinRoom(context), - label: Text(L10n.of(context)!.joinRoom), - icon: const Icon(Icons.login_outlined), + final roomAlias = this.roomAlias ?? chunk?.canonicalAlias; + final roomLink = roomAlias ?? chunk?.roomId; + return SafeArea( + child: Scaffold( + appBar: AppBar( + title: Text( + chunk?.name ?? roomAlias ?? chunk?.roomId ?? 'Unknown', + overflow: TextOverflow.fade, + ), + leading: Center( + child: CloseButton( + onPressed: Navigator.of(context, rootNavigator: false).pop, + ), + ), + actions: roomAlias == null + ? null + : [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: IconButton( + icon: const Icon(Icons.qr_code_rounded), + onPressed: () => showQrCodeViewer( + context, + roomAlias, + ), + ), ), ], - ), - body: FutureBuilder( - future: _search(context), - builder: (context, snapshot) { - final profile = snapshot.data; - return ListView( - padding: EdgeInsets.zero, - children: [ - if (profile == null) - Container( - height: 156, - alignment: Alignment.center, - color: Theme.of(context).secondaryHeaderColor, - child: snapshot.hasError - ? Text( - snapshot.error!.toLocalizedString(context)) - : const CircularProgressIndicator.adaptive( - strokeWidth: 2), - ) - else - ContentBanner( - mxContent: profile.avatarUrl, - height: 156, - defaultIcon: Icons.group_outlined, - client: Matrix.of(context).client, + ), + body: FutureBuilder( + future: _search(), + builder: (context, snapshot) { + final theme = Theme.of(context); + + final profile = snapshot.data; + return ListView( + padding: EdgeInsets.zero, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: profile == null + ? const Center( + child: CircularProgressIndicator.adaptive(), + ) + : Avatar( + client: Matrix.of(outerContext).client, + mxContent: profile.avatarUrl, + name: profile.name ?? roomAlias, + size: Avatar.defaultSize * 3, + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: roomLink != null + ? () => FluffyShare.share( + roomLink, + context, + copyOnly: true, + ) + : null, + icon: const Icon( + Icons.copy_outlined, + size: 14, + ), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + ), + label: Text( + roomLink ?? '...', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ), - ListTile( - title: - Text(profile?.name ?? roomAlias.localpart ?? ''), - subtitle: Text( - '${L10n.of(context)!.participant}: ${profile?.numJoinedMembers ?? 0}'), - trailing: const Icon(Icons.account_box_outlined), - ), - if (profile?.topic?.isNotEmpty ?? false) - ListTile( - subtitle: Html(data: profile!.topic!), + TextButton.icon( + onPressed: () {}, + icon: const Icon( + Icons.groups_3_outlined, + size: 14, + ), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + ), + label: Text( + L10n.of(context).countParticipants( + profile?.numJoinedMembers ?? 0, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ), - ], - ); - }), - ), - ), + ], + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ElevatedButton.icon( + onPressed: () => _joinRoom(context), + label: Text( + chunk?.joinRule == 'knock' && + Matrix.of(outerContext) + .client + .getRoomById(chunk!.roomId) == + null + ? L10n.of(context).knock + : chunk?.roomType == 'm.space' + ? L10n.of(context).joinSpace + : L10n.of(context).joinRoom, + ), + icon: const Icon(Icons.navigate_next), + ), + ), + const SizedBox(height: 16), + if (profile?.topic?.isNotEmpty ?? false) + ListTile( + subtitle: SelectableLinkify( + text: profile!.topic!, + linkStyle: const TextStyle( + color: Colors.blueAccent, + decorationColor: Colors.blueAccent, + ), + style: TextStyle( + fontSize: 14, + color: theme.textTheme.bodyMedium!.color, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ), + ], + ); + }, ), ), ); diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart new file mode 100644 index 0000000000..09d2875a48 --- /dev/null +++ b/lib/widgets/qr_code_viewer.dart @@ -0,0 +1,138 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:image/image.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; +import 'package:qr_image/qr_image.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../config/themes.dart'; + +Future showQrCodeViewer( + BuildContext context, + String content, +) => + showDialog( + context: context, + builder: (context) => QrCodeViewer(content: content), + ); + +class QrCodeViewer extends StatelessWidget { + final String content; + + const QrCodeViewer({required this.content, super.key}); + + void _save(BuildContext context) async { + final imageResult = await showFutureLoadingDialog( + context: context, + future: () async { + final inviteLink = 'https://matrix.to/#/$content'; + final image = QRImage( + inviteLink, + size: 256, + radius: 1, + ).generate(); + return compute(encodePng, image); + }, + ); + final bytes = imageResult.result; + if (bytes == null) return; + if (!context.mounted) return; + + MatrixImageFile( + bytes: bytes, + name: 'QR_Code_$content.png', + mimeType: 'image/png', + ).save(context); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final inviteLink = 'https://matrix.to/#/$content'; + return Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + color: Colors.white, + tooltip: L10n.of(context).close, + ), + backgroundColor: Colors.transparent, + actions: [ + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: Icon(Icons.adaptive.share_outlined), + onPressed: () => FluffyShare.share( + inviteLink, + context, + ), + color: Colors.white, + tooltip: L10n.of(context).share, + ), + const SizedBox(width: 8), + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: const Icon(Icons.download_outlined), + onPressed: () => _save(context), + color: Colors.white, + tooltip: L10n.of(context).downloadFile, + ), + const SizedBox(width: 8), + ], + ), + body: Center( + child: Container( + margin: const EdgeInsets.all(32.0), + padding: const EdgeInsets.all(32.0), + decoration: BoxDecoration( + color: theme.colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth), + child: PrettyQrView.data( + data: inviteLink, + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 1, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + const SizedBox(height: 8.0), + SelectableText( + content, + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontSize: 12, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/sentry_switch_list_tile.dart b/lib/widgets/sentry_switch_list_tile.dart deleted file mode 100644 index d60df5ee5a..0000000000 --- a/lib/widgets/sentry_switch_list_tile.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/utils/sentry_controller.dart'; - -class SentrySwitchListTile extends StatefulWidget { - final String label; - - const SentrySwitchListTile.adaptive({Key? key, required this.label}) - : super(key: key); - - @override - _SentrySwitchListTileState createState() => _SentrySwitchListTileState(); -} - -class _SentrySwitchListTileState extends State { - bool _enabled = false; - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: SentryController.getSentryStatus(), - builder: (context, snapshot) { - _enabled = snapshot.data ?? false; - return SwitchListTile.adaptive( - title: Text(widget.label), - value: _enabled, - onChanged: (b) => - SentryController.toggleSentryAction(context, b).then( - (_) => setState(() {}), - ), - ); - }); - } -} diff --git a/lib/widgets/settings_switch_list_tile.dart b/lib/widgets/settings_switch_list_tile.dart index 11e3b5adf9..f49b97598b 100644 --- a/lib/widgets/settings_switch_list_tile.dart +++ b/lib/widgets/settings_switch_list_tile.dart @@ -6,36 +6,36 @@ class SettingsSwitchListTile extends StatefulWidget { final bool defaultValue; final String storeKey; final String title; + final String? subtitle; final Function(bool)? onChanged; const SettingsSwitchListTile.adaptive({ - Key? key, + super.key, this.defaultValue = false, required this.storeKey, required this.title, + this.subtitle, this.onChanged, - }) : super(key: key); + }); @override - _SettingsSwitchListTileState createState() => _SettingsSwitchListTileState(); + SettingsSwitchListTileState createState() => SettingsSwitchListTileState(); } -class _SettingsSwitchListTileState extends State { +class SettingsSwitchListTileState extends State { @override Widget build(BuildContext context) { - return FutureBuilder( - future: Matrix.of(context) - .store - .getItemBool(widget.storeKey, widget.defaultValue), - builder: (context, snapshot) => SwitchListTile.adaptive( - value: snapshot.data ?? widget.defaultValue, - title: Text(widget.title), - onChanged: (bool newValue) async { - widget.onChanged?.call(newValue); - await Matrix.of(context).store.setItemBool(widget.storeKey, newValue); - setState(() {}); - }, - ), + final subtitle = widget.subtitle; + return SwitchListTile.adaptive( + value: Matrix.of(context).store.getBool(widget.storeKey) ?? + widget.defaultValue, + title: Text(widget.title), + subtitle: subtitle == null ? null : Text(subtitle), + onChanged: (bool newValue) async { + widget.onChanged?.call(newValue); + await Matrix.of(context).store.setBool(widget.storeKey, newValue); + setState(() {}); + }, ); } } diff --git a/lib/widgets/share_scaffold_dialog.dart b/lib/widgets/share_scaffold_dialog.dart new file mode 100644 index 0000000000..80a914340a --- /dev/null +++ b/lib/widgets/share_scaffold_dialog.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.dart'; + +import 'package:cross_file/cross_file.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +abstract class ShareItem {} + +class TextShareItem extends ShareItem { + final String value; + TextShareItem(this.value); +} + +class ContentShareItem extends ShareItem { + final Map value; + ContentShareItem(this.value); +} + +class FileShareItem extends ShareItem { + final XFile value; + FileShareItem(this.value); +} + +class ShareScaffoldDialog extends StatefulWidget { + final List items; + + const ShareScaffoldDialog({required this.items, super.key}); + + @override + State createState() => _ShareScaffoldDialogState(); +} + +class _ShareScaffoldDialogState extends State { + final TextEditingController _filterController = TextEditingController(); + + String? selectedRoomId; + + void _toggleRoom(String roomId) { + setState(() { + selectedRoomId = roomId; + }); + } + + void _forwardAction() async { + final roomId = selectedRoomId; + if (roomId == null) { + throw Exception( + 'Started forward action before room was selected. This should never happen.', + ); + } + while (context.canPop()) { + context.pop(); + } + context.go('/rooms/$roomId', extra: widget.items); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final rooms = Matrix.of(context) + .client + .rooms + .where( + (room) => + room.canSendDefaultMessages && + !room.isSpace && + room.membership == Membership.join, + ) + .toList(); + final filter = _filterController.text.trim().toLowerCase(); + return Scaffold( + appBar: AppBar( + leading: Center(child: CloseButton(onPressed: context.pop)), + title: Text(L10n.of(context).share), + ), + body: CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + toolbarHeight: 72, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: TextField( + controller: _filterController, + onChanged: (_) => setState(() {}), + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: IconButton( + onPressed: () {}, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + SliverList.builder( + itemCount: rooms.length, + itemBuilder: (context, i) { + final room = rooms[i]; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final value = selectedRoomId == room.id; + final filterOut = !displayname.toLowerCase().contains(filter); + if (!value && filterOut) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Opacity( + opacity: filterOut ? 0.5 : 1, + child: RadioListTile.adaptive( + controlAffinity: ListTileControlAffinity.trailing, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + ), + secondary: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 0.75, + ), + title: Text(displayname), + groupValue: selectedRoomId, + value: room.id, + onChanged: (_) => _toggleRoom(room.id), + ), + ), + ); + }, + ), + ], + ), + bottomNavigationBar: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: selectedRoomId == null + ? const SizedBox.shrink() + : Material( + elevation: 8, + shadowColor: theme.appBarTheme.shadowColor, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + onPressed: _forwardAction, + child: Text(L10n.of(context).forward), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart new file mode 100644 index 0000000000..1ce0a6f051 --- /dev/null +++ b/lib/widgets/theme_builder.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/utils/color_value.dart'; + +class ThemeBuilder extends StatefulWidget { + final Widget Function( + BuildContext context, + ThemeMode themeMode, + Color? primaryColor, + ) builder; + + final String themeModeSettingsKey; + final String primaryColorSettingsKey; + + const ThemeBuilder({ + required this.builder, + this.themeModeSettingsKey = 'theme_mode', + this.primaryColorSettingsKey = 'primary_color', + super.key, + }); + + @override + State createState() => ThemeController(); +} + +class ThemeController extends State { + SharedPreferences? _sharedPreferences; + ThemeMode? _themeMode; + Color? _primaryColor; + + ThemeMode get themeMode => _themeMode ?? ThemeMode.system; + + Color? get primaryColor => _primaryColor; + + static ThemeController of(BuildContext context) => + Provider.of( + context, + listen: false, + ); + + void _loadData(_) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + + final rawThemeMode = preferences.getString(widget.themeModeSettingsKey); + final rawColor = preferences.getInt(widget.primaryColorSettingsKey); + + setState(() { + _themeMode = ThemeMode.values + .singleWhereOrNull((value) => value.name == rawThemeMode); + _primaryColor = rawColor == null ? null : Color(rawColor); + }); + } + + Future setThemeMode(ThemeMode newThemeMode) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + await preferences.setString(widget.themeModeSettingsKey, newThemeMode.name); + setState(() { + _themeMode = newThemeMode; + }); + } + + Future setPrimaryColor(Color? newPrimaryColor) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + if (newPrimaryColor == null) { + await preferences.remove(widget.primaryColorSettingsKey); + } else { + await preferences.setInt( + widget.primaryColorSettingsKey, + newPrimaryColor.hexValue, + ); + } + setState(() { + _primaryColor = newPrimaryColor; + }); + } + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback(_loadData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Provider( + create: (_) => this, + child: DynamicColorBuilder( + builder: (light, _) => widget.builder( + context, + themeMode, + primaryColor ?? light?.primary, + ), + ), + ); + } +} diff --git a/lib/widgets/unread_badge_back_button.dart b/lib/widgets/unread_badge_back_button.dart deleted file mode 100644 index 679e28e796..0000000000 --- a/lib/widgets/unread_badge_back_button.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -import '../config/app_config.dart'; -import 'matrix.dart'; - -class UnreadBadgeBackButton extends StatelessWidget { - final String roomId; - - const UnreadBadgeBackButton({ - Key? key, - required this.roomId, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - const Center(child: BackButton()), - StreamBuilder( - stream: Matrix.of(context).client.onSync.stream, - builder: (context, _) { - final unreadCount = Matrix.of(context) - .client - .rooms - .where((r) => - r.id != roomId && - (r.isUnread || r.membership == Membership.invite)) - .length; - return unreadCount > 0 - ? Align( - alignment: Alignment.bottomRight, - child: Container( - padding: const EdgeInsets.all(4), - margin: const EdgeInsets.only(bottom: 4, right: 8), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primaryContainer, - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), - ), - child: Text( - '$unreadCount', - style: TextStyle( - fontSize: 12, - color: Theme.of(context) - .colorScheme - .onPrimaryContainer, - ), - ), - ), - ) - : Container(); - }), - ], - ); - } -} diff --git a/lib/widgets/unread_rooms_badge.dart b/lib/widgets/unread_rooms_badge.dart new file mode 100644 index 0000000000..4951734961 --- /dev/null +++ b/lib/widgets/unread_rooms_badge.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import 'package:badges/badges.dart' as b; +import 'package:matrix/matrix.dart'; + +import 'matrix.dart'; + +class UnreadRoomsBadge extends StatelessWidget { + final bool Function(Room) filter; + final b.BadgePosition? badgePosition; + final Widget? child; + + const UnreadRoomsBadge({ + super.key, + required this.filter, + this.badgePosition, + this.child, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final unreadCount = Matrix.of(context) + .client + .rooms + .where(filter) + .where((r) => (r.isUnread || r.membership == Membership.invite)) + .length; + return b.Badge( + badgeStyle: b.BadgeStyle( + badgeColor: theme.colorScheme.primary, + elevation: 4, + borderSide: BorderSide( + color: theme.colorScheme.surface, + width: 2, + ), + ), + badgeContent: Text( + unreadCount.toString(), + style: TextStyle( + color: theme.colorScheme.onPrimary, + fontSize: 12, + ), + ), + showBadge: unreadCount != 0, + badgeAnimation: const b.BadgeAnimation.scale(), + position: badgePosition ?? b.BadgePosition.bottomEnd(), + child: child, + ); + } +} diff --git a/licenses.yaml b/licenses.yaml new file mode 100644 index 0000000000..ebab434402 --- /dev/null +++ b/licenses.yaml @@ -0,0 +1,39 @@ +# This is a config for a license compliance checker script. It runs in CI. +# +# To run locally: +# dart run license_checker check-licenses -c licenses.yaml --problematic +# +# SPDX license list: https://spdx.org/licenses/ + +# Before you add a license here: Is it free software? Is it compatible with AGPL-3.0? +permittedLicenses: + - AGPL-3.0 + - Apache-2.0 + - BSD-2-Clause + - BSD-3-Clause + - EUPL-1.2 + - LGPL-3.0 + - MIT + - MPL-2.0 + - Zlib + +packageLicenseOverride: + dependency_validator: Apache-2.0 + flutter_gen: MIT + hive: Apache-2.0 + hive_flutter: Apache-2.0 + latlong2: Apache-2.0 + platform_detect: Apache-2.0 + rxdart: Apache-2.0 + + # flutter's internal packages + flutter_driver: BSD-3-Clause + flutter_localizations: BSD-3-Clause + flutter_test: BSD-3-Clause + flutter_web_plugins: BSD-3-Clause + fuchsia_remote_debug_protocol: BSD-3-Clause + integration_test: BSD-3-Clause + sky_engine: BSD-3-Clause + +rejectedLicenses: + - BUSL-1.1 diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 9e00441c64..ecb5b8764a 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -1,11 +1,21 @@ +# Project-level configuration. cmake_minimum_required(VERSION 3.10) project(runner LANGUAGES CXX) +# smth sqlcipher_flutter_libs static linking Hundreds +set(OPENSSL_USE_STATIC_LIBS OFF) +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. set(BINARY_NAME "fluffychat") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID set(APPLICATION_ID "chat.fluffy.fluffychat") +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. cmake_policy(SET CMP0063 NEW) +# Load bundled libraries from the lib/ directory relative to the binary. set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") # Root filesystem for cross-building. @@ -18,7 +28,7 @@ if(FLUTTER_TARGET_PLATFORM_SYSROOT) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) endif() -# Configure build options. +# Define build configuration options. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Flutter build mode" FORCE) @@ -27,6 +37,10 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) endif() # Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. function(APPLY_STANDARD_SETTINGS TARGET) target_compile_features(${TARGET} PUBLIC cxx_std_14) target_compile_options(${TARGET} PRIVATE -Wall -Werror) @@ -34,9 +48,8 @@ function(APPLY_STANDARD_SETTINGS TARGET) target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") endfunction() -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - # Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") add_subdirectory(${FLUTTER_MANAGED_DIR}) # System-level dependencies. @@ -45,16 +58,27 @@ pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") -# Application build +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. add_executable(${BINARY_NAME} "main.cc" "my_application.cc" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" ) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter) target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. add_dependencies(${BINARY_NAME} flutter_assemble) + # Only the install-generated bundle's copy of the executable will launch # correctly, since the resources must in the right relative locations. To avoid # people trying to run the unbundled copy, put it in a subdirectory instead of @@ -64,6 +88,7 @@ set_target_properties(${BINARY_NAME} RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" ) + # Generated plugin build rules, which manage building the plugins and adding # them to the application. include(flutter/generated_plugins.cmake) @@ -94,11 +119,17 @@ install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR} install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -endif() +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt index 33fd5801e7..d5bd01648a 100644 --- a/linux/flutter/CMakeLists.txt +++ b/linux/flutter/CMakeLists.txt @@ -1,3 +1,4 @@ +# This file controls Flutter-level build steps. It should not be edited. cmake_minimum_required(VERSION 3.10) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 9d2206953a..b5155de259 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,25 +7,53 @@ #include "generated_plugin_registrant.h" #include -#include +#include +#include #include #include +#include +#include +#include +#include +#include #include +#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) desktop_drop_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); - g_autoptr(FlPluginRegistrar) desktop_lifecycle_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopLifecyclePlugin"); - desktop_lifecycle_plugin_register_with_registrar(desktop_lifecycle_registrar); + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin"); + emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar); g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); + flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); + g_autoptr(FlPluginRegistrar) handy_window_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin"); + handy_window_plugin_register_with_registrar(handy_window_registrar); + g_autoptr(FlPluginRegistrar) pasteboard_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PasteboardPlugin"); + pasteboard_plugin_register_with_registrar(pasteboard_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) sqlcipher_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); + sqlite3_flutter_libs_plugin_register_with_registrar(sqlcipher_flutter_libs_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_to_front_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowToFrontPlugin"); + window_to_front_plugin_register_with_registrar(window_to_front_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 43424f5e23..dab6fedfc5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,10 +4,17 @@ list(APPEND FLUTTER_PLUGIN_LIST desktop_drop - desktop_lifecycle + dynamic_color + emoji_picker_flutter file_selector_linux flutter_secure_storage_linux + flutter_webrtc + handy_window + pasteboard + record_linux + sqlcipher_flutter_libs url_launcher_linux + window_to_front ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/linux/my_application.cc b/linux/my_application.cc index 4c0501c1a6..986be4ea35 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -28,43 +28,55 @@ static void my_application_activate(GApplication* application) { // If running on Wayland assume the header bar will work (may need changing // if future cases occur). gboolean use_header_bar = TRUE; + // Lines added to the template start + // Please re-add these lines after updating the linux build files + // If the user explicitly requests to disable the header bar, switch back to + // using a traditional title bar + const gchar* gtk_csd_env = g_getenv("GTK_CSD"); + if (gtk_csd_env != nullptr && g_strcmp0(gtk_csd_env, "1") != 0) + use_header_bar = FALSE; + // Lines added to the template end #ifdef GDK_WINDOWING_X11 - GdkScreen *screen = gtk_window_get_screen(window); + GdkScreen* screen = gtk_window_get_screen(window); if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + // Lines added to the template start + // Please re-add these lines after updating the linux build files + // Disable libhandy here, otherwise the close button disappears on KDE X11 + g_setenv("GTK_CSD", "0", TRUE); + // Lines added to the template end + } } #endif if (use_header_bar) { - GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); gtk_header_bar_set_title(header_bar, "FluffyChat"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } - else { + } else { gtk_window_set_title(window, "FluffyChat"); } - gtk_window_set_default_size(window, 800, 600); - gtk_widget_show(GTK_WIDGET(window)); + gtk_window_set_default_size(window, 864, 720); g_autoptr(FlDartProject) project = fl_dart_project_new(); fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + gtk_widget_show(GTK_WIDGET(window)); + gtk_widget_show(GTK_WIDGET(view)); gtk_widget_grab_focus(GTK_WIDGET(view)); } // Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar ***arguments, int *exit_status) { +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { MyApplication* self = MY_APPLICATION(application); // Strip out the first argument as it is the binary name. self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); @@ -82,8 +94,26 @@ static gboolean my_application_local_command_line(GApplication* application, gch return TRUE; } +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + // Implements GObject::dispose. -static void my_application_dispose(GObject *object) { +static void my_application_dispose(GObject* object) { MyApplication* self = MY_APPLICATION(object); g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); G_OBJECT_CLASS(my_application_parent_class)->dispose(object); @@ -92,6 +122,8 @@ static void my_application_dispose(GObject *object) { static void my_application_class_init(MyApplicationClass* klass) { G_APPLICATION_CLASS(klass)->activate = my_application_activate; G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; G_OBJECT_CLASS(klass)->dispose = my_application_dispose; } diff --git a/macos/.gitignore b/macos/.gitignore index d2fd377230..746adbb6b9 100644 --- a/macos/.gitignore +++ b/macos/.gitignore @@ -3,4 +3,5 @@ **/Pods/ # Xcode-related +**/dgph **/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index 785633d3a8..4b81f9b2d2 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1,2 +1,2 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index 5fba960c3a..5caa9d1579 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1,2 +1,2 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 6f2fa9d236..b737356f93 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,47 +6,57 @@ import FlutterMacOS import Foundation import audio_session -import connectivity_plus_macos import desktop_drop -import desktop_lifecycle -import device_info_plus_macos +import device_info_plus +import dynamic_color import emoji_picker_flutter +import file_selector_macos +import flutter_app_badger import flutter_local_notifications import flutter_secure_storage_macos -import flutter_web_auth +import flutter_web_auth_2 import flutter_webrtc import geolocator_apple import just_audio -import package_info_plus_macos -import path_provider_macos -import record_macos -import share_plus_macos -import shared_preferences_macos +import package_info_plus +import pasteboard +import path_provider_foundation +import record_darwin +import share_plus +import shared_preferences_foundation import sqflite +import sqlcipher_flutter_libs import url_launcher_macos import video_compress -import wakelock_macos +import video_player_avfoundation +import wakelock_plus +import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) - ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) - DesktopLifecyclePlugin.register(with: registry.registrar(forPlugin: "DesktopLifecyclePlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) - FlutterSecureStorageMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageMacosPlugin")) - FlutterWebAuthPlugin.register(with: registry.registrar(forPlugin: "FlutterWebAuthPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FlutterWebAuth2Plugin.register(with: registry.registrar(forPlugin: "FlutterWebAuth2Plugin")) FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) - FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PasteboardPlugin.register(with: registry.registrar(forPlugin: "PasteboardPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin")) + RecordPlugin.register(with: registry.registrar(forPlugin: "RecordPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin")) - WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) } diff --git a/macos/Podfile b/macos/Podfile index 22966c3f04..b9bae3abcf 100644 --- a/macos/Podfile +++ b/macos/Podfile @@ -36,5 +36,8 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET' + end end end diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 6b664a2b20..221a217551 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,105 +1,143 @@ PODS: - - audio_session (0.0.1): + - appkit_ui_element_colors (1.0.0): - FlutterMacOS - - connectivity_plus_macos (0.0.1): + - audio_session (0.0.1): - FlutterMacOS - - ReachabilitySwift - desktop_drop (0.0.1): - FlutterMacOS - - desktop_lifecycle (0.0.1): + - device_info_plus (0.0.1): - FlutterMacOS - - device_info_plus_macos (0.0.1): + - dynamic_color (0.0.2): - FlutterMacOS - emoji_picker_flutter (0.0.1): - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS + - flutter_app_badger (1.3.0): + - FlutterMacOS - flutter_local_notifications (0.0.1): - FlutterMacOS - - flutter_secure_storage_macos (3.3.1): + - flutter_secure_storage_macos (6.1.1): - FlutterMacOS - - flutter_web_auth (0.4.1): + - flutter_web_auth_2 (3.0.0): - FlutterMacOS - - flutter_webrtc (0.7.1): + - flutter_webrtc (0.9.36): - FlutterMacOS - - WebRTC-SDK (= 97.4692.05) + - WebRTC-SDK (= 114.5735.08) - FlutterMacOS (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) + - FMDB/SQLCipher (2.7.5): + - SQLCipher - FMDB/standard (2.7.5) - geolocator_apple (1.2.0): - FlutterMacOS - just_audio (0.0.1): - FlutterMacOS - - package_info_plus_macos (0.0.1): + - macos_ui (0.1.0): + - FlutterMacOS + - macos_window_utils (1.0.0): - FlutterMacOS - - path_provider_macos (0.0.1): + - package_info_plus (0.0.1): - FlutterMacOS - - ReachabilitySwift (5.0.0) - - record_macos (1.0.0): + - pasteboard (0.0.1): - FlutterMacOS - - share_plus_macos (0.0.1): + - path_provider_foundation (0.0.1): + - Flutter - FlutterMacOS - - shared_preferences_macos (0.0.1): + - record_macos (0.2.0): + - FlutterMacOS + - share_plus (0.0.1): + - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter - FlutterMacOS - sqflite (0.0.2): - FlutterMacOS - FMDB (>= 2.7.5) + - sqflite_sqlcipher (0.0.1): + - FlutterMacOS + - FMDB/SQLCipher (~> 2.7.5) + - SQLCipher (= 4.5.4) + - SQLCipher (4.5.4): + - SQLCipher/standard (= 4.5.4) + - SQLCipher/common (4.5.4) + - SQLCipher/standard (4.5.4): + - SQLCipher/common - url_launcher_macos (0.0.1): - FlutterMacOS - video_compress (0.3.0): - FlutterMacOS - - wakelock_macos (0.0.1): + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - WebRTC-SDK (114.5735.08) + - window_to_front (0.0.1): - FlutterMacOS - - WebRTC-SDK (97.4692.05) DEPENDENCIES: + - appkit_ui_element_colors (from `Flutter/ephemeral/.symlinks/plugins/appkit_ui_element_colors/macos`) - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - - connectivity_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos`) - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - - desktop_lifecycle (from `Flutter/ephemeral/.symlinks/plugins/desktop_lifecycle/macos`) - - device_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus_macos/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - flutter_app_badger (from `Flutter/ephemeral/.symlinks/plugins/flutter_app_badger/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - - flutter_web_auth (from `Flutter/ephemeral/.symlinks/plugins/flutter_web_auth/macos`) + - flutter_web_auth_2 (from `Flutter/ephemeral/.symlinks/plugins/flutter_web_auth_2/macos`) - flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - - package_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos`) - - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) + - macos_ui (from `Flutter/ephemeral/.symlinks/plugins/macos_ui/macos`) + - macos_window_utils (from `Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - pasteboard (from `Flutter/ephemeral/.symlinks/plugins/pasteboard/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`) - - share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`) - - shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) + - sqflite_sqlcipher (from `Flutter/ephemeral/.symlinks/plugins/sqflite_sqlcipher/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - video_compress (from `Flutter/ephemeral/.symlinks/plugins/video_compress/macos`) - - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) + - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - window_to_front (from `Flutter/ephemeral/.symlinks/plugins/window_to_front/macos`) SPEC REPOS: trunk: - FMDB - - ReachabilitySwift + - SQLCipher - WebRTC-SDK EXTERNAL SOURCES: + appkit_ui_element_colors: + :path: Flutter/ephemeral/.symlinks/plugins/appkit_ui_element_colors/macos audio_session: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos - connectivity_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos desktop_drop: :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos - desktop_lifecycle: - :path: Flutter/ephemeral/.symlinks/plugins/desktop_lifecycle/macos - device_info_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus_macos/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + dynamic_color: + :path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos emoji_picker_flutter: :path: Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + flutter_app_badger: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_app_badger/macos flutter_local_notifications: :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos flutter_secure_storage_macos: :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos - flutter_web_auth: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_web_auth/macos + flutter_web_auth_2: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_web_auth_2/macos flutter_webrtc: :path: Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos FlutterMacOS: @@ -108,52 +146,72 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos just_audio: :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos - package_info_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos - path_provider_macos: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos + macos_ui: + :path: Flutter/ephemeral/.symlinks/plugins/macos_ui/macos + macos_window_utils: + :path: Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + pasteboard: + :path: Flutter/ephemeral/.symlinks/plugins/pasteboard/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin record_macos: :path: Flutter/ephemeral/.symlinks/plugins/record_macos/macos - share_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos - shared_preferences_macos: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sqflite: :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos + sqflite_sqlcipher: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_sqlcipher/macos url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos video_compress: :path: Flutter/ephemeral/.symlinks/plugins/video_compress/macos - wakelock_macos: - :path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos + video_player_avfoundation: + :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + window_to_front: + :path: Flutter/ephemeral/.symlinks/plugins/window_to_front/macos SPEC CHECKSUMS: + appkit_ui_element_colors: 39bb2d80be3f19b152ccf4c70d5bbe6cba43d74a audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 - connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308 desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 - desktop_lifecycle: a600c10e12fe033c7be9078f2e929b8241f2c1e3 - device_info_plus_macos: 1ad388a1ef433505c4038e7dd9605aadd1e2e9c7 + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f emoji_picker_flutter: 533634326b1c5de9a181ba14b9758e6dfe967a20 + file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 + flutter_app_badger: 55a64b179f8438e89d574320c77b306e327a1730 flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 - flutter_secure_storage_macos: 6ceee8fbc7f484553ad17f79361b556259df89aa - flutter_web_auth: ae2c29ca9b98c00b4e0e8c0919bb4a05d44b76df - flutter_webrtc: 37c4efd66d9d306878c1323d5ac5a1d10c748b3a - FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 + flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea + flutter_web_auth_2: 2e1dc2d2139973e4723c5286ce247dd590390d70 + flutter_webrtc: cf7dc44d26cbb5c5f1ae5f583dab545871f287f9 + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a geolocator_apple: 821be05bbdb1b49500e029ebcbf2d6acf2dfb966 just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 - package_info_plus_macos: f010621b07802a241d96d01876d6705f15e77c1c - path_provider_macos: 160cab0d5461f0c0e02995469a98f24bdb9a3f1f - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - record_macos: dcf4f2bb654970437e012521cb4ea1fca4f78bb9 - share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4 - shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727 + macos_ui: 6229a8922cd97bafb7d9636c8eb8dfb0744183ca + macos_window_utils: 933f91f64805e2eb91a5bd057cf97cd097276663 + package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce + pasteboard: 9b69dba6fedbb04866be632205d532fe2f6b1d99 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + record_macos: 937889e0f2a7a12b6fc14e97a3678e5a18943de6 + share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 + sqflite_sqlcipher: d1ac7c60596e4d624d9757e3ec96e9cfafb734d6 + SQLCipher: 905b145f65f349f26da9e60a19901ad24adcd381 + url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 video_compress: c896234f100791b5fef7f049afa38f6d2ef7b42f - wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 - WebRTC-SDK: a6ee40bda0e3f7dba057907c3897374005c5715b + video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1 + wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 + WebRTC-SDK: c24d2a6c9f571f2ed42297cb8ffba9557093142b + window_to_front: 4cdc24ddd8461ad1a55fa06286d6a79d8b29e8d8 -PODFILE CHECKSUM: 9b8d08a513b178c33212d1b54cc9e3cba756d95b +PODFILE CHECKSUM: d0975b16fbdecb73b109d8fbc88aa77ffe4c7a8d -COCOAPODS: 1.11.3 +COCOAPODS: 1.14.3 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 0f19f640fe..41d360c6f2 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -26,7 +26,7 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9795BB5F91BF4775B6B0D9D5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F69524ABCBB1D526AF7967B9 /* Pods_Runner.framework */; }; + 9CAF203E1D098383F2EDFFCB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -53,7 +53,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 2D20EFA3D49BBBDA1F07645D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2D119A6B273B2CE4A6AE3322 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 33CC10ED2044A3C60003C045 /* FluffyChat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FluffyChat.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -68,11 +68,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3CD34DC616BB2AF9B1580285 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 35E6B919318905352ECC7D69 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 5CDC3DD55F4AC23D2067B292 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 997C663EFCBF8E403128D1D1 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - F69524ABCBB1D526AF7967B9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A1CEA3AEDDC9976F00DB3AFE /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF767714B5564068E3D500A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B5C1522B2F3865267414BD3C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + CC70F3DF47EEC43FC2D35C75 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -80,7 +84,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9795BB5F91BF4775B6B0D9D5 /* Pods_Runner.framework in Frameworks */, + 9CAF203E1D098383F2EDFFCB /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -105,7 +109,7 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - E41DDAA8A3B17F99D7E5251E /* Pods */, + F9F203356080D460FB6D4567 /* Pods */, ); sourceTree = ""; }; @@ -155,17 +159,21 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - F69524ABCBB1D526AF7967B9 /* Pods_Runner.framework */, + B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */, + A1CEA3AEDDC9976F00DB3AFE /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; - E41DDAA8A3B17F99D7E5251E /* Pods */ = { + F9F203356080D460FB6D4567 /* Pods */ = { isa = PBXGroup; children = ( - 2D20EFA3D49BBBDA1F07645D /* Pods-Runner.debug.xcconfig */, - 997C663EFCBF8E403128D1D1 /* Pods-Runner.release.xcconfig */, - 3CD34DC616BB2AF9B1580285 /* Pods-Runner.profile.xcconfig */, + CC70F3DF47EEC43FC2D35C75 /* Pods-Runner.debug.xcconfig */, + B5C1522B2F3865267414BD3C /* Pods-Runner.release.xcconfig */, + AF767714B5564068E3D500A8 /* Pods-Runner.profile.xcconfig */, + 5CDC3DD55F4AC23D2067B292 /* Pods-RunnerTests.debug.xcconfig */, + 2D119A6B273B2CE4A6AE3322 /* Pods-RunnerTests.release.xcconfig */, + 35E6B919318905352ECC7D69 /* Pods-RunnerTests.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -177,13 +185,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - E26D3B733E5CAE51F86A6BE1 /* [CP] Check Pods Manifest.lock */, + 213E973AEF6461D8FA01037B /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 28EE3A13194E86CCA3B8236A /* [CP] Embed Pods Frameworks */, + 889FA79FC2223BE511C611AF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -202,8 +210,8 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = "The Flutter Authors"; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { CreatedOnToolsVersion = 9.2; @@ -222,7 +230,7 @@ }; }; buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 8.0"; + compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -253,72 +261,31 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 28EE3A13194E86CCA3B8236A /* [CP] Embed Pods Frameworks */ = { + 213E973AEF6461D8FA01037B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", - "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/audio_session/audio_session.framework", - "${BUILT_PRODUCTS_DIR}/connectivity_plus_macos/connectivity_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/desktop_drop/desktop_drop.framework", - "${BUILT_PRODUCTS_DIR}/desktop_lifecycle/desktop_lifecycle.framework", - "${BUILT_PRODUCTS_DIR}/device_info_plus_macos/device_info_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/emoji_picker_flutter/emoji_picker_flutter.framework", - "${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework", - "${BUILT_PRODUCTS_DIR}/flutter_secure_storage_macos/flutter_secure_storage_macos.framework", - "${BUILT_PRODUCTS_DIR}/flutter_web_auth/flutter_web_auth.framework", - "${BUILT_PRODUCTS_DIR}/flutter_webrtc/flutter_webrtc.framework", - "${BUILT_PRODUCTS_DIR}/geolocator_apple/geolocator_apple.framework", - "${BUILT_PRODUCTS_DIR}/just_audio/just_audio.framework", - "${BUILT_PRODUCTS_DIR}/package_info_plus_macos/package_info_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/path_provider_macos/path_provider_macos.framework", - "${BUILT_PRODUCTS_DIR}/record_macos/record_macos.framework", - "${BUILT_PRODUCTS_DIR}/share_plus_macos/share_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/shared_preferences_macos/shared_preferences_macos.framework", - "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework", - "${BUILT_PRODUCTS_DIR}/url_launcher_macos/url_launcher_macos.framework", - "${BUILT_PRODUCTS_DIR}/video_compress/video_compress.framework", - "${BUILT_PRODUCTS_DIR}/wakelock_macos/wakelock_macos.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC-SDK/WebRTC.framework/WebRTC", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/audio_session.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/desktop_drop.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/desktop_lifecycle.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/emoji_picker_flutter.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_web_auth.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_webrtc.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/geolocator_apple.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/just_audio.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/record_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_compress.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -352,28 +319,23 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - E26D3B733E5CAE51F86A6BE1 /* [CP] Check Pods Manifest.lock */ = { + 889FA79FC2223BE511C611AF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -465,19 +427,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4NXF6Z997G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter/ephemeral", - ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_NAME = FluffyChat; + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -487,7 +449,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = FluffyChat; }; name = Profile; }; @@ -597,19 +559,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4NXF6Z997G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter/ephemeral", - ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_NAME = FluffyChat; + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -623,19 +585,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4NXF6Z997G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter/ephemeral", - ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_NAME = FluffyChat; + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -645,7 +607,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = FluffyChat; }; name = Debug; }; @@ -653,7 +615,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = FluffyChat; }; name = Release; }; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 50396d3d56..7275d672c7 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -27,29 +27,28 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - - - + + + + + + - - diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index d53ef64377..8e02df2888 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png new file mode 100644 index 0000000000..7d0807b331 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png new file mode 100644 index 0000000000..86e89d9554 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png new file mode 100644 index 0000000000..77ef66d1d8 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png new file mode 100644 index 0000000000..b1634c7acd Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png new file mode 100644 index 0000000000..7b22bd48f5 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png new file mode 100644 index 0000000000..c0a9729d79 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png new file mode 100644 index 0000000000..ef2962a703 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f19f..eba1335b9c 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{"images":[{"size":"1024x1024","filename":"1024-mac.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index fb1434bfef..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 34d07d5eac..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index e78ba9054b..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index f7508e359d..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100644 index 6154ba14c8..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100644 index 6245280ee2..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 7de4d1f3eb..0000000000 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib index 537341abf9..80e867a4e0 100644 --- a/macos/Runner/Base.lproj/MainMenu.xib +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -323,6 +323,10 @@ + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 362569a7de..11b3701b2e 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = fluffychat +PRODUCT_NAME = FluffyChat // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = chat.fluffy.fluffychat +PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.fluffychat // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2020 chat.fluffy. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2023 FluffyChat authors. All rights reserved. diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index 5d5d548397..a964b6bd56 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -4,21 +4,23 @@ com.apple.security.app-sandbox - com.apple.security.assets.movies.read-only - - com.apple.security.assets.music.read-only - com.apple.security.assets.pictures.read-only com.apple.security.cs.allow-jit - com.apple.security.files.downloads.read-write + com.apple.security.device.audio-input - com.apple.security.files.user-selected.read-only + com.apple.security.device.camera + + com.apple.security.files.user-selected.read-write com.apple.security.network.client com.apple.security.network.server + com.apple.security.personal-information.location + + keychain-access-groups + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 2722837ec9..3cc05eb234 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -3,7 +3,7 @@ import FlutterMacOS class MainFlutterWindow: NSWindow { override func awakeFromNib() { - let flutterViewController = FlutterViewController.init() + let flutterViewController = FlutterViewController() let windowFrame = self.frame self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 61a7ad0c7c..cfeb4e70fb 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -4,19 +4,19 @@ com.apple.security.app-sandbox - com.apple.security.assets.movies.read-only - - com.apple.security.assets.music.read-only - com.apple.security.assets.pictures.read-only - com.apple.security.files.downloads.read-write + com.apple.security.device.audio-input + + com.apple.security.device.camera - com.apple.security.files.user-selected.read-only + com.apple.security.files.user-selected.read-write com.apple.security.network.client - com.apple.security.network.server + com.apple.security.personal-information.location + keychain-access-groups + diff --git a/pubspec.lock b/pubspec.lock index f4032c9f22..9246006de0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,473 +5,431 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" + url: "https://pub.dev" source: hosted - version: "31.0.0" - adaptive_dialog: - dependency: "direct main" - description: - name: adaptive_dialog - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.1" - adaptive_theme: - dependency: "direct main" - description: - name: adaptive_theme - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" + version: "76.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.3" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - analyzer_plugin: - dependency: transitive - description: - name: analyzer_plugin - url: "https://pub.dartlang.org" + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" + url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "6.11.0" animations: dependency: "direct main" description: name: animations - url: "https://pub.dartlang.org" + sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.11" ansicolor: dependency: transitive description: name: ansicolor - url: "https://pub.dartlang.org" + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" archive: - dependency: transitive + dependency: "direct main" description: name: archive - url: "https://pub.dartlang.org" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" source: hosted - version: "3.1.11" + version: "3.6.1" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" source: hosted - version: "2.3.0" - asn1lib: - dependency: transitive - description: - name: asn1lib - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" + version: "2.5.0" async: - dependency: transitive + dependency: "direct main" description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.11.0" audio_session: dependency: transitive description: name: audio_session - url: "https://pub.dartlang.org" + sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" + url: "https://pub.dev" + source: hosted + version: "0.1.21" + badges: + dependency: "direct main" + description: + name: badges + sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + barbecue: + dependency: transitive + description: + name: barbecue + sha256: e3a0afaf9005e466887d6c87411a2ddd8d72fc46db3caabf278ee600f1e2f92c + url: "https://pub.dev" source: hosted - version: "0.1.6+1" + version: "0.4.0" base58check: dependency: transitive description: name: base58check - url: "https://pub.dartlang.org" + sha256: "6c300dfc33e598d2fe26319e13f6243fea81eaf8204cb4c6b69ef20a625319a5" + url: "https://pub.dev" source: hosted version: "2.0.0" blurhash_dart: dependency: "direct main" description: name: blurhash_dart - url: "https://pub.dartlang.org" + sha256: "43955b6c2e30a7d440028d1af0fa185852f3534b795cc6eb81fbf397b464409f" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.1" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - cached_network_image: - dependency: "direct main" - description: - name: cached_network_image - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "3.2.0" - cached_network_image_platform_interface: - dependency: transitive - description: - name: cached_network_image_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - cached_network_image_web: - dependency: transitive - description: - name: cached_network_image_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" + version: "2.1.1" callkeep: dependency: "direct main" description: name: callkeep - url: "https://pub.dartlang.org" + sha256: "9e86e9632a603a61f7045c179ea5ca0ee4da0a49fc5f80c2fe09fb422b96d3c6" + url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.3" canonical_json: dependency: transitive description: name: canonical_json - url: "https://pub.dartlang.org" + sha256: d6be1dd66b420c6ac9f42e3693e09edf4ff6edfee26cb4c28c1c019fdb8c0c15 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" chewie: dependency: "direct main" description: name: chewie - url: "https://pub.dartlang.org" + sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd" + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.8.5" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.4.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: "direct main" description: name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - connectivity_plus: - dependency: "direct main" - description: - name: connectivity_plus - url: "https://pub.dartlang.org" + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev" source: hosted - version: "2.2.1" - connectivity_plus_linux: - dependency: transitive - description: - name: connectivity_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - connectivity_plus_macos: + version: "1.19.0" + colorize: dependency: transitive description: - name: connectivity_plus_macos - url: "https://pub.dartlang.org" + name: colorize + sha256: "584746cd6ba1cba0633b6720f494fe6f9601c4170f0666c1579d2aa2a61071ba" + url: "https://pub.dev" source: hosted - version: "1.2.1" - connectivity_plus_platform_interface: - dependency: transitive - description: - name: connectivity_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - connectivity_plus_web: - dependency: "direct overridden" - description: - path: "packages/connectivity_plus/connectivity_plus_web" - ref: a04401cb48abe92d138c0e9288b360739994a9e9 - resolved-ref: a04401cb48abe92d138c0e9288b360739994a9e9 - url: "https://github.com/TheOneWithTheBraid/plus_plugins.git" - source: git - version: "1.2.1" - connectivity_plus_windows: + version: "3.0.0" + console: dependency: transitive description: - name: connectivity_plus_windows - url: "https://pub.dartlang.org" + name: console + sha256: e04e7824384c5b39389acdd6dc7d33f3efe6b232f6f16d7626f194f6a01ad69a + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "4.1.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.1" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: c1fb2dce3c0085f39dc72668e85f8e0210ec7de05345821ff58530567df345a5 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.9.2" cross_file: - dependency: transitive + dependency: "direct main" description: name: cross_file - url: "https://pub.dartlang.org" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.5" csslib: dependency: transitive description: name: csslib - url: "https://pub.dartlang.org" + sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" + url: "https://pub.dev" source: hosted - version: "0.17.1" + version: "0.17.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" source: hosted - version: "1.0.4" - dart_code_metrics: - dependency: "direct dev" - description: - name: dart_code_metrics - url: "https://pub.dartlang.org" - source: hosted - version: "4.12.0" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.1" + version: "1.0.8" dart_webrtc: dependency: transitive description: name: dart_webrtc - url: "https://pub.dartlang.org" + sha256: e65506edb452148220efab53d8d2f8bb9d827bd8bcd53cf3a3e6df70b27f3d86 + url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.4.10" dbus: - dependency: "direct overridden" + dependency: transitive description: name: dbus - url: "https://pub.dartlang.org" + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.10" desktop_drop: dependency: "direct main" description: name: desktop_drop - url: "https://pub.dartlang.org" + sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d + url: "https://pub.dev" source: hosted - version: "0.3.3" - desktop_lifecycle: - dependency: "direct main" - description: - name: desktop_lifecycle - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.0" + version: "0.4.4" desktop_notifications: dependency: "direct main" description: name: desktop_notifications - url: "https://pub.dartlang.org" + sha256: "6d92694ad6e9297a862c5ff7dd6b8ff64c819972557754769f819d2209612927" + url: "https://pub.dev" source: hosted version: "0.6.3" device_info_plus: dependency: "direct main" description: name: device_info_plus - url: "https://pub.dartlang.org" + sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 + url: "https://pub.dev" source: hosted - version: "4.0.0" - device_info_plus_linux: - dependency: transitive - description: - name: device_info_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - device_info_plus_macos: - dependency: transitive - description: - name: device_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.3" + version: "10.1.2" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - url: "https://pub.dartlang.org" + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" + url: "https://pub.dev" source: hosted - version: "2.3.0+1" - device_info_plus_web: - dependency: transitive - description: - name: device_info_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - device_info_plus_windows: - dependency: transitive - description: - name: device_info_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - disk_space: - dependency: transitive - description: - name: disk_space - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" + version: "7.0.1" dynamic_color: dependency: "direct main" description: name: dynamic_color - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.2" - email_validator: - dependency: "direct main" - description: - name: email_validator - url: "https://pub.dartlang.org" + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "1.7.0" emoji_picker_flutter: dependency: "direct main" description: name: emoji_picker_flutter - url: "https://pub.dartlang.org" + sha256: "08567e6f914d36c32091a96cf2f51d2558c47aa2bd47a590dc4f50e42e0965f6" + url: "https://pub.dev" source: hosted - version: "1.1.2" - encrypt: + version: "3.1.0" + emojis: dependency: "direct main" description: - name: encrypt - url: "https://pub.dartlang.org" + name: emojis + sha256: "2e4d847c3f1e2670f30dc355909ce6fa7808b4e626c34a4dd503a360995a38bf" + url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "0.9.9" enhanced_enum: dependency: transitive description: name: enhanced_enum - url: "https://pub.dartlang.org" + sha256: "074c5a8b9664799ca91e1e8b68003b8694cb19998671cbafd9c7779c13fcdecf" + url: "https://pub.dev" source: hosted - version: "0.1.2" + version: "0.2.4" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.1.3" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "7.0.0" file_picker: - dependency: transitive + dependency: "direct main" description: name: file_picker - url: "https://pub.dartlang.org" + sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" + url: "https://pub.dev" source: hosted - version: "4.5.1" - file_picker_cross: + version: "8.1.2" + file_selector: dependency: "direct main" description: - name: file_picker_cross - url: "https://pub.dartlang.org" + name: file_selector + sha256: "5019692b593455127794d5718304ff1ae15447dea286cdda9f0db2a796a1b828" + url: "https://pub.dev" source: hosted - version: "4.6.0" - file_selector: + version: "1.0.3" + file_selector_android: dependency: transitive description: - name: file_selector - url: "https://pub.dartlang.org" + name: file_selector_android + sha256: "00aafa9ae05a8663d0b4f17abd2a02316911ca0f46f9b9dacb9578b324d99590" + url: "https://pub.dev" source: hosted - version: "0.8.2+1" + version: "0.5.1+9" + file_selector_ios: + dependency: transitive + description: + name: file_selector_ios + sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420" + url: "https://pub.dev" + source: hosted + version: "0.5.3+1" file_selector_linux: dependency: transitive description: name: file_selector_linux - url: "https://pub.dartlang.org" + sha256: "712ce7fab537ba532c8febdb1a8f167b32441e74acd68c3ccb2e36dcb52c4ab2" + url: "https://pub.dev" + source: hosted + version: "0.9.3" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" + url: "https://pub.dev" source: hosted - version: "0.0.2+1" + version: "0.9.4+2" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - url: "https://pub.dartlang.org" + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.6.2" file_selector_web: dependency: transitive description: name: file_selector_web - url: "https://pub.dartlang.org" + sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 + url: "https://pub.dev" + source: hosted + version: "0.9.4+2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" + url: "https://pub.dev" source: hosted - version: "0.8.1+3" - fluffybox: + version: "0.9.3+3" + fixnum: dependency: transitive description: - name: fluffybox - url: "https://pub.dartlang.org" + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "0.4.3" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -481,98 +439,151 @@ packages: dependency: "direct main" description: name: flutter_app_badger - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - flutter_app_lock: - dependency: "direct main" - description: - name: flutter_app_lock - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - flutter_blurhash: - dependency: "direct main" - description: - name: flutter_blurhash - url: "https://pub.dartlang.org" + sha256: "64d4a279bab862ed28850431b9b446b9820aaae0bf363322d51077419f930fa8" + url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "1.5.0" flutter_cache_manager: dependency: "direct main" description: name: flutter_cache_manager - url: "https://pub.dartlang.org" + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.4.1" flutter_driver: dependency: transitive description: flutter source: sdk version: "0.0.0" - flutter_file_dialog: - dependency: transitive + flutter_foreground_task: + dependency: "direct main" description: - name: flutter_file_dialog - url: "https://pub.dartlang.org" + name: flutter_foreground_task + sha256: "6cf10a27f5e344cd2ecad0752d3a5f4ec32846d82fda8753b3fe2480ebb832a3" + url: "https://pub.dev" source: hosted - version: "2.3.0" - flutter_highlight: - dependency: transitive + version: "6.5.0" + flutter_highlighter: + dependency: "direct main" + description: + name: flutter_highlighter + sha256: "93173afd47a9ada53f3176371755e7ea4a1065362763976d06d6adfb4d946e10" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + flutter_html: + dependency: "direct main" + description: + name: flutter_html + sha256: "02ad69e813ecfc0728a455e4bf892b9379983e050722b1dce00192ee2e41d1ee" + url: "https://pub.dev" + source: hosted + version: "3.0.0-beta.2" + flutter_html_table: + dependency: "direct main" description: - name: flutter_highlight - url: "https://pub.dartlang.org" + name: flutter_html_table + sha256: e20c72d67ea2512e7b4949f6f7dd13d004e773b0f82c586a21f895e6bd90383c + url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "3.0.0-beta.2" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" + sha256: "98664be7be0e3ffca00de50f7f6a287ab62c763fc8c762e0a21584584a3ff4f8" + url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "6.0.0" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" + source: hosted + version: "1.0.0" flutter_keyboard_visibility_platform_interface: dependency: transitive description: name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_keyboard_visibility_web: dependency: transitive description: name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" source: hosted version: "2.0.0" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_layout_grid: + dependency: transitive + description: + name: flutter_layout_grid + sha256: "88b4f8484a0874962e27c47733ad256aeb26acc694a9f029edbef771d301885a" + url: "https://pub.dev" + source: hosted + version: "2.0.7" + flutter_linkify: + dependency: "direct main" + description: + name: flutter_linkify + sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073" + url: "https://pub.dev" + source: hosted + version: "6.0.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "3.0.2" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - url: "https://pub.dartlang.org" + sha256: "49eeef364fddb71515bc78d5a8c51435a68bccd6e4d68e25a942c5e47761ae71" + url: "https://pub.dev" source: hosted - version: "9.4.1" + version: "17.2.3" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - url: "https://pub.dartlang.org" + sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af + url: "https://pub.dev" source: hosted - version: "0.4.2" + version: "4.0.1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - url: "https://pub.dartlang.org" + sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "7.2.0" flutter_localizations: dependency: "direct main" description: flutter @@ -582,114 +593,107 @@ packages: dependency: "direct main" description: name: flutter_map - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter_math_fork: - dependency: transitive - description: - name: flutter_math_fork - url: "https://pub.dartlang.org" + sha256: "87cc8349b8fa5dccda5af50018c7374b6645334a0d680931c1fe11bce88fa5bb" + url: "https://pub.dev" source: hosted - version: "0.4.2+2" - flutter_matrix_html: - dependency: "direct main" - description: - name: flutter_matrix_html - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" + version: "6.2.1" flutter_native_splash: dependency: "direct dev" description: name: flutter_native_splash - url: "https://pub.dartlang.org" + sha256: aa06fec78de2190f3db4319dd60fdc8d12b2626e93ef9828633928c2dcaea840 + url: "https://pub.dev" source: hosted - version: "2.1.2+1" + version: "2.4.1" flutter_olm: dependency: "direct main" description: name: flutter_olm - url: "https://pub.dartlang.org" + sha256: "69aaac45d854e74d17d04dac8a0ca3f548266d271a0f0fa7600e006e81432417" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.2" flutter_openssl_crypto: dependency: "direct main" description: name: flutter_openssl_crypto - url: "https://pub.dartlang.org" + sha256: "6dcecf6f7c1804ae6f5d73ee05df8af72ea8133bf2447d25979d739503186c96" + url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "0.3.0" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.23" flutter_ringtone_player: dependency: "direct main" description: name: flutter_ringtone_player - url: "https://pub.dartlang.org" + sha256: d0277a04e629a6582d776f5dcc2a879a733f7326ba073b872a9ccfbff9d9b51f + url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "4.0.0+3" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - url: "https://pub.dartlang.org" + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" + url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "9.2.2" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - url: "https://pub.dartlang.org" + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.1" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - url: "https://pub.dartlang.org" + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "3.1.2" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - url: "https://pub.dartlang.org" + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - url: "https://pub.dartlang.org" + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.2.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - url: "https://pub.dartlang.org" + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" source: hosted - version: "1.1.2" - flutter_slidable: + version: "3.1.2" + flutter_shortcuts: dependency: "direct main" description: - name: flutter_slidable - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" + path: "." + ref: HEAD + resolved-ref: "930c51d56c87a7f8cefdf8c1db52c194baddc37d" + url: "https://github.com/krille-chan/flutter_shortcuts.git" + source: git + version: "1.4.0" flutter_test: dependency: "direct dev" description: flutter @@ -699,16 +703,26 @@ packages: dependency: "direct main" description: name: flutter_typeahead - url: "https://pub.dartlang.org" + sha256: d64712c65db240b1057559b952398ebb6e498077baeebf9b0731dade62438a6d + url: "https://pub.dev" source: hosted - version: "4.0.0" - flutter_web_auth: + version: "5.2.0" + flutter_web_auth_2: dependency: "direct main" description: - name: flutter_web_auth - url: "https://pub.dartlang.org" + name: flutter_web_auth_2 + sha256: "4d3d2fd3d26bf1a26b3beafd4b4b899c0ffe10dc99af25abc58ffe24e991133c" + url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "3.1.2" + flutter_web_auth_2_platform_interface: + dependency: transitive + description: + name: flutter_web_auth_2_platform_interface + sha256: e8669e262005a8354389ba2971f0fc1c36188481234ff50d013aaf993f30f739 + url: "https://pub.dev" + source: hosted + version: "3.1.0" flutter_web_plugins: dependency: transitive description: flutter @@ -718,159 +732,245 @@ packages: dependency: "direct main" description: name: flutter_webrtc - url: "https://pub.dartlang.org" + sha256: f6800cc2af79018c12e955ddf8ad007891fdfbb8199b0ce3dccd0977ed2add9c + url: "https://pub.dev" source: hosted - version: "0.8.7" + version: "0.11.7" frontend_server_client: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "4.0.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter source: sdk version: "0.0.0" - future_loading_dialog: - dependency: "direct main" - description: - name: future_loading_dialog - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.3" geolocator: dependency: "direct main" description: name: geolocator - url: "https://pub.dartlang.org" + sha256: "0ec58b731776bc43097fcf751f79681b6a8f6d3bc737c94779fe9f1ad73c1a81" + url: "https://pub.dev" source: hosted - version: "7.7.1" + version: "13.0.1" geolocator_android: - dependency: "direct overridden" + dependency: transitive description: name: geolocator_android - url: "https://hanntech-gmbh.gitlab.io/free2pass/flutter-geolocator-floss/" + sha256: "7aefc530db47d90d0580b552df3242440a10fe60814496a979aa67aa98b1fd47" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "4.6.1" geolocator_apple: dependency: transitive description: name: geolocator_apple - url: "https://pub.dartlang.org" + sha256: bc2aca02423ad429cb0556121f56e60360a2b7d694c8570301d06ea0c00732fd + url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "2.3.7" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface - url: "https://pub.dartlang.org" + sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012" + url: "https://pub.dev" source: hosted - version: "2.3.6" + version: "4.2.4" geolocator_web: dependency: transitive description: name: geolocator_web - url: "https://pub.dartlang.org" + sha256: "2ed69328e05cd94e7eb48bb0535f5fc0c0c44d1c4fa1e9737267484d05c29b5e" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + url: "https://pub.dev" + source: hosted + version: "0.2.3" + get_it: + dependency: transitive + description: + name: get_it + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "7.7.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" source: hosted - version: "2.0.2" - highlight: + version: "2.1.2" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc" + url: "https://pub.dev" + source: hosted + version: "14.3.0" + handy_window: + dependency: "direct main" + description: + name: handy_window + sha256: "56b813e58a68b0ee2ab22051400b8b1f1b5cfe88b8cd32288623defb3926245a" + url: "https://pub.dev" + source: hosted + version: "0.4.0" + highlighter: dependency: transitive description: - name: highlight - url: "https://pub.dartlang.org" + name: highlighter + sha256: "92180c72b9da8758e1acf39a45aa305a97dcfe2fdc8f3d1d2947c23f2772bfbc" + url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.1.1" hive: - dependency: transitive + dependency: "direct main" description: name: hive - url: "https://pub.dartlang.org" + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.3" hive_flutter: dependency: "direct main" description: name: hive_flutter - url: "https://pub.dartlang.org" + sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc + url: "https://pub.dev" source: hosted version: "1.1.0" html: - dependency: transitive + dependency: "direct main" description: name: html - url: "https://pub.dartlang.org" + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" source: hosted - version: "0.15.0" + version: "0.15.4" html_unescape: dependency: transitive description: name: html_unescape - url: "https://pub.dartlang.org" + sha256: "15362d7a18f19d7b742ef8dcb811f5fd2a2df98db9f80ea393c075189e0b61e3" + url: "https://pub.dev" source: hosted version: "2.0.0" http: - dependency: "direct dev" + dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "1.2.2" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" image: dependency: "direct main" description: name: image - url: "https://pub.dartlang.org" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "4.2.0" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.dartlang.org" + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d3e5e00fdfeca8fd4ffb3227001264d449cc8950414c2ff70b0e06b9c628e643 + url: "https://pub.dev" source: hosted - version: "0.8.4+11" + version: "0.8.12+15" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - url: "https://pub.dartlang.org" + sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" + url: "https://pub.dev" + source: hosted + version: "0.8.12" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - url: "https://pub.dartlang.org" + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + url: "https://pub.dev" + source: hosted + version: "2.10.0" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "0.2.1+1" import_sorter: dependency: "direct dev" description: name: import_sorter - url: "https://pub.dartlang.org" + sha256: eb15738ccead84e62c31e0208ea4e3104415efcd4972b86906ca64a1187d0836 + url: "https://pub.dev" source: hosted version: "4.6.0" integration_test: @@ -878,1174 +978,1363 @@ packages: description: flutter source: sdk version: "0.0.0" - intersperse: - dependency: transitive - description: - name: intersperse - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.19.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" - isolate: + version: "1.0.4" + js: dependency: transitive description: - name: isolate - url: "https://pub.dartlang.org" + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" source: hosted - version: "2.1.1" - js: + version: "0.6.7" + json_annotation: dependency: transitive description: - name: js - url: "https://pub.dartlang.org" + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "4.9.0" just_audio: dependency: "direct main" description: name: just_audio - url: "https://pub.dartlang.org" + sha256: b41646a8241688f1d99c2e69c4da2bb26aa4b3a99795f6ff205c2a165e033fda + url: "https://pub.dev" source: hosted - version: "0.9.20" + version: "0.9.41" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - url: "https://pub.dartlang.org" + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.3.0" just_audio_web: dependency: transitive description: name: just_audio_web - url: "https://pub.dartlang.org" + sha256: "9a98035b8b24b40749507687520ec5ab404e291d2b0937823ff45d92cb18d448" + url: "https://pub.dev" source: hosted - version: "0.4.7" - keyboard_shortcuts: + version: "0.4.13" + latlong2: dependency: "direct main" description: - path: "." - ref: null-safety - resolved-ref: a3d4020911860ff091d90638ab708604b71d2c5a - url: "https://github.com/TheOneWithTheBraid/keyboard_shortcuts.git" - source: git - version: "0.1.4" - latlong2: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + leak_tracker: dependency: transitive description: - name: latlong2 - url: "https://pub.dartlang.org" + name: leak_tracker + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + url: "https://pub.dev" + source: hosted + version: "10.0.7" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + url: "https://pub.dev" + source: hosted + version: "3.0.8" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "3.0.1" + license_checker: + dependency: "direct dev" + description: + name: license_checker + sha256: eea27638e42bc98fd91a6a8187eb57e5617e2c3c8b313a5d51b14bec7a8685e1 + url: "https://pub.dev" + source: hosted + version: "1.6.0" + linkify: + dependency: "direct main" + description: + name: linkify + sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" + url: "https://pub.dev" + source: hosted + version: "5.0.0" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "3.0.0" + list_counter: + dependency: transitive + description: + name: list_counter + sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 + url: "https://pub.dev" + source: hosted + version: "1.0.2" lists: dependency: transitive description: name: lists - url: "https://pub.dartlang.org" + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" source: hosted version: "1.0.1" - localstorage: - dependency: "direct main" + logger: + dependency: transitive description: - name: localstorage - url: "https://pub.dartlang.org" + name: logger + sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" + url: "https://pub.dev" source: hosted - version: "4.0.0+1" + version: "2.4.0" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" source: hosted - version: "1.0.2" - lottie: - dependency: "direct main" - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.2" - macos_ui: + version: "1.2.0" + macros: dependency: transitive description: - name: macos_ui - url: "https://pub.dartlang.org" + name: macros + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + url: "https://pub.dev" source: hosted - version: "0.13.1" + version: "0.1.3-main.0" markdown: dependency: transitive description: name: markdown - url: "https://pub.dartlang.org" + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "7.2.2" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.11.1" matrix: dependency: "direct main" description: name: matrix - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.3" - matrix_api_lite: - dependency: transitive - description: - name: matrix_api_lite - url: "https://pub.dartlang.org" + sha256: de99186797fddbf309dae0d9b9b4d35b49ca10d7bb362727f7cd916ce71a77d7 + url: "https://pub.dev" source: hosted - version: "1.1.1" - matrix_homeserver_recommendations: - dependency: "direct main" - description: - name: matrix_homeserver_recommendations - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - matrix_link_text: - dependency: "direct main" - description: - name: matrix_link_text - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" + version: "0.36.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.15.0" mgrs_dart: dependency: transitive description: name: mgrs_dart - url: "https://pub.dartlang.org" + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" source: hosted version: "2.0.0" mime: - dependency: transitive + dependency: "direct main" description: name: mime - url: "https://pub.dartlang.org" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" source: hosted - version: "1.0.2" - move_to_background: - dependency: transitive + version: "1.0.6" + msix: + dependency: "direct dev" description: - name: move_to_background - url: "https://pub.dartlang.org" + name: msix + sha256: c50d6bd1aafe0d071a3c1e5a5ccb056404502935cb0a549e3178c4aae16caf33 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "3.16.8" native_imaging: dependency: "direct main" description: - path: "." - ref: HEAD - resolved-ref: "8c6a5afe2c965b79b5959bb4b49c4aad020cb980" - url: "https://gitlab.com/famedly/company/frontend/libraries/native_imaging.git" - source: git - version: "0.1.0" + name: native_imaging + sha256: "182ccd8e0815a8a2158500ef66c828c030f6b9e05783e41e22f33bbcfd46a3d5" + url: "https://pub.dev" + source: hosted + version: "0.1.1" nested: dependency: transitive description: name: nested - url: "https://pub.dartlang.org" + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" source: hosted version: "1.0.0" - nm: - dependency: transitive - description: - name: nm - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.0" node_preamble: dependency: transitive description: name: node_preamble - url: "https://pub.dartlang.org" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" source: hosted - version: "2.0.1" - octo_image: - dependency: transitive - description: - name: octo_image - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" + version: "2.0.2" olm: dependency: transitive description: name: olm - url: "https://pub.dartlang.org" + sha256: "3306bf534ceb914fd148b3b4a3d603fb5e067b2e6da8304025b47c24cfdf6b46" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.4" + opus_caf_converter_dart: + dependency: "direct main" + description: + name: opus_caf_converter_dart + sha256: e08156066916f790a54df305e103d6dec4d853ec23147e6a02eda3c06f67ba1a + url: "https://pub.dev" + source: hosted + version: "1.0.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" package_info_plus: dependency: "direct main" description: name: package_info_plus - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.2" - package_info_plus_linux: - dependency: transitive - description: - name: package_info_plus_linux - url: "https://pub.dartlang.org" + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 + url: "https://pub.dev" source: hosted - version: "1.0.5" - package_info_plus_macos: - dependency: transitive - description: - name: package_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "8.0.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - url: "https://pub.dartlang.org" + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + url: "https://pub.dev" source: hosted - version: "1.0.2" - package_info_plus_web: + version: "3.0.1" + pana: dependency: transitive description: - name: package_info_plus_web - url: "https://pub.dartlang.org" + name: pana + sha256: "3fc3fe8e7a9fd4827fa4d625a423eec95d305b2bc3538a3adf7fd6c49217af97" + url: "https://pub.dev" source: hosted - version: "1.0.5" - package_info_plus_windows: - dependency: transitive + version: "0.21.45" + pasteboard: + dependency: "direct main" description: - name: package_info_plus_windows - url: "https://pub.dartlang.org" + name: pasteboard + sha256: "1c8b6a8b3f1d12e55d4e9404433cda1b4abe66db6b17bc2d2fb5965772c04674" + url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "0.2.0" path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive + dependency: "direct main" description: - name: path_parsing - url: "https://pub.dartlang.org" + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "1.9.0" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: f7544c346a0742aee1450f9e5c0f5269d7c602b9c95fdbcd9fb8f5b1df13b1cc + url: "https://pub.dev" source: hosted - version: "2.0.12" - path_provider_ios: + version: "2.2.11" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.4.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + url: "https://pub.dev" source: hosted - version: "2.0.5" - pedantic: + version: "11.3.1" + permission_handler_android: dependency: transitive description: - name: pedantic - url: "https://pub.dartlang.org" + name: permission_handler_android + sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + url: "https://pub.dev" source: hosted - version: "1.11.1" - petitparser: + version: "12.0.12" + permission_handler_apple: dependency: transitive description: - name: petitparser - url: "https://pub.dartlang.org" + name: permission_handler_apple + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 + url: "https://pub.dev" source: hosted - version: "4.4.0" - pin_code_text_field: - dependency: "direct main" + version: "9.4.5" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + url: "https://pub.dev" + source: hosted + version: "0.1.3+2" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + permission_handler_windows: + dependency: transitive description: - name: pin_code_text_field - url: "https://pub.dartlang.org" + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.5" + platform_detect: + dependency: transitive + description: + name: platform_detect + sha256: a62f99417fc4fa2d099ce0ccdbb1bd3977920f2a64292c326271f049d4bc3a4f + url: "https://pub.dev" + source: hosted + version: "2.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" source: hosted - version: "2.1.2" - pointycastle: + version: "2.1.8" + pointer_interceptor: + dependency: transitive + description: + name: pointer_interceptor + sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" + url: "https://pub.dev" + source: hosted + version: "0.10.1+2" + pointer_interceptor_ios: + dependency: transitive + description: + name: pointer_interceptor_ios + sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + pointer_interceptor_platform_interface: + dependency: transitive + description: + name: pointer_interceptor_platform_interface + sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" + url: "https://pub.dev" + source: hosted + version: "0.10.0+1" + pointer_interceptor_web: dependency: transitive description: - name: pointycastle - url: "https://pub.dartlang.org" + name: pointer_interceptor_web + sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" + url: "https://pub.dev" source: hosted - version: "3.5.2" + version: "0.10.2+1" polylabel: dependency: transitive description: name: polylabel - url: "https://pub.dartlang.org" + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" source: hosted version: "1.0.1" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" - positioned_tap_detector_2: - dependency: transitive + version: "1.5.1" + pretty_qr_code: + dependency: "direct main" description: - name: positioned_tap_detector_2 - url: "https://pub.dartlang.org" + name: pretty_qr_code + sha256: cbdb4af29da1c1fa21dd76f809646c591320ab9e435d3b0eab867492d43607d5 + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "3.3.0" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" + url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "5.0.2" proj4dart: dependency: transitive description: name: proj4dart - url: "https://pub.dartlang.org" + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" provider: dependency: "direct main" description: name: provider - url: "https://pub.dartlang.org" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.1.2" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" punycode: dependency: "direct main" description: name: punycode - url: "https://pub.dartlang.org" + sha256: "39b874cc1f78b94e57db17e74b3f2ba2a96e25c0bebdcc8a571614dccda0ff0c" + url: "https://pub.dev" source: hosted version: "1.0.0" qr: dependency: transitive description: name: qr - url: "https://pub.dartlang.org" + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.2" qr_code_scanner: dependency: "direct main" description: - path: "." - ref: fix_break_changes_platform - resolved-ref: "0feca6f15042c279ff575c559a3430df917b623d" - url: "https://github.com/xeinebiu/qr_code_scanner.git" - source: git - version: "0.7.0" - qr_flutter: + name: qr_code_scanner + sha256: f23b68d893505a424f0bd2e324ebea71ed88465d572d26bb8d2e78a4749591fd + url: "https://pub.dev" + source: hosted + version: "1.0.1" + qr_image: dependency: "direct main" description: - name: qr_flutter - url: "https://pub.dartlang.org" + name: qr_image + sha256: c3cd2ac2c6cd6b14604c97b45c477b18988b6518f72120fa04418fc54e3b0d76 + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "1.0.0" quiver: dependency: transitive description: name: quiver - url: "https://pub.dartlang.org" + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" source: hosted - version: "3.0.1+1" + version: "3.2.2" random_string: dependency: transitive description: name: random_string - url: "https://pub.dartlang.org" + sha256: "03b52435aae8cbdd1056cf91bfc5bf845e9706724dd35ae2e99fa14a1ef79d02" + url: "https://pub.dev" source: hosted version: "2.3.1" receive_sharing_intent: dependency: "direct main" description: name: receive_sharing_intent - url: "https://pub.dartlang.org" + sha256: ec76056e4d258ad708e76d85591d933678625318e411564dcb9059048ca3a593 + url: "https://pub.dev" source: hosted - version: "1.4.5" + version: "1.8.1" record: dependency: "direct main" description: name: record - url: "https://pub.dartlang.org" + sha256: "4a5cf4d083d1ee49e0878823c4397d073f8eb0a775f31215d388e2bc47a9e867" + url: "https://pub.dev" source: hosted - version: "4.1.1" - record_linux: + version: "5.1.2" + record_android: dependency: transitive description: - name: record_linux - url: "https://pub.dartlang.org" + name: record_android + sha256: d7af0b3119725a0f561817c72b5f5eca4d7a76d441deef519ae04e4824c0734c + url: "https://pub.dev" source: hosted - version: "0.1.0" - record_macos: + version: "1.2.6" + record_darwin: dependency: transitive description: - name: record_macos - url: "https://pub.dartlang.org" + name: record_darwin + sha256: fe90d302acb1f3cee1ade5df9c150ca5cee33b48d8cdf1cf433bf577d7f00134 + url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "1.1.2" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: "74d41a9ebb1eb498a38e9a813dd524e8f0b4fdd627270bda9756f437b110a3e3" + url: "https://pub.dev" + source: hosted + version: "0.7.2" record_platform_interface: dependency: transitive description: name: record_platform_interface - url: "https://pub.dartlang.org" + sha256: "11f8b03ea8a0e279b0e306571dbe0db0202c0b8e866495c9fa1ad2281d5e4c15" + url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "1.1.0" record_web: dependency: transitive description: name: record_web - url: "https://pub.dartlang.org" + sha256: "656b7a865f90651fab997c2a563364f5fd60a0b527d5dadbb915d62d84fc3867" + url: "https://pub.dev" source: hosted - version: "0.3.1" + version: "1.1.3" record_windows: dependency: transitive description: name: record_windows - url: "https://pub.dartlang.org" + sha256: e653555aa3fda168aded7c34e11bd82baf0c6ac84e7624553def3c77ffefd36f + url: "https://pub.dev" + source: hosted + version: "1.0.3" + retry: + dependency: transitive + description: + name: retry + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" + url: "https://pub.dev" source: hosted - version: "0.4.3" + version: "3.1.2" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + safe_url_check: + dependency: transitive + description: + name: safe_url_check + sha256: "49a3e060a7869cbafc8f4845ca1ecbbaaa53179980a32f4fdfeab1607e90f41d" + url: "https://pub.dev" source: hosted - version: "0.27.3" + version: "1.1.2" scroll_to_index: dependency: "direct main" description: name: scroll_to_index - url: "https://pub.dartlang.org" + sha256: b707546e7500d9f070d63e5acf74fd437ec7eeeb68d3412ef7b0afada0b4f176 + url: "https://pub.dev" source: hosted version: "3.0.1" sdp_transform: dependency: transitive description: name: sdp_transform - url: "https://pub.dartlang.org" + sha256: "73e412a5279a5c2de74001535208e20fff88f225c9a4571af0f7146202755e45" + url: "https://pub.dev" source: hosted version: "0.3.2" - sentry: - dependency: "direct main" - description: - name: sentry - url: "https://pub.dartlang.org" - source: hosted - version: "6.4.0" share_plus: dependency: "direct main" description: name: share_plus - url: "https://pub.dartlang.org" + sha256: "468c43f285207c84bcabf5737f33b914ceb8eb38398b91e5e3ad1698d1b72a52" + url: "https://pub.dev" source: hosted - version: "4.0.9" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" + version: "10.0.2" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" + sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "5.0.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - url: "https://pub.dartlang.org" + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - url: "https://pub.dartlang.org" + sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" + url: "https://pub.dev" source: hosted - version: "2.0.11" - shared_preferences_ios: + version: "2.3.3" + shared_preferences_foundation: dependency: transitive description: - name: shared_preferences_ios - url: "https://pub.dartlang.org" + name: shared_preferences_foundation + sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.5.3" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - url: "https://pub.dartlang.org" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - url: "https://pub.dartlang.org" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - url: "https://pub.dartlang.org" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - url: "https://pub.dartlang.org" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.4.1" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.2" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "2.0.0" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" slugify: dependency: "direct main" description: name: slugify - url: "https://pub.dartlang.org" + sha256: b272501565cb28050cac2d96b7bf28a2d24c8dae359280361d124f3093d337c3 + url: "https://pub.dev" source: hosted version: "2.0.0" - snapping_sheet: - dependency: "direct main" - description: - path: "." - ref: listenable - resolved-ref: "2d9f2a40590c13aadfd226c2e41b08e155e6a92e" - url: "https://github.com/TheOneWithTheBraid/snapping_sheet.git" - source: git - version: "3.1.0" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" source: hosted - version: "0.10.10" + version: "0.10.12" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "7.0.0" sqflite: dependency: transitive description: name: sqflite - url: "https://pub.dartlang.org" + sha256: ff5a2436ef8ebdfda748fbfe957f9981524cb5ff11e7bafa8c42771840e8a788 + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.3.3+2" sqflite_common: dependency: transitive description: name: sqflite_common - url: "https://pub.dartlang.org" + sha256: "2d8e607db72e9cb7748c9c6e739e2c9618320a5517de693d5a24609c4671b1a4" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.5.4+4" + sqflite_common_ffi: + dependency: "direct main" + description: + name: sqflite_common_ffi + sha256: a6057d4c87e9260ba1ec436ebac24760a110589b9c0a859e128842eb69a7ef04 + url: "https://pub.dev" + source: hosted + version: "2.3.3+1" + sqlcipher_flutter_libs: + dependency: "direct main" + description: + name: sqlcipher_flutter_libs + sha256: a6a08d3082c1deaacc8f6670c78a9c2384991102db5b234d5293aa2c65e87f61 + url: "https://pub.dev" + source: hosted + version: "0.6.4" + sqlite3: + dependency: transitive + description: + name: sqlite3 + sha256: "45f168ae2213201b54e09429ed0c593dc2c88c924a1488d6f9c523a255d567cb" + url: "https://pub.dev" + source: hosted + version: "2.4.6" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.3.0" + string_validator: + dependency: transitive + description: + name: string_validator + sha256: "50dd8ecf91db6a732f4a851eeae81ee12406eedc62d0da72f2d91a04a2d10dd8" + url: "https://pub.dev" + source: hosted + version: "0.3.0" swipe_to_action: dependency: "direct main" description: name: swipe_to_action - url: "https://pub.dartlang.org" + sha256: "0914f78df07a15b5fd97e800036fd63a2bcd4dbe67a4a514a597303806a361ea" + url: "https://pub.dev" source: hosted version: "0.2.0" sync_http: dependency: transitive description: name: sync_http - url: "https://pub.dartlang.org" + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.3.1" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + url: "https://pub.dev" + source: hosted + version: "3.3.0+3" + tar: + dependency: transitive + description: + name: tar + sha256: "22f67e2d77b51050436620b2a5de521c58ca6f0b75af1d9ab3c8cae2eae58fcd" + url: "https://pub.dev" source: hosted - version: "3.0.0+2" + version: "1.0.5" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test: dependency: transitive description: name: test - url: "https://pub.dartlang.org" + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" + url: "https://pub.dev" source: hosted - version: "1.20.2" + version: "1.25.8" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.7.3" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" + url: "https://pub.dev" source: hosted - version: "0.4.11" + version: "0.6.5" timezone: dependency: transitive description: name: timezone - url: "https://pub.dartlang.org" + sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" + url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.9.4" tint: dependency: transitive description: name: tint - url: "https://pub.dartlang.org" + sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46" + url: "https://pub.dev" source: hosted - version: "2.0.0" - tuple: - dependency: transitive + version: "2.0.1" + tor_detector_web: + dependency: "direct main" description: - name: tuple - url: "https://pub.dartlang.org" + name: tor_detector_web + sha256: c4acbd6c0fecd2cd0e8fe00b1a37332422e041021a42488dfddcb3e7ec809b3f + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "1.1.0" + translations_cleaner: + dependency: "direct dev" + description: + name: translations_cleaner + sha256: "060f4a8cd782e271509719741dd3540fe81ddaad49bd79e1d8fc4598299a6b84" + url: "https://pub.dev" + source: hosted + version: "0.0.5" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.2" uni_links: dependency: "direct main" description: name: uni_links - url: "https://pub.dartlang.org" + sha256: "051098acfc9e26a9fde03b487bef5d3d228ca8f67693480c6f33fd4fbb8e2b6e" + url: "https://pub.dev" source: hosted version: "0.5.1" uni_links_platform_interface: dependency: transitive description: name: uni_links_platform_interface - url: "https://pub.dartlang.org" + sha256: "929cf1a71b59e3b7c2d8a2605a9cf7e0b125b13bc858e55083d88c62722d4507" + url: "https://pub.dev" source: hosted version: "1.0.0" uni_links_web: dependency: transitive description: name: uni_links_web - url: "https://pub.dartlang.org" + sha256: "7539db908e25f67de2438e33cc1020b30ab94e66720b5677ba6763b25f6394df" + url: "https://pub.dev" source: hosted version: "0.1.0" unicode: dependency: transitive description: name: unicode - url: "https://pub.dartlang.org" + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" source: hosted version: "0.3.1" unifiedpush: dependency: "direct main" description: name: unifiedpush - url: "https://pub.dartlang.org" + sha256: "6dbed5a6305ca33f1865c7a3d814ae39476b79a2d23ca76a5708f023f405730f" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.0.2" unifiedpush_android: dependency: transitive description: name: unifiedpush_android - url: "https://pub.dartlang.org" + sha256: "7443dece0a850ae956514f809983eb2b39fc518c2c7d24dbfe817198bec89134" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "2.3.0" unifiedpush_platform_interface: dependency: transitive description: name: unifiedpush_platform_interface - url: "https://pub.dartlang.org" + sha256: dd588d78a8b2bfc10430e30035526e98caa543d0b7364a6344b5eb4815721c6d + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "2.0.2" + unifiedpush_ui: + dependency: "direct main" + description: + name: unifiedpush_ui + sha256: cf86f0214f37debd41f25c0425c8489df85e27f9f8784fed571eb7a86d39ba11 + url: "https://pub.dev" + source: hosted + version: "0.1.0" universal_html: dependency: "direct main" description: name: universal_html - url: "https://pub.dartlang.org" + sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971" + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.2.4" universal_io: dependency: transitive description: name: universal_io - url: "https://pub.dartlang.org" + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.2.2" unorm_dart: dependency: transitive description: name: unorm_dart - url: "https://pub.dartlang.org" + sha256: "5b35bff83fce4d76467641438f9e867dc9bcfdb8c1694854f230579d68cd8f4b" + url: "https://pub.dev" source: hosted version: "0.2.0" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" source: hosted - version: "6.0.20" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" + url: "https://pub.dev" source: hosted - version: "6.0.15" + version: "6.3.12" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" source: hosted - version: "6.0.15" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.2.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_strategy: - dependency: transitive - description: - name: url_strategy - url: "https://pub.dartlang.org" + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "3.1.2" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "4.5.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - very_good_analysis: - dependency: transitive - description: - name: very_good_analysis - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.1.4" video_compress: dependency: "direct main" description: name: video_compress - url: "https://pub.dartlang.org" + sha256: "5b42d89f3970c956bad7a86c29682b0892c11a4ddf95ae6e29897ee28788e377" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.3" video_player: dependency: "direct main" description: name: video_player - url: "https://pub.dartlang.org" + sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" + url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.9.2" video_player_android: dependency: transitive description: name: video_player_android - url: "https://pub.dartlang.org" + sha256: ae5287ca367e206eb74d7b3dc1ce0b8912ab9a3fc0597b6a101a0a5239f229d3 + url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.7.9" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - url: "https://pub.dartlang.org" + sha256: cd5ab8a8bc0eab65ab0cea40304097edc46da574c8c1ecdee96f28cd8ef3792f + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.6.2" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - url: "https://pub.dartlang.org" + sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" + url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.2.3" video_player_web: dependency: transitive description: name: video_player_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.7" - visibility_detector: - dependency: transitive - description: - name: visibility_detector - url: "https://pub.dartlang.org" + sha256: "6dcdd298136523eaf7dfc31abaf0dfba9aa8a8dbc96670e87e9d42b6f2caf774" + url: "https://pub.dev" source: hosted - version: "0.3.3" + version: "2.3.2" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - vrouter: - dependency: "direct main" - description: - name: vrouter - url: "https://pub.dartlang.org" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev" source: hosted - version: "1.2.0+21" - wakelock: + version: "14.3.0" + wakelock_plus: dependency: "direct main" description: - name: wakelock - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.1+2" - wakelock_macos: - dependency: transitive - description: - name: wakelock_macos - url: "https://pub.dartlang.org" + name: wakelock_plus + sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484 + url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_platform_interface: + version: "1.2.8" + wakelock_plus_platform_interface: dependency: transitive description: - name: wakelock_platform_interface - url: "https://pub.dartlang.org" + name: wakelock_plus_platform_interface + sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" + url: "https://pub.dev" source: hosted - version: "0.3.0" - wakelock_web: + version: "1.2.1" + watcher: dependency: transitive description: - name: wakelock_web - url: "https://pub.dartlang.org" + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_windows: + version: "1.1.0" + web: dependency: transitive description: - name: wakelock_windows - url: "https://pub.dartlang.org" + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" source: hosted - version: "0.2.0" - watcher: + version: "1.1.0" + web_socket: dependency: transitive description: - name: watcher - url: "https://pub.dartlang.org" + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.1" webdriver: dependency: transitive description: name: webdriver - url: "https://pub.dartlang.org" + sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.4" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.2.1" webrtc_interface: - dependency: transitive + dependency: "direct main" description: name: webrtc_interface - url: "https://pub.dartlang.org" + sha256: abec3ab7956bd5ac539cf34a42fa0c82ea26675847c0966bb85160400eea9388 + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.2.0" win32: - dependency: transitive + dependency: "direct overridden" description: name: win32 - url: "https://pub.dartlang.org" + sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9" + url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "5.5.3" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" + window_to_front: + dependency: transitive + description: + name: window_to_front + sha256: "7aef379752b7190c10479e12b5fd7c0b9d92adc96817d9e96c59937929512aee" + url: "https://pub.dev" + source: hosted + version: "0.0.3" wkt_parser: dependency: transitive description: name: wkt_parser - url: "https://pub.dartlang.org" + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" source: hosted version: "2.0.0" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" source: hosted - version: "0.2.0+1" + version: "1.1.0" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "6.5.0" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index b0e4daeff7..87c27e566d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,102 +1,112 @@ name: fluffychat description: Chat with your friends. publish_to: none -version: 1.5.0+2323 +# On version bump also increase the build number for F-Droid +version: 1.23.0+3536 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: - adaptive_dialog: ^1.5.1 - adaptive_theme: ^3.0.0 - animations: ^2.0.2 - blurhash_dart: ^1.1.0 - cached_network_image: ^3.2.0 + animations: ^2.0.11 + archive: ^3.4.10 + async: ^2.11.0 + badges: ^3.1.2 + blurhash_dart: ^1.2.1 callkeep: ^0.3.2 - chewie: ^1.2.2 - collection: ^1.15.0-nullsafety.4 - connectivity_plus: ^2.2.0 + chewie: ^1.8.1 + collection: ^1.18.0 + cross_file: ^0.3.4+2 cupertino_icons: any - desktop_drop: ^0.3.2 - desktop_lifecycle: ^0.1.0 + desktop_drop: ^0.4.4 desktop_notifications: ^0.6.3 - device_info_plus: ^4.0.0 - dynamic_color: ^1.2.2 - email_validator: ^2.0.1 - emoji_picker_flutter: ^1.1.2 - encrypt: ^5.0.1 + device_info_plus: ^10.0.1 + dynamic_color: ^1.7.0 + emoji_picker_flutter: ^3.1.0 + emojis: ^0.9.9 #fcm_shared_isolate: ^0.1.0 - file_picker_cross: ^4.6.0 + file_picker: ^8.1.2 + file_selector: ^1.0.3 flutter: sdk: flutter - flutter_app_badger: ^1.3.0 - flutter_app_lock: ^2.0.0 - flutter_blurhash: ^0.7.0 - flutter_cache_manager: ^3.3.0 - flutter_local_notifications: ^9.4.0 + flutter_app_badger: ^1.5.0 + flutter_cache_manager: ^3.4.1 + flutter_foreground_task: ^6.1.3 + flutter_highlighter: ^0.1.1 + flutter_html: ^3.0.0-beta.2 + flutter_html_table: ^3.0.0-beta.2 + flutter_linkify: ^6.0.0 + flutter_local_notifications: ^17.2.3 flutter_localizations: sdk: flutter - flutter_map: ^1.1.0 - flutter_matrix_html: ^1.1.0 - flutter_olm: ^1.2.0 - flutter_openssl_crypto: ^0.1.0 - flutter_ringtone_player: ^3.1.1 - flutter_secure_storage: ^5.0.2 - flutter_slidable: ^1.2.0 - flutter_svg: ^0.22.0 - flutter_typeahead: ^4.0.0 - flutter_web_auth: ^0.4.0 - flutter_webrtc: ^0.8.7 - future_loading_dialog: ^0.2.3 - geolocator: ^7.6.2 + flutter_map: ^6.1.0 + flutter_olm: 1.3.2 # Keep in sync with scripts/prepare-web.sh ! 1.4.0 does currently not build on Android + flutter_openssl_crypto: ^0.3.0 + flutter_ringtone_player: ^4.0.0+2 + flutter_secure_storage: ^9.2.2 + flutter_shortcuts: + git: https://github.com/krille-chan/flutter_shortcuts.git + flutter_typeahead: ^5.2.0 + flutter_web_auth_2: ^3.1.1 # Version 4 blocked by https://github.com/MixinNetwork/flutter-plugins/issues/379 + flutter_webrtc: ^0.11.7 + geolocator: ^13.0.1 + go_router: ^14.3.0 + handy_window: ^0.4.0 + hive: ^2.2.3 hive_flutter: ^1.1.0 - image: ^3.1.1 - image_picker: ^0.8.4+8 + html: ^0.15.4 + http: ^1.2.0 + image: ^4.1.7 + image_picker: ^1.1.0 intl: any - just_audio: ^0.9.20 - keyboard_shortcuts: ^0.1.4 - localstorage: ^4.0.0+1 - lottie: ^1.2.2 - matrix: ^0.10.3 - matrix_homeserver_recommendations: ^0.2.0 - matrix_link_text: ^1.0.2 - native_imaging: - git: https://gitlab.com/famedly/company/frontend/libraries/native_imaging.git - package_info_plus: ^1.3.0 - path_provider: ^2.0.9 - pin_code_text_field: ^1.8.0 + just_audio: ^0.9.39 + latlong2: ^0.9.1 + linkify: ^5.0.0 + matrix: ^0.36.0 + mime: ^1.0.6 + native_imaging: ^0.1.1 + opus_caf_converter_dart: ^1.0.1 + package_info_plus: ^8.0.2 + pasteboard: ^0.2.0 + path: ^1.9.0 + path_provider: ^2.1.2 + permission_handler: ^11.0.1 + pretty_qr_code: ^3.2.1 provider: ^6.0.2 punycode: ^1.0.0 - qr_code_scanner: ^0.7.0 - qr_flutter: ^4.0.0 - receive_sharing_intent: ^1.4.5 - record: ^4.1.1 + qr_code_scanner: ^1.0.1 + qr_image: ^1.0.0 + receive_sharing_intent: ^1.8.1 + record: ^5.1.2 scroll_to_index: ^3.0.1 - sentry: ^6.3.0 - share_plus: ^4.0.9 - shared_preferences: ^2.0.13 + share_plus: ^10.0.2 + shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401 slugify: ^2.0.0 - snapping_sheet: ^3.1.0 + sqflite_common_ffi: ^2.3.3 + sqlcipher_flutter_libs: ^0.6.1 swipe_to_action: ^0.2.0 + tor_detector_web: ^1.1.0 uni_links: ^0.5.1 - unifiedpush: ^4.0.0 - universal_html: ^2.0.8 - url_launcher: ^6.0.20 - video_compress: ^3.1.0 - video_player: ^2.2.18 - vrouter: ^1.2.0+21 - wakelock: ^0.6.1+1 + unifiedpush: ^5.0.1 + unifiedpush_ui: ^0.1.0 + universal_html: ^2.2.4 + url_launcher: ^6.2.5 + video_compress: ^3.1.3 + video_player: ^2.8.5 + wakelock_plus: ^1.2.2 + webrtc_interface: ^1.0.13 dev_dependencies: - dart_code_metrics: ^4.10.1 - flutter_lints: ^1.0.4 + flutter_lints: ^3.0.0 flutter_native_splash: ^2.0.3+1 flutter_test: sdk: flutter - http: ^0.13.4 import_sorter: ^4.6.0 integration_test: sdk: flutter + license_checker: ^1.6.0 + msix: ^3.6.2 + translations_cleaner: ^0.0.5 flutter_native_splash: color: "#ffffff" @@ -120,41 +130,25 @@ flutter: style: italic - asset: fonts/Roboto/Roboto-Bold.ttf weight: 700 + - family: RobotoMono + fonts: + - asset: fonts/Roboto/RobotoMono-Regular.ttf - family: NotoEmoji fonts: - asset: fonts/NotoEmoji/NotoColorEmoji.ttf +msix_config: + display_name: FluffyChat + publisher_display_name: FluffyChat + publisher: CN=FluffyChat, O=Head of bad integration tests, L=Matrix, S=Internet, C=EU + identity_name: chat.fluffy.fluffychat + logo_path: assets\logo.png + capabilities: internetClient, location, microphone, webcam + protocol_activation: https + app_uri_handler_hosts: fluffychat.im, matrix.to + execution_alias: fluffychat + sign_msix: false + install_certificate: false + dependency_overrides: - # Necessary for webRTC on web. - # Fix for stream fallback for unsupported browsers: - # https://github.com/fluttercommunity/plus_plugins/pull/746 - # Upstream pull request: https://github.com/fluttercommunity/plus_plugins/pull/746 - connectivity_plus_web: - git: - url: https://github.com/TheOneWithTheBraid/plus_plugins.git - ref: a04401cb48abe92d138c0e9288b360739994a9e9 - path: packages/connectivity_plus/connectivity_plus_web - dbus: ^0.7.1 - geolocator_android: - hosted: - name: geolocator_android - url: https://hanntech-gmbh.gitlab.io/free2pass/flutter-geolocator-floss - # waiting for null safety - # Upstream pull request: https://github.com/AntoineMarcel/keyboard_shortcuts/pull/13 - keyboard_shortcuts: - git: - url: https://github.com/TheOneWithTheBraid/keyboard_shortcuts.git - ref: null-safety - provider: 5.0.0 - # For Flutter 3.0.0 compatibility - # https://github.com/juliuscanute/qr_code_scanner/issues/532 - qr_code_scanner: - git: - url: https://github.com/xeinebiu/qr_code_scanner.git - ref: fix_break_changes_platform - # wating for `Listenable` implementation - # Upstream pull request: https://github.com/AdamJonsson/snapping_sheet/pull/84 - snapping_sheet: - git: - url: https://github.com/TheOneWithTheBraid/snapping_sheet.git - ref: listenable + win32: 5.5.3 \ No newline at end of file diff --git a/scripts/build-android-apk.sh b/scripts/build-android-apk.sh deleted file mode 100755 index 4b1b641be6..0000000000 --- a/scripts/build-android-apk.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -flutter pub get -flutter build apk --release -mkdir -p build/android -cp build/app/outputs/apk/release/app-release.apk build/android/ diff --git a/scripts/build-android-debug.sh b/scripts/build-android-debug.sh deleted file mode 100755 index 5c2744a4ca..0000000000 --- a/scripts/build-android-debug.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -flutter build apk --debug diff --git a/scripts/build-linux.sh b/scripts/build-linux.sh deleted file mode 100755 index e1df0e603d..0000000000 --- a/scripts/build-linux.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -ve -flutter config --enable-linux-desktop -flutter clean -flutter pub get -flutter build linux --release -v diff --git a/scripts/build-macos.sh b/scripts/build-macos.sh index 3a9ca059c6..11d3e4a098 100755 --- a/scripts/build-macos.sh +++ b/scripts/build-macos.sh @@ -1,9 +1,35 @@ -#!/bin/sh -ve -flutter config --enable-macos-desktop -flutter clean -flutter pub get -cd macos -pod install -pod update -cd .. +#!/usr/bin/env bash +git apply ./scripts/enable-android-google-services.patch +FLUFFYCHAT_ORIG_GROUP="im.fluffychat" +FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G" +#FLUFFYCHAT_NEW_GROUP="com.example.fluffychat" +#FLUFFYCHAT_NEW_TEAM="ABCDE12345" + +# In some cases (ie: running beta XCode releases) some pods haven't updated their minimum version +# but XCode will reject the package for using too old of a minimum version. +# This will fix that, but. Well. Use at your own risk. +# export I_PROMISE_IM_REALLY_SMART=1 + +# If you want to automatically install the app +# export FLUFFYCHAT_INSTALL_IPA=1 + +### Rotate IDs ### +[ -n "${FLUFFYCHAT_NEW_GROUP}" ] && { + # App group IDs + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner/Runner.entitlements" + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner.xcodeproj/project.pbxproj" + # Bundle identifiers + sed -i "" "s/${FLUFFYCHAT_ORIG_GROUP}.app/${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner.xcodeproj/project.pbxproj" +} + +[ -n "${FLUFFYCHAT_NEW_TEAM}" ] && { + # Code signing team + sed -i "" "s/${FLUFFYCHAT_ORIG_TEAM}/${FLUFFYCHAT_NEW_TEAM}/g" "macos/Runner.xcodeproj/project.pbxproj" +} + +### Make release build ### flutter build macos --release + +cp /usr/local/Cellar/libolm/**/lib/libolm.3.dylib build/macos/Build/Products/Release/FluffyChat.app/Contents/Frameworks/libolm.3.dylib + +echo "Build build/macos/Build/Products/Release/FluffyChat.app" diff --git a/scripts/build-olm-windows.sh b/scripts/build-olm-windows.sh new file mode 100755 index 0000000000..003b98eeb5 --- /dev/null +++ b/scripts/build-olm-windows.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +git clone https://gitlab.matrix.org/matrix-org/olm.git -b 3.2.12 +cd olm +cmake . -Bbuild -DCMAKE_TOOLCHAIN_FILE=Windows64.cmake +cmake --build build +cd .. diff --git a/scripts/build-web.sh b/scripts/build-web.sh deleted file mode 100755 index a136aeea23..0000000000 --- a/scripts/build-web.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -ve -flutter config --enable-web -flutter clean -flutter pub get -flutter build web --release --verbose --source-maps diff --git a/scripts/build-windows.ps1 b/scripts/build-windows.ps1 index dea9cf8fb9..0c02f80cb1 100644 --- a/scripts/build-windows.ps1 +++ b/scripts/build-windows.ps1 @@ -2,4 +2,6 @@ flutter doctor flutter config --enable-windows-desktop flutter clean flutter pub get -flutter build windows --release -v \ No newline at end of file + +flutter build windows --release -v + diff --git a/scripts/code_analyze.sh b/scripts/code_analyze.sh deleted file mode 100755 index c0249a7c56..0000000000 --- a/scripts/code_analyze.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -ve -flutter pub get -flutter pub run import_sorter:main --no-comments --exit-if-changed -flutter format lib/ test/ --set-exit-if-changed -git apply ./scripts/enable-android-google-services.patch -flutter pub get -flutter analyze -flutter pub run dart_code_metrics:metrics lib -r gitlab > code-quality-report.json || true \ No newline at end of file diff --git a/scripts/create_fdroid_repos.sh b/scripts/create_fdroid_repos.sh new file mode 100755 index 0000000000..595e1cfaed --- /dev/null +++ b/scripts/create_fdroid_repos.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +GITLAB_PROJECT_ID="16112282" + +# repo directory for build +mkdir fdroid/repo +# ... and for deployment +mkdir repo + +git fetch + +# building nightly repo + +cd fdroid + +cp config.nightly.py config.py + +PIPELINES="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines\?ref=main\&status=success\&order_by=updated_at | jq '.[].id' | head -n3)" + +cp ../build/android/app-release.apk repo/fluffychat-latest.apk + +for PIPELINE in $PIPELINES +do + JOB="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$PIPELINE/jobs | jq -r '.[] | select(.name == "build_android_apk").id')" + if [ -n $JOB ]; then + URI="https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/jobs/$JOB/artifacts/build/android/app-release.apk" + FILENAME="fluffychat-$PIPELINE.apk" + echo "Downloading $FILENAME from $URI ..." + wget --output-document="$FILENAME" "$URI" + mv "$FILENAME" repo + fi +done + +fdroid update --rename-apks +mkdir /fdroid && fdroid deploy +rm -rf /fdroid/archive +cd .. && mv -v /fdroid repo/nightly + +# building stable + RC repo + +rm -rf /fdroid fdroid/repo + +mkdir fdroid/repo + +cd fdroid +rm -f repo/*.apk + +cp config.stable.py config.py + +PIPELINES="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines\?scope=tags\&status=success\&order_by=updated_at | jq '.[].id' | head -n3)" + +for PIPELINE in $PIPELINES +do + JOB="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$PIPELINE/jobs | jq -r '.[] | select(.name == "build_android_apk").id')" + if [ -n $JOB ]; then + URI="https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/jobs/$JOB/artifacts/build/android/app-release.apk" + FILENAME="fluffychat-$PIPELINE.apk" + echo "Downloading $FILENAME from $URI ..." + wget --output-document="$FILENAME" "$URI" + mv "$FILENAME" repo + fi +done + +fdroid update --rename-apks +mkdir /fdroid && fdroid deploy +rm -rf /fdroid/archive +cd .. && mv -v /fdroid repo/stable diff --git a/scripts/enable-android-google-services.patch b/scripts/enable-android-google-services.patch index a190cbc37c..def0511895 100644 --- a/scripts/enable-android-google-services.patch +++ b/scripts/enable-android-google-services.patch @@ -1,49 +1,40 @@ diff --git a/android/app/build.gradle b/android/app/build.gradle -index 001fbd72..339b35af 100644 +index f92f73f3..6d389efb 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle -@@ -44,7 +44,7 @@ android { +@@ -2,7 +2,7 @@ plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +- //id "com.google.gms.google-services" ++ id "com.google.gms.google-services" + } - defaultConfig { - applicationId "chat.fluffy.fluffychat" -- minSdkVersion 16 -+ minSdkVersion 19 - targetSdkVersion 30 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName -@@ -68,6 +68,10 @@ android { - } - release { - signingConfig signingConfigs.release -+ minifyEnabled false -+ shrinkResources false -+ -+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } + def localProperties = new Properties() +@@ -83,10 +83,10 @@ flutter { } -@@ -78,8 +82,11 @@ flutter { dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 + implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 -+ testImplementation 'junit:junit:4.12' -+ androidTestImplementation 'androidx.test:runner:1.1.1' -+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' implementation 'androidx.multidex:multidex:2.0.1' } --//apply plugin: 'com.google.gms.google-services' -+apply plugin: 'com.google.gms.google-services' + configurations.all { +- exclude group: 'com.google.android.gms' ++ //exclude group: 'com.google.android.gms' + } +\ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro -new file mode 100644 -index 00000000..40570865 ---- /dev/null +index d0e0fbc9..0a546da0 100644 +--- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro -@@ -0,0 +1,41 @@ +@@ -1 +1,42 @@ +--keep class net.sqlcipher.** { *; } +\ No newline at end of file +-optimizationpasses 5 +## Flutter wrapper ++-keep class net.sqlcipher.** { *; } +-keep class io.flutter.app.** { *; } +-keep class io.flutter.plugin.** { *; } +-keep class io.flutter.util.** { *; } @@ -100,43 +91,26 @@ index d9930f55..510e9845 100644 } -*/ \ No newline at end of file -diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt -index 1afc4606..894d1571 100644 ---- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt -+++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt -@@ -7,13 +7,11 @@ import android.content.Context - import androidx.multidex.MultiDex - - class MainActivity : FlutterActivity() { -- - override fun attachBaseContext(base: Context) { - super.attachBaseContext(base) - MultiDex.install(this) - } - -- - override fun provideFlutterEngine(context: Context): FlutterEngine? { - return provideEngine(this) - } -diff --git a/android/build.gradle b/android/build.gradle -index 85aa8647..3b7e09e7 100644 ---- a/android/build.gradle -+++ b/android/build.gradle -@@ -8,7 +8,7 @@ buildscript { - dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" -- //classpath 'com.google.gms:google-services:4.3.8' -+ classpath 'com.google.gms:google-services:4.3.8' - } +diff --git a/android/settings.gradle b/android/settings.gradle +index b2fd960a..fdb01a4d 100644 +--- a/android/settings.gradle ++++ b/android/settings.gradle +@@ -20,7 +20,7 @@ plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.1.2" apply false + id "org.jetbrains.kotlin.android" version "1.8.0" apply false +- // id "com.google.gms.google-services" version "4.3.8" apply false ++ id "com.google.gms.google-services" version "4.3.8" apply false } + include ":app" +\ No newline at end of file diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart -index cd79b0ab..c2db0f1e 100644 +index 1ba2659a..989f458e 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -39,7 +39,7 @@ import '../config/setting_keys.dart'; - import 'famedlysdk_store.dart'; + import '../widgets/matrix.dart'; import 'platform_infos.dart'; -//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; @@ -144,7 +118,7 @@ index cd79b0ab..c2db0f1e 100644 class NoTokenException implements Exception { String get cause => 'Cannot get firebase token'; -@@ -65,7 +65,7 @@ class BackgroundPush { +@@ -64,7 +64,7 @@ class BackgroundPush { final pendingTests = >{}; @@ -154,15 +128,15 @@ index cd79b0ab..c2db0f1e 100644 DateTime? lastReceivedPush; diff --git a/pubspec.yaml b/pubspec.yaml -index 6999d0b8..b2c9144f 100644 +index fb3e3ca4..039b2ccc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: - email_validator: ^2.0.1 - emoji_picker_flutter: ^1.1.2 - encrypt: ^5.0.1 + dynamic_color: ^1.7.0 + emoji_picker_flutter: ^3.1.0 + emojis: ^0.9.9 - #fcm_shared_isolate: ^0.1.0 + fcm_shared_isolate: ^0.1.0 - file_picker_cross: ^4.6.0 + file_picker: ^8.1.2 + file_selector: ^1.0.3 flutter: - sdk: flutter diff --git a/scripts/integration-check-release-build.sh b/scripts/integration-check-release-build.sh new file mode 100755 index 0000000000..5e329189fe --- /dev/null +++ b/scripts/integration-check-release-build.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# generate a temporary signing key adn apply its configuration +cd android +KEYFILE="$(pwd)/key.jks" +echo "Generating signing configuration with $KEYFILE..." +keytool -genkey -keyalg RSA -alias key -keysize 4096 -dname "cn=FluffyChat CI, ou=Head of bad integration tests, o=FluffyChat HQ, c=TLH" -keypass FLUFFYCHAT -storepass FLUFFYCHAT -validity 1 -keystore "$KEYFILE" -storetype "pkcs12" +echo "storePassword=FLUFFYCHAT" >> key.properties +echo "keyPassword=FLUFFYCHAT" >> key.properties +echo "keyAlias=key" >> key.properties +echo "storeFile=$KEYFILE" >> key.properties +ls | grep key +cd .. + +# build release mode APK +flutter pub get +flutter build apk --release + +# install and launch APK +flutter install +adb shell am start -n chat.fluffy.fluffychat/chat.fluffy.fluffychat.MainActivity + +sleep 5 + +# check whether FluffyChat runs +adb shell ps | awk '{print $9}' | grep chat.fluffy.fluffychat diff --git a/scripts/integration-create-environment-variables.sh b/scripts/integration-create-environment-variables.sh new file mode 100755 index 0000000000..d2b3a8fe1c --- /dev/null +++ b/scripts/integration-create-environment-variables.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +export USER1_NAME="alice" +export USER1_PW="AliceInWonderland" +export USER2_NAME="bob" +export USER2_PW="JoWirSchaffenDas" diff --git a/scripts/integration-prepare-homeserver.sh b/scripts/integration-prepare-homeserver.sh new file mode 100755 index 0000000000..6bbee117b4 --- /dev/null +++ b/scripts/integration-prepare-homeserver.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +if [ -z $HOMESERVER ]; then + echo "Please ensure HOMESERVER environment variable is set to the IP or hostname of the homeserver." + exit 1 +fi +if [ -z $USER1_NAME ]; then + echo "Please ensure USER1_NAME environment variable is set to first user name." + exit 1 +fi +if [ -z $USER1_PW ]; then + echo "Please ensure USER1_PW environment variable is set to first user password." + exit 1 +fi +if [ -z $USER2_NAME ]; then + echo "Please ensure USER2_NAME environment variable is set to second user name." + exit 1 +fi +if [ -z $USER2_PW ]; then + echo "Please ensure USER2_PW environment variable is set to second user password." + exit 1 +fi + +echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" + +while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do + sleep 2 +done + +echo "Homeserver is up." + +# create users + +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" + +usertoken1=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/login" -H "Content-Type: application/json" -d "{\"type\": \"m.login.password\", \"identifier\": {\"type\": \"m.id.user\",\"user\": \"$USER1_NAME\"},\"password\":\"$USER1_PW\"}" | jq -r '.access_token') +usertoken2=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/login" -H "Content-Type: application/json" -d "{\"type\": \"m.login.password\", \"identifier\": {\"type\": \"m.id.user\",\"user\": \"$USER2_NAME\"},\"password\":\"$USER2_PW\"}" | jq -r '.access_token') + + +# get usernames' mxids +mxid1=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/account/whoami" -H "Authorization: Bearer $usertoken1" | jq -r .user_id) +mxid2=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/account/whoami" -H "Authorization: Bearer $usertoken2" | jq -r .user_id) + +# setting the display name to username +curl -fS --retry 3 -XPUT -d "{\"displayname\":\"$USER1_NAME\"}" "http://$HOMESERVER/_matrix/client/v3/profile/$mxid1/displayname" -H "Authorization: Bearer $usertoken1" +curl -fS --retry 3 -XPUT -d "{\"displayname\":\"$USER2_NAME\"}" "http://$HOMESERVER/_matrix/client/v3/profile/$mxid2/displayname" -H "Authorization: Bearer $usertoken2" + +echo "Set display names" + +# create new room to invite user too +roomID=$(curl --retry 3 --silent --fail -XPOST -d "{\"name\":\"$USER2_NAME\", \"is_direct\": true}" "http://$HOMESERVER/_matrix/client/r0/createRoom?access_token=$usertoken2" | jq -r '.room_id') +echo "Created room '$roomID'" + +# send message in created room +curl --retry 3 --fail --silent -XPOST -d '{"msgtype":"m.text", "body":"joined room successfully"}' "http://$HOMESERVER/_matrix/client/r0/rooms/$roomID/send/m.room.message?access_token=$usertoken2" +echo "Sent message" + +curl -fS --retry 3 -XPOST -d "{\"user_id\":\"$mxid1\"}" "http://$HOMESERVER/_matrix/client/r0/rooms/$roomID/invite?access_token=$usertoken2" +echo "Invited $USER1_NAME" diff --git a/scripts/integration-prepare-host.sh b/scripts/integration-prepare-host.sh new file mode 100755 index 0000000000..f110aab729 --- /dev/null +++ b/scripts/integration-prepare-host.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +if ! command -v apk &>/dev/null; then + apt update && apt install -y -qq docker.io ldnsutils grep scrcpy ffmpeg +else + apk update && apk add docker drill grep scrcpy ffmpeg +fi diff --git a/scripts/integration-server-conduit.sh b/scripts/integration-server-conduit.sh new file mode 100755 index 0000000000..f4b031f566 --- /dev/null +++ b/scripts/integration-server-conduit.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +docker run -d \ + -e CONDUIT_SERVER_NAME="localhost" \ + -e CONDUIT_PORT="8008" \ + -e CONDUIT_DATABASE_BACKEND="rocksdb" \ + -e CONDUIT_ALLOW_REGISTRATION=true \ + -e CONDUIT_ALLOW_FEDERATION=true \ + -e CONDUIT_MAX_REQUEST_SIZE="20000000" \ + -e CONDUIT_TRUSTED_SERVERS="[\"conduit.rs\"]" \ + -e CONDUIT_MAX_CONCURRENT_REQUESTS="100" \ + -e CONDUIT_LOG="info,rocket=off,_=off,sled=off" \ + --name conduit -p 80:8008 matrixconduit/matrix-conduit:latest diff --git a/scripts/integration-server-dendrite.sh b/scripts/integration-server-dendrite.sh new file mode 100755 index 0000000000..ee23da1912 --- /dev/null +++ b/scripts/integration-server-dendrite.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +chown -R 991:991 integration_test/dendrite + +# creating integration test SSL certificates +docker run --rm --entrypoint="" \ + --volume="$(pwd)/integration_test/dendrite/data":/mnt:rw \ + matrixdotorg/dendrite-monolith:latest \ + /usr/bin/generate-keys \ + -private-key /mnt/matrix_key.pem \ + -tls-cert /mnt/server.crt \ + -tls-key /mnt/server.key + +docker run -d --volume="$(pwd)/integration_test/dendrite/data":/etc/dendrite:rw \ + --name dendrite -p 80:8008 matrixdotorg/dendrite-monolith:latest -really-enable-open-registration diff --git a/scripts/integration-server-synapse.sh b/scripts/integration-server-synapse.sh new file mode 100755 index 0000000000..03d21847a0 --- /dev/null +++ b/scripts/integration-server-synapse.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +docker run -d --name synapse --tmpfs /data \ + --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ + --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ + -p 80:80 matrixdotorg/synapse:latest diff --git a/scripts/integration-start-avd.sh b/scripts/integration-start-avd.sh new file mode 100755 index 0000000000..fb608e4407 --- /dev/null +++ b/scripts/integration-start-avd.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +chmod 777 -R /dev/kvm +adb start-server +emulator -avd test -wipe-data -no-audio -no-boot-anim -no-window -accel on -gpu swiftshader_indirect diff --git a/scripts/open-mr.sh b/scripts/open-mr.sh deleted file mode 100755 index 4af2c71288..0000000000 --- a/scripts/open-mr.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -ve - -# source: https://about.gitlab.com/blog/2017/09/05/how-to-automatically-create-a-new-mr-on-gitlab-with-gitlab-ci/ - -# Extract the host where the server is running, and add the URL to the APIs -[[ $HOST =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/" - -# Look which is the default branch -TARGET_BRANCH=`curl --silent "${HOST}${CI_PROJECT_ID}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" | python3 -c "import sys, json; print(json.load(sys.stdin)['default_branch'])"`; - -# The description of our new MR, we want to remove the branch after the MR has -# been closed -BODY="{ - \"id\": ${CI_PROJECT_ID}, - \"source_branch\": \"${UPDATE_BRANCH}\", - \"target_branch\": \"${TARGET_BRANCH}\", - \"remove_source_branch\": true, - \"title\": \"chore: automated dependency update\" -}"; - -# Require a list of all the merge request and take a look if there is already -# one with the same source branch -LISTMR=`curl --silent "${HOST}${CI_PROJECT_ID}/merge_requests?state=opened" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}"`; -COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${UPDATE_BRANCH}\"" | wc -l`; - -# No MR found, let's create a new one -if [ ${COUNTBRANCHES} -eq "0" ]; then - curl -X POST "${HOST}${CI_PROJECT_ID}/merge_requests" \ - --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \ - --header "Content-Type: application/json" \ - --data "${BODY}"; - - echo "Opened a new dependency update MR." - exit; -fi - -echo "No new merge request opened."; diff --git a/scripts/package-windows.ps1 b/scripts/package-windows.ps1 new file mode 100644 index 0000000000..b3ba0e70a5 --- /dev/null +++ b/scripts/package-windows.ps1 @@ -0,0 +1,5 @@ +Write-Output "$WINDOWN_PFX" +Move-Item -Path $WINDOWS_PFX -Destination fluffychat.pem +certutil -decode fluffychat.pem fluffychat.pfx + +flutter pub run msix:create -c fluffychat.pfx -p $WINDOWS_PFX_PASS --sign-msix true --install-certificate false diff --git a/scripts/prepare-android-release.sh b/scripts/prepare-android-release.sh index 8204f7ca13..a2a11dcb1c 100755 --- a/scripts/prepare-android-release.sh +++ b/scripts/prepare-android-release.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash -git apply ./scripts/enable-android-google-services.patch cd android echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks echo "storePassword=${FDROID_KEY_PASS}" >> key.properties diff --git a/scripts/prepare-fdroid.sh b/scripts/prepare-fdroid.sh new file mode 100755 index 0000000000..f9384b0f0c --- /dev/null +++ b/scripts/prepare-fdroid.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +cp -r android/fastlane fdroid/metadata/chat.fluffy.fluffychat +cd fdroid +echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks +echo $FDROID_NIGHTLY_KEY | base64 --decode --ignore-garbage > key.nightly.jks +echo "keypass=\"${FDROID_KEY_PASS}\"" >> config.stable.py +echo "keystorepass=\"${FDROID_KEY_PASS}\"" >> config.stable.py +echo "keypass=\"${FDROID_NIGHTLY_KEY_PASS}\"" >> config.nightly.py +echo "keystorepass=\"${FDROID_NIGHTLY_KEY_PASS}\"" >> config.nightly.py +chmod 600 config.stable.py key.jks config.nightly.py key.nightly.jks +cd .. diff --git a/scripts/prepare-macos.sh b/scripts/prepare-macos.sh new file mode 100755 index 0000000000..95f2a9cff3 --- /dev/null +++ b/scripts/prepare-macos.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +if ! type "flutter" > /dev/null; then + brew install flutter +fi + +brew install libolm + diff --git a/scripts/prepare-web.sh b/scripts/prepare-web.sh index 2c05a2030d..70b15a246a 100755 --- a/scripts/prepare-web.sh +++ b/scripts/prepare-web.sh @@ -1,6 +1,10 @@ #!/bin/sh -ve rm -r assets/js/package -cd assets/js/ && curl -L 'https://gitlab.com/famedly/company/frontend/libraries/olm/-/jobs/artifacts/master/download?job=build:js' > olm.zip && cd ../../ + +OLM_VERSION=$(cat pubspec.yaml | yq .dependencies.flutter_olm) +DOWNLOAD_PATH="https://github.com/famedly/olm/releases/download/v$OLM_VERSION/olm.zip" + +cd assets/js/ && curl -L $DOWNLOAD_PATH > olm.zip && cd ../../ cd assets/js/ && unzip olm.zip && cd ../../ cd assets/js/ && rm olm.zip && cd ../../ cd assets/js/ && mv javascript package && cd ../../ diff --git a/scripts/prepare-windows.ps1 b/scripts/prepare-windows.ps1 index 7b749091f4..97451b44f4 100644 --- a/scripts/prepare-windows.ps1 +++ b/scripts/prepare-windows.ps1 @@ -1,3 +1,5 @@ -choco install flutter -y +choco install flutter cmake --installargs 'ADD_CMAKE_TO_PATH=System' -y Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" -refreshenv \ No newline at end of file +refreshenv + +flutter config --no-analytics diff --git a/scripts/release-ios-testflight.sh b/scripts/release-ios-testflight.sh index f536702ceb..e3f1a109ac 100755 --- a/scripts/release-ios-testflight.sh +++ b/scripts/release-ios-testflight.sh @@ -1,10 +1,12 @@ #!/bin/sh -ve git apply ./scripts/enable-android-google-services.patch +rm -rf fonts/NotoEmoji +yq -i 'del( .flutter.fonts[] | select(.family == "NotoEmoji") )' pubspec.yaml flutter clean flutter pub get cd ios rm -rf Pods -rm Podfile.lock +rm -f Podfile.lock arch -x86_64 pod install arch -x86_64 pod update cd .. diff --git a/scripts/release-playstore-beta.sh b/scripts/release-playstore-beta.sh deleted file mode 100755 index 7d4dcd4b0a..0000000000 --- a/scripts/release-playstore-beta.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -flutter pub get -flutter build appbundle --target-platform android-arm,android-arm64,android-x64 -mkdir -p build/android -cp build/app/outputs/bundle/release/app-release.aab build/android/ -cd android -bundle install -bundle update fastlane -bundle exec fastlane deploy_internal_test -cd .. diff --git a/scripts/release-playstore.sh b/scripts/release-playstore.sh deleted file mode 100755 index f78d38cb5f..0000000000 --- a/scripts/release-playstore.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -ve -RELEASE_TYPE=$(echo $CI_COMMIT_TAG | grep -oE "[a-z]+") -cd android -if [ "$RELEASE_TYPE" = "rc" ]; then - bundle exec fastlane deploy_candidate -else - bundle exec fastlane deploy_release -fi -cd .. diff --git a/snap/gui/fluffychat.desktop b/snap/gui/fluffychat.desktop new file mode 100755 index 0000000000..886148753b --- /dev/null +++ b/snap/gui/fluffychat.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=FluffyChat +GenericName=Matrix Client +Comment=Chat with your friends +Exec=fluffychat +Icon=${SNAP}/meta/gui/fluffychat.png +Terminal=false +Type=Application +Categories=Network;Chat;InstantMessaging; diff --git a/snap/gui/fluffychat.png b/snap/gui/fluffychat.png new file mode 100644 index 0000000000..e007649396 Binary files /dev/null and b/snap/gui/fluffychat.png differ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000000..87efdcd887 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,110 @@ +name: fluffychat +title: FluffyChat +base: core24 +version: git +license: AGPL-3.0 +summary: The cutest messenger in the Matrix network +description: | + FluffyChat is an open source, nonprofit and cute matrix messenger app. The app is easy to use but secure and decentralized. + + + ## Features + + - Send all kinds of messages, images and files + - Voice messages + - Location sharing + - Push notifications + - Unlimited private and public group chats + - Public channels with thousands of participants + - Feature rich group moderation including all matrix features + - Discover and join public groups + - Dark mode + - Hides complexity of Matrix IDs behind simple QR codes + - Custom emotes and stickers + - Video calls via sharing links to Jitsi + - Spaces + - Compatible with Element, Nheko, NeoChat and all other Matrix apps + - End to end encryption + - Emoji verification & cross signing + - And much more... + + + ## FluffyChat comes with a dream + + Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends. + + A world where there are no companies spying on you when you send selfies to friends and lovers. + + And a world where apps are made for fluffyness and not for profit. ♥ + + Join the community: https://matrix.to/#/#fluffychat:matrix.org + Website: http://fluffychat.im + Microblog: https://mastodon.art/@krille + +grade: stable +confinement: strict + +platforms: + amd64: + build-on: amd64 + arm64: + build-on: arm64 + +parts: + olm: + plugin: cmake + cmake-parameters: + - -DCMAKE_INSTALL_PREFIX=/usr + source: https://gitlab.matrix.org/matrix-org/olm.git + source-type: git + source-tag: '3.2.14' + build-packages: + - g++ + + fluffychat: + plugin: flutter + source: . + override-build: | + # Workaround for Flutter build error: + rm -rf build + craftctl default + build-packages: + - libsecret-1-dev + - libjsoncpp-dev + - libssl-dev + - curl + stage-packages: + - libsecret-1-0 + - libjsoncpp25 + +slots: + dbus-svc: + interface: dbus + bus: session + name: chat.fluffy.fluffychat + +apps: + fluffychat: + command: fluffychat + extensions: [ gnome ] + plugs: + - audio-playback + - desktop + - desktop-legacy + - home + - network + - network-manager + - network-manager-observe + - opengl + - removable-media + - browser-support + - password-manager-service + slots: + - dbus-svc + # Workaround for: + # https://github.com/flutter-webrtc/flutter-webrtc/issues/1212#issuecomment-1611899344 + environment: + XDG_DATA_HOME: $SNAP_USER_DATA + XDG_DATA_DIRS: $SNAP/usr/share + GDK_GL: gles + LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET" \ No newline at end of file diff --git a/test/command_hint_test.dart b/test/command_hint_test.dart index b94732373f..e56f060524 100644 --- a/test/command_hint_test.dart +++ b/test/command_hint_test.dart @@ -15,9 +15,11 @@ void main() async { final commands = (await prepareTestClient()).commands.keys; final missing = commands.where((c) => !translated.contains(c)).toList(); - expect(0, missing.length, - reason: 'missing hints for ' + - missing.toString() + - '\nAdding hints? See scripts/generate_command_hints_glue.sh'); + expect( + 0, + missing.length, + reason: + 'missing hints for $missing\nAdding hints? See scripts/generate_command_hints_glue.sh', + ); }); } diff --git a/test/utils/test_client.dart b/test/utils/test_client.dart index ac9bacf4a6..7cbe72f718 100644 --- a/test/utils/test_client.dart +++ b/test/utils/test_client.dart @@ -1,8 +1,9 @@ +// ignore_for_file: depend_on_referenced_packages + import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_api_lite/fake_matrix_api.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart'; Future prepareTestClient({ bool loggedIn = false, @@ -12,7 +13,8 @@ Future prepareTestClient({ homeserver ??= Uri.parse('https://fakeserver.notexisting'); final client = Client( 'FluffyChat Widget Tests', - httpClient: FakeMatrixApi(), + httpClient: FakeMatrixApi() + ..api['GET']!['/.well-known/matrix/client'] = (req) => {}, verificationMethods: { KeyVerificationMethod.numbers, KeyVerificationMethod.emoji, @@ -23,7 +25,7 @@ Future prepareTestClient({ databaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, supportedLoginTypes: { AuthenticationTypes.password, - AuthenticationTypes.sso + AuthenticationTypes.sso, }, ); await client.checkHomeserver(homeserver); diff --git a/test_driver/integration_test.dart b/test_driver/integration_test.dart deleted file mode 100644 index b38629cca9..0000000000 --- a/test_driver/integration_test.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:integration_test/integration_test_driver.dart'; - -Future main() => integrationDriver(); diff --git a/web/auth.html b/web/auth.html index 9e0e115c04..806485b73a 100644 --- a/web/auth.html +++ b/web/auth.html @@ -1,14 +1,13 @@ - - Authentication complete - - -

Authentication is complete. If this does not happen automatically, please - close the window. - - + } else { + localStorage.setItem('flutter-web-auth-2', window.location.href); + } + window.close(); + \ No newline at end of file diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index 3781c0638f..6003f5cf7a 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index 8b824e807a..f652f244ac 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/index.html b/web/index.html index 4bf6331c62..82e54d2c40 100644 --- a/web/index.html +++ b/web/index.html @@ -11,15 +11,18 @@ For more details: * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base + + This is a placeholder for base href that will be replaced by the value of + the `--base-href` argument provided to `flutter build`. --> - + - + @@ -30,80 +33,39 @@ FluffyChat - - - + + + + - if ('serviceWorker' in navigator) { - // Service workers are supported. Use them. - window.addEventListener('load', function () { - // Wait for registration to finish before dropping the - - - + + diff --git a/web/splash/style.css b/web/splash/style.css index 455b79370a..6654d94e6d 100644 --- a/web/splash/style.css +++ b/web/splash/style.css @@ -1,8 +1,8 @@ -body, html { - margin:0; - height:100%; +body, +html { + margin: 0; + height: 100%; background: #ffffff; - background-image: url("img/light-background.png"); background-size: 100% 100%; } @@ -16,28 +16,30 @@ body, html { } .contain { - display:block; - width:100%; height:100%; + display: block; + width: 100%; + height: 100%; object-fit: contain; } .stretch { - display:block; - width:100%; height:100%; + display: block; + width: 100%; + height: 100%; } .cover { - display:block; - width:100%; height:100%; + display: block; + width: 100%; + height: 100%; object-fit: cover; } @media (prefers-color-scheme: dark) { body { - margin:0; - height:100%; + margin: 0; + height: 100%; background: #000000; - background-image: url("img/dark-background.png"); background-size: 100% 100%; } -} +} \ No newline at end of file diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index a18ebc9deb..1c2b994514 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -1,13 +1,16 @@ -cmake_minimum_required(VERSION 3.15) +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) project(fluffychat LANGUAGES CXX) +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. set(BINARY_NAME "fluffychat") +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. cmake_policy(SET CMP0063 NEW) -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Configure build options. +# Define build configuration option. get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(IS_MULTICONFIG) set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" @@ -20,7 +23,7 @@ else() "Debug" "Profile" "Release") endif() endif() - +# Define settings for the Profile build mode. set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") @@ -30,6 +33,10 @@ set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") add_definitions(-DUNICODE -D_UNICODE) # Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. function(APPLY_STANDARD_SETTINGS TARGET) target_compile_features(${TARGET} PUBLIC cxx_std_17) target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") @@ -38,12 +45,11 @@ function(APPLY_STANDARD_SETTINGS TARGET) target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") endfunction() -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - # Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") add_subdirectory(${FLUTTER_MANAGED_DIR}) -# Application build +# Application build; see runner/CMakeLists.txt. add_subdirectory("runner") # Generated plugin build rules, which manage building the plugins and adding diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index 744f08a938..930d2071a3 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.15) +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") @@ -23,6 +24,7 @@ list(APPEND FLUTTER_LIBRARY_HEADERS "flutter_windows.h" "flutter_messenger.h" "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" ) list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") add_library(flutter INTERFACE) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 56ab0b39e7..eb0b6129f5 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,24 +6,48 @@ #include "generated_plugin_registrant.h" -#include #include -#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { - ConnectivityPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); DesktopDropPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("DesktopDropPlugin")); - DesktopLifecyclePluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("DesktopLifecyclePlugin")); + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); + EmojiPickerFlutterPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); FlutterWebRTCPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + PasteboardPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PasteboardPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + Sqlite3FlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowToFrontPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowToFrontPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b337d49a15..627fe7248a 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,12 +3,20 @@ # list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus_windows desktop_drop - desktop_lifecycle + dynamic_color + emoji_picker_flutter + file_selector_windows flutter_secure_storage_windows flutter_webrtc + geolocator_windows + pasteboard + permission_handler_windows + record_windows + share_plus + sqlcipher_flutter_libs url_launcher_windows + window_to_front ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index 977e38b5d1..b9e550fba8 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -1,18 +1,32 @@ -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.14) project(runner LANGUAGES CXX) +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. add_executable(${BINARY_NAME} WIN32 "flutter_window.cpp" "main.cpp" - "run_loop.cpp" "utils.cpp" "win32_window.cpp" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" "Runner.rc" "runner.exe.manifest" ) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. apply_standard_settings(${BINARY_NAME}) + +# Disable Windows macros that collide with C++ standard library functions. target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 7951cb5091..52aa4877ac 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "chat.fluffy" "\0" - VALUE "FileDescription", "A new Flutter project." "\0" + VALUE "FileDescription", "fluffychat" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "FluffyChat" "\0" - VALUE "LegalCopyright", "Copyright (C) 2020 chat.fluffy. All rights reserved." "\0" + VALUE "InternalName", "fluffychat" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 chat.fluffy. All rights reserved." "\0" VALUE "OriginalFilename", "fluffychat.exe" "\0" - VALUE "ProductName", "FluffyChat" "\0" + VALUE "ProductName", "fluffychat" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp index c422723045..b43b9095ea 100644 --- a/windows/runner/flutter_window.cpp +++ b/windows/runner/flutter_window.cpp @@ -4,9 +4,8 @@ #include "flutter/generated_plugin_registrant.h" -FlutterWindow::FlutterWindow(RunLoop* run_loop, - const flutter::DartProject& project) - : run_loop_(run_loop), project_(project) {} +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} FlutterWindow::~FlutterWindow() {} @@ -26,14 +25,12 @@ bool FlutterWindow::OnCreate() { return false; } RegisterPlugins(flutter_controller_->engine()); - run_loop_->RegisterFlutterInstance(flutter_controller_->engine()); SetChildContent(flutter_controller_->view()->GetNativeWindow()); return true; } void FlutterWindow::OnDestroy() { if (flutter_controller_) { - run_loop_->UnregisterFlutterInstance(flutter_controller_->engine()); flutter_controller_ = nullptr; } @@ -44,7 +41,7 @@ LRESULT FlutterWindow::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opporutunity to handle window messages. + // Give Flutter, including plugins, an opportunity to handle window messages. if (flutter_controller_) { std::optional result = flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h index b663ddd501..6da0652f05 100644 --- a/windows/runner/flutter_window.h +++ b/windows/runner/flutter_window.h @@ -6,16 +6,13 @@ #include -#include "run_loop.h" #include "win32_window.h" // A window that does nothing but host a Flutter view. class FlutterWindow : public Win32Window { public: - // Creates a new FlutterWindow driven by the |run_loop|, hosting a - // Flutter view running |project|. - explicit FlutterWindow(RunLoop* run_loop, - const flutter::DartProject& project); + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); virtual ~FlutterWindow(); protected: @@ -26,9 +23,6 @@ class FlutterWindow : public Win32Window { LPARAM const lparam) noexcept override; private: - // The run loop driving events for this window. - RunLoop* run_loop_; - // The project to run. flutter::DartProject project_; diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 553f9c0fd7..3c2f3ab5e8 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -3,7 +3,6 @@ #include #include "flutter_window.h" -#include "run_loop.h" #include "utils.h" int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, @@ -18,10 +17,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, // plugins. ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - RunLoop run_loop; - flutter::DartProject project(L"data"); - FlutterWindow window(&run_loop, project); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); if (!window.CreateAndShow(L"FluffyChat", origin, size)) { @@ -29,7 +32,11 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, } window.SetQuitOnClose(true); - run_loop.Run(); + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } ::CoUninitialize(); return EXIT_SUCCESS; diff --git a/windows/runner/run_loop.cpp b/windows/runner/run_loop.cpp deleted file mode 100644 index f23c5f2169..0000000000 --- a/windows/runner/run_loop.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "run_loop.h" - -#include - -#include - -RunLoop::RunLoop() {} - -RunLoop::~RunLoop() {} - -void RunLoop::Run() { - MSG msg; - while (GetMessage(&msg, nullptr, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } -} - -void RunLoop::RegisterFlutterInstance( - flutter::FlutterEngine* flutter_instance) { - flutter_instances_.insert(flutter_instance); -} - -void RunLoop::UnregisterFlutterInstance( - flutter::FlutterEngine* flutter_instance) { - flutter_instances_.erase(flutter_instance); -} - -RunLoop::TimePoint RunLoop::ProcessFlutterMessages() { - TimePoint next_event_time = TimePoint::max(); - for (auto instance : flutter_instances_) { - std::chrono::nanoseconds wait_duration = instance->ProcessMessages(); - if (wait_duration != std::chrono::nanoseconds::max()) { - next_event_time = - std::min(next_event_time, TimePoint::clock::now() + wait_duration); - } - } - return next_event_time; -} diff --git a/windows/runner/run_loop.h b/windows/runner/run_loop.h deleted file mode 100644 index 000d362463..0000000000 --- a/windows/runner/run_loop.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef RUNNER_RUN_LOOP_H_ -#define RUNNER_RUN_LOOP_H_ - -#include - -#include -#include - -// A runloop that will service events for Flutter instances as well -// as native messages. -class RunLoop { - public: - RunLoop(); - ~RunLoop(); - - // Prevent copying - RunLoop(RunLoop const&) = delete; - RunLoop& operator=(RunLoop const&) = delete; - - // Runs the run loop until the application quits. - void Run(); - - // Registers the given Flutter instance for event servicing. - void RegisterFlutterInstance( - flutter::FlutterEngine* flutter_instance); - - // Unregisters the given Flutter instance from event servicing. - void UnregisterFlutterInstance( - flutter::FlutterEngine* flutter_instance); - - private: - using TimePoint = std::chrono::steady_clock::time_point; - - // Processes all currently pending messages for registered Flutter instances. - TimePoint ProcessFlutterMessages(); - - std::set flutter_instances_; -}; - -#endif // RUNNER_RUN_LOOP_H_ diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp index 37501e5db7..f5bf9fa0f5 100644 --- a/windows/runner/utils.cpp +++ b/windows/runner/utils.cpp @@ -20,3 +20,45 @@ void CreateAndAttachConsole() { FlutterDesktopResyncOutputStreams(); } } + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h index d792603bb1..3879d54755 100644 --- a/windows/runner/utils.h +++ b/windows/runner/utils.h @@ -1,8 +1,19 @@ #ifndef RUNNER_UTILS_H_ #define RUNNER_UTILS_H_ +#include +#include + // Creates a console for the process, and redirects stdout and stderr to // it for both the runner and the Flutter library. void CreateAndAttachConsole(); +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + #endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index efc3eb9f22..c10f08dc7d 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -173,7 +173,7 @@ Win32Window::MessageHandler(HWND hwnd, return 0; } - case WM_SIZE: + case WM_SIZE: { RECT rect = GetClientArea(); if (child_content_ != nullptr) { // Size and position the child window. @@ -181,6 +181,7 @@ Win32Window::MessageHandler(HWND hwnd, rect.bottom - rect.top, TRUE); } return 0; + } case WM_ACTIVATE: if (child_content_ != nullptr) {